From 84ee4007f4c76ae44a9523943707c6a512c72566 Mon Sep 17 00:00:00 2001 From: benStre Date: Sat, 10 Feb 2024 21:16:53 +0100 Subject: [PATCH 1/6] handle circular message logging/stream updates --- compiler/compiler.ts | 4 +++- utils/message_logger.ts | 18 +++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/compiler/compiler.ts b/compiler/compiler.ts index 4508db1e..c233b072 100644 --- a/compiler/compiler.ts +++ b/compiler/compiler.ts @@ -5189,7 +5189,9 @@ export class Compiler { // insert another value else SCOPE.buffer = Compiler.compileValue(value, {}, false); - controller.enqueue(await Compiler.createBlockFromScope(SCOPE)); + const buffer = await Compiler.createBlockFromScope(SCOPE); + (buffer as any)._is_stream = true; // internal flag, set when the outgoing message is a stream, used to prevent recursive stream logs + controller.enqueue(buffer); } // continue after stream, reset SCOPE to previous state diff --git a/utils/message_logger.ts b/utils/message_logger.ts index fd396292..dbb0650e 100644 --- a/utils/message_logger.ts +++ b/utils/message_logger.ts @@ -33,16 +33,17 @@ export class MessageLogger { if (!this.logger) this.logger = new Logger("DATEX Message"); IOHandler.onDatexReceived((header, dxb, socket)=>{ + const log = (dxb as any)._is_stream ? console.log : this.logger.raw.bind(this.logger); + // ignore incoming requests from own endpoint to own endpoint const receivers = header.routing?.receivers; const receiverIsOwnEndpoint = receivers instanceof Logical && receivers?.size == 1 && (receivers.has(Runtime.endpoint) || receivers.has(Runtime.endpoint.main)); if (!showRedirectedMessages && !receiverIsOwnEndpoint) return; if (header.sender == Runtime.endpoint && receiverIsOwnEndpoint && header.type != ProtocolDataType.RESPONSE && header.type != ProtocolDataType.DEBUGGER) return; - // ignore hello messages if (header.type == ProtocolDataType.HELLO || header.type == ProtocolDataType.GOODBYE) { - this.logger.plain(`\n#color(blue)◀── ${header.sender||'@*'} ${header.type!=undefined? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()}` : ''}`); + log(`${ESCAPE_SEQUENCES.BLUE}◀── ${header.sender||'@*'} ${header.type!=undefined? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()}` : ''}`); return; }; @@ -50,13 +51,16 @@ export class MessageLogger { if (content.trim() == "\x1b[38;2;219;45;129mvoid\x1b[39m;") return; // dont log void; messages content = - `\n${ESCAPE_SEQUENCES.BLUE}${receiverIsOwnEndpoint?'':Runtime.valueToDatexStringExperimental(receivers, false, false)+ ' '}◀── ${header.sender||'@*'} ${header.type!=undefined ? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()} ` : ''}`.padEnd(80, '─') + '\n' + `${ESCAPE_SEQUENCES.BLUE}${receiverIsOwnEndpoint?'':Runtime.valueToDatexStringExperimental(receivers, false, false)+ ' '}◀── ${header.sender||'@*'} ${header.type!=undefined ? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()} ` : ''}`.padEnd(80, '─') + '\n' + content + `\n${ESCAPE_SEQUENCES.BLUE}──────────────────────────────────────────────────────────────────────────\n`; - console.log(content) + log(content) }); IOHandler.onDatexSent((header, dxb, socket) => { + + const log = (dxb as any)._is_stream ? console.log : this.logger.raw.bind(this.logger); + // ignore outgoing responses from own endpoint to own endpoint const receivers = header.routing?.receivers; if (header.sender == Runtime.endpoint && (receivers instanceof Logical && receivers?.size == 1 && receivers.has(Runtime.endpoint)) && header.type != ProtocolDataType.RESPONSE && header.type != ProtocolDataType.DEBUGGER) return; @@ -65,7 +69,7 @@ export class MessageLogger { // ignore hello messages if (header.type == ProtocolDataType.HELLO || header.type == ProtocolDataType.GOODBYE) { - this.logger.plain(`\n#color(green)${header.sender||'@*'} ──▶ ${receivers||'@*'} ${header.type!=undefined ? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()}` : ''}`); + log(`${ESCAPE_SEQUENCES.GREEN}${header.sender||'@*'} ──▶ ${receivers||'@*'} ${header.type!=undefined ? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()}` : ''}`); return; }; @@ -73,11 +77,11 @@ export class MessageLogger { if (content.trim() == "\x1b[38;2;219;45;129mvoid\x1b[39m;") return; // dont log void; messages content = - `\n${ESCAPE_SEQUENCES.GREEN}${senderIsOwnEndpoint?'':Runtime.valueToDatexStringExperimental(header.sender, false, false)+' '}──▶ ${receivers||'@*'} ${header.type!=undefined ? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()} ` : ''}`.padEnd(80, '─') + '\n' + `${ESCAPE_SEQUENCES.GREEN}${senderIsOwnEndpoint?'':Runtime.valueToDatexStringExperimental(header.sender, false, false)+' '}──▶ ${receivers||'@*'} ${header.type!=undefined ? `(${ProtocolDataType[header.type]}) ` : ''}${socket ? `via ${socket.toString()} ` : ''}`.padEnd(80, '─') + '\n' + content + `\n${ESCAPE_SEQUENCES.GREEN}──────────────────────────────────────────────────────────────────────────\n`; - console.log(content); + log(content); }); } From 6a3d864a8d7ac25f07d7ebb299d383dd9913e1be Mon Sep 17 00:00:00 2001 From: benStre Date: Sat, 10 Feb 2024 21:17:17 +0100 Subject: [PATCH 2/6] update decompiler --- wasm/adapter/pkg/datex_wasm_bg.wasm | Bin 805968 -> 805994 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/wasm/adapter/pkg/datex_wasm_bg.wasm b/wasm/adapter/pkg/datex_wasm_bg.wasm index c6f42979a20e8e27cb11cdf7c52fe71873a03e57..78c62bee020917ac4cb76a2df52ebbbea0d3a38b 100644 GIT binary patch delta 92327 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 From 4aaad43f160f4ac4388a2cbbe23354e23394d38f Mon Sep 17 00:00:00 2001 From: benStre Date: Sat, 10 Feb 2024 21:17:48 +0100 Subject: [PATCH 3/6] add logger.raw method --- utils/logger.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/utils/logger.ts b/utils/logger.ts index ebb2aec7..49832279 100644 --- a/utils/logger.ts +++ b/utils/logger.ts @@ -401,11 +401,11 @@ export class Logger { if (this.origin) Logger.loggers_by_origin.get(this.origin)?.delete(this); } - private log(color: COLOR, text: string, data:any[], log_level:LOG_LEVEL = LOG_LEVEL.DEFAULT, only_log_own_stream = false, add_tag = true) { + private log(color: COLOR, text: string, data:any[], log_level:LOG_LEVEL = LOG_LEVEL.DEFAULT, only_log_own_stream = false, add_tag = true, raw = false) { if (this.production && (log_level < Logger.production_log_level)) return; // don't log for production if (!this.production && (log_level < Logger.development_log_level)) return; // don't log for development - const log_string = this.generateLogString(color, text, data, add_tag); + const log_string = raw ? text : this.generateLogString(color, text, data, add_tag); this.logRaw(log_string, log_level, only_log_own_stream); } @@ -743,6 +743,10 @@ export class Logger { this.log(console_theme == 'dark' ? COLOR.WHITE : COLOR.BLACK, this.normalizeLogText(text), data, LOG_LEVEL.DEFAULT, false, false) } + public raw(text:string) { + this.log(console_theme == 'dark' ? COLOR.WHITE : COLOR.BLACK, this.normalizeLogText(text), [], LOG_LEVEL.DEFAULT, false, false, true) + } + // does not have an effect in the native browser console or log streams with multiple logger inputs (intentionally) public clear(silent = false){ this.logRaw(ESCAPE_SEQUENCES.CLEAR, LOG_LEVEL.DEFAULT, true) @@ -898,8 +902,8 @@ export class Logger { } // stream for specific origins else { - for (let origin of filter_origins) { - for (let logger of this.loggers_by_origin.get(origin)??[]) { + for (const origin of filter_origins) { + for (const logger of this.loggers_by_origin.get(origin)??[]) { logger.out_streams.add(stream); if (!this.loggersForStream.has(stream)) this.loggersForStream.set(stream, new Set()); this.loggersForStream.get(stream)?.add(logger); From ad484eb7a2fc09baaeaf5d69c69381758795a6a9 Mon Sep 17 00:00:00 2001 From: benStre Date: Sat, 10 Feb 2024 21:18:37 +0100 Subject: [PATCH 4/6] disable streams for inactive points --- runtime/pointers.ts | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/runtime/pointers.ts b/runtime/pointers.ts index 52d901bd..d6c70336 100644 --- a/runtime/pointers.ts +++ b/runtime/pointers.ts @@ -3299,7 +3299,7 @@ export class Pointer extends Ref { this.subscribers.add(subscriber); if (this.subscribers.size == 1) this.updateGarbageCollection() // first subscriber - if (this.streaming.length) setTimeout(()=>this.startStreamOutForEndpoint(subscriber), 1000); // TODO do without timeout? + if (this.streaming.length) this.startStreamOutForEndpoint(subscriber) // setTimeout(()=>, 200); // TODO do without timeout? // force enable live mode also if primitive (subscriber is not handled a new observer) if (this.is_js_primitive) this.setForcedLiveTransform(true) @@ -3322,6 +3322,9 @@ export class Pointer extends Ref { this.updateGarbageCollection() } + // stop streaming + this.stopStreamOutForEndpoint(subscriber) + // remove from endpoint subscriptions map Pointer.#endpoint_subscriptions.get(subscriber)?.delete(this) if (Pointer.#endpoint_subscriptions.get(subscriber)?.size == 0) { @@ -3985,22 +3988,42 @@ export class Pointer extends Ref { this.streaming.push(true); // also stream for all future subscribers + // TODO: stream to multiple endpoints in single DXB block + // if (this.send_updates_to_origin) { + // logger.info("streaming to parent " + this.origin); + // this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, obj], this.origin) + // } + // if (this.update_endpoints.size) { + // logger.info("streaming to subscribers " + this.update_endpoints); + // this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, obj], this.update_endpoints) + // } + if (this.send_updates_to_origin) { - logger.info("streaming to parent " + this.origin); - this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, obj], this.origin) + this.startStreamOutForEndpoint(this.origin); } - if (this.update_endpoints.size) { - logger.info("streaming to subscribers " + this.update_endpoints); - this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, obj], this.update_endpoints) + for (const endpoint of this.update_endpoints) { + this.startStreamOutForEndpoint(endpoint); } } + #streamAbortControllers = new Map() + // TODO better way than streaming individually to every new subscriber? startStreamOutForEndpoint(endpoint:Endpoint) { + const abortController = new AbortController(); + this.#streamAbortControllers.set(endpoint, abortController); logger.info("streaming to new subscriber " + endpoint); - this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, this.current_val], endpoint) + this.handleDatexUpdate(null, '? << ?', [this, this.current_val], endpoint, undefined, abortController.signal) } + stopStreamOutForEndpoint(endpoint: Endpoint) { + if (this.#streamAbortControllers.has(endpoint)) { + logger.info("stopping streaming to subscriber " + endpoint); + this.#streamAbortControllers.get(endpoint)?.abort(); + this.#streamAbortControllers.delete(endpoint); + } + } + /** all values are removed */ handleClear() { @@ -4201,7 +4224,7 @@ export class Pointer extends Ref { // actual update to subscribers/origin // if identifier is set, further updates to the same identifier are overwritten - async handleDatexUpdate(identifier:string|null, datex:string|PrecompiledDXB, data:any[], receiver:endpoints, collapse_first_inserted = false){ + async handleDatexUpdate(identifier:string|null, datex:string|PrecompiledDXB, data:any[], receiver:endpoints, collapse_first_inserted = false, stream_abort_signal?: AbortSignal){ // let schedulter handle updates (cannot throw errors) if (this.#scheduler) { @@ -4212,7 +4235,7 @@ export class Pointer extends Ref { else { if (receiver instanceof Disjunction && !receiver.size) return; try { - await Runtime.datexOut([datex, data, {collapse_first_inserted, type:ProtocolDataType.UPDATE, preemptive_pointer_init: true}], receiver, undefined, false, undefined, undefined, false, this.datex_timeout); + await Runtime.datexOut([datex, data, {collapse_first_inserted, type:ProtocolDataType.UPDATE, preemptive_pointer_init: true, stream_abort_signal}], receiver, undefined, false, undefined, undefined, false, this.datex_timeout); } catch(e) { //throw e; console.error("forwarding failed", e, datex, data) From 94dfd4ccf526f8e716bdfd796842ce55e801bf12 Mon Sep 17 00:00:00 2001 From: benStre Date: Sat, 10 Feb 2024 21:20:05 +0100 Subject: [PATCH 5/6] change direct socket distance to 1 --- network/communication-interface.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/network/communication-interface.ts b/network/communication-interface.ts index 69f77001..266175b9 100644 --- a/network/communication-interface.ts +++ b/network/communication-interface.ts @@ -172,7 +172,7 @@ export abstract class CommunicationInterfaceSocket extends EventTarget { if (this.#connected) { if (!this.isRegistered) { this.dispatchEvent(new EndpointConnectEvent(this.#endpoint)) - communicationHub.handler.registerSocket(this as ConnectedCommunicationInterfaceSocket, undefined, {knownSince: this.#connectTimestamp, distance: 0}) + communicationHub.handler.registerSocket(this as ConnectedCommunicationInterfaceSocket, undefined, {knownSince: this.#connectTimestamp, distance: 1}) } } else { @@ -207,7 +207,7 @@ export abstract class CommunicationInterfaceSocket extends EventTarget { const successful = await this.send(dxb) if (!successful) { console.error("Failed to send block via " + this + (this.endpoint ? ` - ${this.endpoint}`: "") + " (channel broken). Disconnecting socket.") - // send was not succesful, meaning the channel is broken. Disconnect socket + // send was not successful, meaning the channel is broken. Disconnect socket this.dispatchEvent(new BrokenChannelEvent()) this.connected = false } From 81e3140d89c1ae4d5a382654ec35640baf2eaacb Mon Sep 17 00:00:00 2001 From: benStre Date: Sat, 10 Feb 2024 21:20:26 +0100 Subject: [PATCH 6/6] fix check circular socket routing --- network/communication-hub.ts | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/network/communication-hub.ts b/network/communication-hub.ts index 8f3afe35..bd3d3e78 100644 --- a/network/communication-hub.ts +++ b/network/communication-hub.ts @@ -252,17 +252,21 @@ export class CommunicationHubHandler { return string; } - public printEndpointSockets(endpoint: Endpoint|string) { + public getEndpointSockets(endpoint: Endpoint|string) { endpoint = endpoint instanceof Endpoint ? endpoint : Endpoint.get(endpoint) as Endpoint; let string = ""; string += `Available sockets for ${endpoint}:\n` - for (const socket of this.iterateEndpointSockets(endpoint, false, false)) { + for (const socket of this.iterateEndpointSockets(endpoint, false, true)) { string += " - " + socket.toString() + "\n"; } - console.log(string) + return string; + } + + public printEndpointSockets(endpoint: Endpoint|string) { + console.log(this.getEndpointSockets(endpoint)) } @@ -542,14 +546,14 @@ export class CommunicationHubHandler { const outGroups = receivers.length == 1 ? // single endpoint shortcut - new Map([[this.getPreferredSocketForEndpoint(receivers[0]), new Disjunction(...receivers)]]) : + new Map([[this.getPreferredSocketForEndpoint(receivers[0], data.socket), new Disjunction(...receivers)]]) : // group for multiple endpoints new Map( // group receivers by socket [...Map.groupBy( // map receivers to sockets - receivers.map(r => ({endpoint: r, socket: this.getPreferredSocketForEndpoint(r)}), + receivers.map(r => ({endpoint: r, socket: this.getPreferredSocketForEndpoint(r, data.socket)}), ), ({socket}) => socket ).entries() ] @@ -587,13 +591,17 @@ export class CommunicationHubHandler { } public async sendAddressedBlockToReceivers(dxb: ArrayBuffer, receivers: Disjunction, destSocket: CommunicationInterfaceSocket) { - const addressdDXB = Compiler.updateHeaderReceiver(dxb, receivers); - if (!addressdDXB) throw new Error("Failed to update header receivers"); + const addressedDXB = Compiler.updateHeaderReceiver(dxb, receivers); + if ((dxb as any)._is_stream) { + (addressedDXB as any)._is_stream = true + } + if (!addressedDXB) throw new Error("Failed to update header receivers"); - IOHandler.handleDatexSent(addressdDXB, receivers, destSocket) + IOHandler.handleDatexSent(addressedDXB, receivers, destSocket) - const success = await destSocket.sendBlock(addressdDXB); + const success = await destSocket.sendBlock(addressedDXB); if (!success) { + this.#logger.warn("Failed to send block to " + receivers.toString() + " via " + destSocket.toString() + ", retrying"); this.updateTTL(dxb, 1) // reset TTL to original return this.datexOut({ dxb,