51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
|
import {
|
||
|
assertionFrom,
|
||
|
stringify,
|
||
|
Assertable,
|
||
|
Assertion,
|
||
|
Dictionary,
|
||
|
Facet,
|
||
|
Ref,
|
||
|
Turn,
|
||
|
} from '@syndicate-lang/core';
|
||
|
|
||
|
export message type LogEntry(timestamp: string, detail: Dictionary<Ref>) = Symbol.for('log');
|
||
|
|
||
|
export let logTarget: Ref | null = null;
|
||
|
export let logId: Assertion | null = null;
|
||
|
export let logService: Assertion | null = null;
|
||
|
export let logFacet: Facet | null = null;
|
||
|
|
||
|
export function setupLog(target: Ref, id?: Assertable, service?: Assertable) {
|
||
|
logTarget = target;
|
||
|
logId = (id !== null && id !== void 0) ? assertionFrom(id) : null;
|
||
|
logService = (service !== null && service !== void 0) ? assertionFrom(service) : null;
|
||
|
logFacet = Turn.activeFacet;
|
||
|
}
|
||
|
|
||
|
export function log(... values: Assertable[]) {
|
||
|
console.log(... values);
|
||
|
logValues(values);
|
||
|
}
|
||
|
|
||
|
export function logValues(values: Assertable[]) {
|
||
|
if (logFacet !== null && logFacet.isLive) {
|
||
|
logFacet.turn(() => {
|
||
|
if (logTarget === null) return;
|
||
|
at logTarget {
|
||
|
const d = new Dictionary<Ref>();
|
||
|
if (logId !== null) d.set(Symbol.for('pid'), logId);
|
||
|
if (logService !== null) d.set(Symbol.for('service'), logService);
|
||
|
d.set(Symbol.for('line'), values.map(v => typeof(v) === 'string' ? v : stringify(v)).join(' '));
|
||
|
send message LogEntry((new Date()).toISOString(), d);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const oldConsoleError = console.error;
|
||
|
console.error = (... values: any[]) => {
|
||
|
oldConsoleError(... values);
|
||
|
logValues(['ERROR', ... values.map(v => '' + v)]);
|
||
|
};
|