From 19fd4c321f6310802963aa46491ff12d350463a5 Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 00:40:54 +0100 Subject: [PATCH 01/29] finish webrtc, add MediaStream support --- compiler/compiler.ts | 16 +- .../webrtc-interface.ts | 305 ++++++++++++++++-- runtime/pointers.ts | 20 +- runtime/runtime.ts | 18 +- types/type.ts | 5 +- 5 files changed, 336 insertions(+), 28 deletions(-) diff --git a/compiler/compiler.ts b/compiler/compiler.ts index 33770abd..5c55abb3 100644 --- a/compiler/compiler.ts +++ b/compiler/compiler.ts @@ -48,6 +48,8 @@ import { VolatileMap } from "../utils/volatile-map.ts"; // await wasm_init(); // wasm_init_runtime(); +let WebRTCInterface: undefined|typeof import("../network/communication-interfaces/webrtc-interface.ts").WebRTCInterface; + export const activePlugins:string[] = []; // for actions on variables, pointers, ... @@ -2513,7 +2515,7 @@ export class Compiler { Compiler.builder.insertVariable(SCOPE, assignment[0], ACTION_TYPE.GET, undefined, BinaryCode.INTERNAL_VAR); // parent Compiler.builder.handleRequiredBufferSize(SCOPE.b_index, SCOPE); SCOPE.uint8[SCOPE.b_index++] = BinaryCode.CHILD_SET; - Compiler.builder.insert(assignment[1], SCOPE, true, undefined, undefined, false); // insert key (don't save insert index for key value) + Compiler.builder.insert(assignment[1], SCOPE, true, undefined, undefined, false, false); // insert key (don't save insert index for key value) Compiler.builder.insertVariable(SCOPE, assignment[2], ACTION_TYPE.GET, undefined, BinaryCode.INTERNAL_VAR); // value } Compiler.builder.handleRequiredBufferSize(SCOPE.b_index+1, SCOPE); @@ -2832,6 +2834,12 @@ export class Compiler { // exception for functions: convert to Datex.Function & create Pointer reference (proxifyValue required!) if (value instanceof Function && !(value instanceof DatexFunction) && !(value instanceof JSTransferableFunction)) value = Pointer.proxifyValue(DatexFunction.createFromJSFunction(value)); + // excpetion for MediaStream: always register as WebRTC mediastream when transmitting + if (globalThis.MediaStream && value instanceof MediaStream) { + if (!WebRTCInterface) throw new Error("Cannot bind MediaStream to WebRTCInterface (not yet initialized)") + WebRTCInterface.registerMediaStream(value); + } + // exception for Date: convert to Time (TODO: different approach?) if (value instanceof Date && !(value instanceof Time)) { try { @@ -3172,7 +3180,7 @@ export class Compiler { // special exception: insert raw datex script (dxb Scope can be inserted normally (synchronous)) if (d instanceof DatexResponse && !(d.datex instanceof Scope)) await Compiler.builder.compilerInsert(SCOPE, d); - else Compiler.builder.insert(d, SCOPE); + else Compiler.builder.insert(d, SCOPE, undefined, undefined, undefined, undefined, false); // disable replace optimization for now to prevent invalid replacement, e.g. for path properties } isEffectiveValue = true; } @@ -5160,6 +5168,10 @@ export class Compiler { // compile loop static async compileLoop(SCOPE:compiler_scope):Promise> { + // make sure WebRTC interface is loaded + ({ WebRTCInterface } = await import("../network/communication-interfaces/webrtc-interface.ts")); + + const body_compile_measure = RuntimePerformance.enabled ? RuntimePerformance.startMeasure("compile time", "body") : undefined; if (!SCOPE.datex) SCOPE.datex = ";";//throw new CompilerError("DATEX Script is empty"); diff --git a/network/communication-interfaces/webrtc-interface.ts b/network/communication-interfaces/webrtc-interface.ts index 2f957919..a3e9cab0 100644 --- a/network/communication-interfaces/webrtc-interface.ts +++ b/network/communication-interfaces/webrtc-interface.ts @@ -1,23 +1,47 @@ +import { Pointer } from "../../runtime/pointers.ts"; import { Endpoint } from "../../types/addressing.ts"; +import { PermissionError } from "../../types/errors.ts"; +import { IterableWeakMap } from "../../utils/iterable-weak-map.ts"; +import { communicationHub } from "../communication-hub.ts"; import { CommunicationInterface, CommunicationInterfaceSocket, InterfaceDirection, InterfaceProperties } from "../communication-interface.ts"; @endpoint class WebRTCSignaling { - @property static offer(data:any) { - InterfaceManager.connect("webrtc", datex.meta!.sender, [data]); + /** + * signaling: offer|accept + */ + @property static async negotiation(data: RTCSessionDescriptionInit) { + if (!datex.meta.signed) throw new PermissionError("unauthorized"); + console.log("offer/accept from " + datex.meta!.sender, data) + + if (data.type == "offer") WebRTCInterface.handleOffer(datex.meta.sender, data); + else if (data.type == "answer") WebRTCInterface.handleAnswer(datex.meta.sender, data); + else throw new Error("Unsupported session description type: " + data.type); } - @property static accept(data:any) { - WebRTCClientInterface.waiting_interfaces_by_endpoint.get(datex.meta!.sender)?.setRemoteDescription(data); - } + /** + * signaling: candidate + */ + @property static candidate(data: RTCIceCandidateInit) { + if (!datex.meta.signed) throw new PermissionError("unauthorized"); + WebRTCInterface.handleCandidate(datex.meta.sender, data); + } - @property static candidate(data:any) { - WebRTCClientInterface.waiting_interfaces_by_endpoint.get(datex.meta!.sender)?.addICECandidate(data); - } + /** + * request a specfic media stream - only works once a webrtc connection is established + */ + @property static requestMediaStream(ptrId: string) { + if (!datex.meta.signed) throw new PermissionError("unauthorized"); + return WebRTCInterface.requestMediaStream(datex.meta.sender, ptrId); + } } export class WebRTCInterfaceSocket extends CommunicationInterfaceSocket { + constructor(public inChannel: RTCDataChannel, public outChannel: RTCDataChannel) { + super() + } + handleReceive = (event: MessageEvent) => { if (event.data instanceof ArrayBuffer) { this.receive(event.data) @@ -25,16 +49,16 @@ export class WebRTCInterfaceSocket extends CommunicationInterfaceSocket { } open() { - this.worker.addEventListener("message", this.handleReceive); + this.inChannel.addEventListener("message", this.handleReceive); } close() { - this.worker.removeEventListener('message', this.handleReceive); + this.inChannel.removeEventListener('message', this.handleReceive); } send(dxb: ArrayBuffer) { try { - this.worker.postMessage(dxb) + this.outChannel.send(dxb) return true; } catch { @@ -55,21 +79,260 @@ export class WebRTCInterface extends CommunicationInterface { bandwidth: 50_000 } - constructor(endpoint: Endpoint) { + #socket?: WebRTCInterfaceSocket; + #sessionInit?: RTCSessionDescriptionInit + #endpoint: Endpoint; + #connection?: RTCPeerConnection; + + #resolveTrackReceivedPromise!: (track: MediaStreamTrack) => void; + #trackReceivedPromise!: Promise + + + constructor(endpoint: Endpoint, sesionInit?: RTCSessionDescriptionInit) { + if (WebRTCInterface.connectedInterfaces.has(endpoint)) throw new Error("A WebRTCInterface for " + endpoint + " already exists"); super() - const socket = new WebRTCInterfaceSocket(); - socket.endpoint = endpoint; - this.addSocket(socket); + + this.generateTrackReceivedPromise(); + this.#endpoint = endpoint; + this.#sessionInit = sesionInit; + this.properties.name = this.#endpoint.toString(); + } + + async connect() { + + WebRTCInterface.connectingInterfaces.set(this.#endpoint, this); + + const {promise, resolve} = Promise.withResolvers() + + + // try to establish a WebRTC connection, exchange keys first + this.#connection = new RTCPeerConnection({ + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }); + + const dataChannelOut = this.#connection.createDataChannel("datex", {protocol: "datex"}); + + // listeners + + this.#connection.onicecandidate = (e) => { + if (e.candidate) WebRTCSignaling.candidate.to(this.#endpoint)(e.candidate.toJSON()) + }; + + // connected + this.#connection.onconnectionstatechange = _ => { + switch(this.#connection?.connectionState) { + case "disconnected": + case "closed": + case "failed": { + if (this.#socket) this.removeSocket(this.#socket); + resolve(false); + } + + } + }; + + // received data channel + this.#connection.ondatachannel = (event) => { + + this.logger.success("received data channel"); + const dataChannelIn = event.channel + console.log(dataChannelIn, dataChannelOut) + + this.#socket = new WebRTCInterfaceSocket(dataChannelIn, dataChannelOut); + this.#socket.endpoint = this.#endpoint; + this.addSocket(this.#socket); + + if (WebRTCInterface.connectingInterfaces.has(this.#endpoint)) { + WebRTCInterface.connectingInterfaces.delete(this.#endpoint); + WebRTCInterface.connectedInterfaces.set(this.#endpoint, this); + } + console.log("CONNECTED!!") + resolve(true); + }; + + // received track + this.#connection.ontrack = (event) => { + console.log("received track", event.track); + this.#resolveTrackReceivedPromise(event.track); + this.generateTrackReceivedPromise() + } + + this.#connection.onnegotiationneeded = async (event) => { + console.log("negotiation needed"); + try { + await this.#connection!.setLocalDescription(); + WebRTCSignaling.negotiation.to(this.#endpoint)(this.#connection!.localDescription!.toJSON()) + } + catch (e) { + console.error(e) + } + } + + // handle initial offer + if (this.#sessionInit) { + console.log("accepting a WebRTC connection request ..."); + this.handleOffer(this.#sessionInit); + } + + return promise; + } + + generateTrackReceivedPromise() { + const {promise, resolve} = Promise.withResolvers(); + this.#trackReceivedPromise = promise; + this.#resolveTrackReceivedPromise = resolve; + } + + async collectMediaStreamTracks(count: number) { + if (!this.#connection) throw new Error("No WebRTC connection found to collect media stream tracks"); + + let tracks: MediaStreamTrack[]; + let previousCount = -1; + while ((tracks = this.#connection.getReceivers().map(receiver => receiver.track)).length < count) { + // throw if no new track was added (would lead to infinite loop) + if (previousCount == tracks.length) throw new Error("Track promise was resolved, but no new track added to connection"); + previousCount = tracks.length; + + console.log("not enough tracks collected, waiting for more..."); + await this.#trackReceivedPromise + } + const mediaStream = new MediaStream(); + for (const track of tracks) { + mediaStream.addTrack(track); + } + return mediaStream; + } + + + async handleOffer(data: RTCSessionDescriptionInit) { + await this.#connection!.setRemoteDescription(data); + const answer = await this.#connection!.createAnswer(); + await this.#connection!.setLocalDescription(answer); + WebRTCSignaling.negotiation.to(this.#endpoint)(this.#connection!.localDescription!.toJSON()) } - connect() { - return true; + + disconnect() { + this.#connection?.close(); + WebRTCInterface.connectedInterfaces.delete(this.#endpoint); } - disconnect() {} + override removeSocket(socket: WebRTCInterfaceSocket) { + super.removeSocket(socket); + WebRTCInterface.connectedInterfaces.delete(this.#endpoint); + WebRTCInterface.connectingInterfaces.delete(this.#endpoint); + } - cloneSocket(_socket: WebRTCInterfaceSocket) { - return new WebRTCInterfaceSocket(); + cloneSocket(socket: WebRTCInterfaceSocket) { + return new WebRTCInterfaceSocket(socket.inChannel, socket.outChannel); + } + + /** + * MediaStream handling + */ + + attachMediaStream(mediaStream: MediaStream) { + if (!this.#connection) throw new Error("No WebRTC connection found to attach media stream"); + for (const track of mediaStream.getTracks()) { + this.#connection.addTrack(track, mediaStream); + } + } + + static async getMediaStream(ptrId: string) { + const pointerOrigin = Pointer.getOriginFromPointerId(ptrId); + console.log("requesting mediastream for " + ptrId + ", origin " + pointerOrigin) + if (!this.connectedInterfaces.has(pointerOrigin)) await communicationHub.addInterface(new WebRTCInterface(pointerOrigin)); + const interf = this.connectedInterfaces.get(pointerOrigin)!; + if (!interf.#connection) throw new Error("No WebRTC connection could be established to get media stream"); + + const tracksCount = await WebRTCSignaling.requestMediaStream.to(pointerOrigin)(ptrId); + console.log("collecting tracks "+ tracksCount,interf) + const mediaStream = await interf.collectMediaStreamTracks(tracksCount); + console.log("mediastream",mediaStream) + return mediaStream; + } + + /** + * Register a media stream to be used by the WebRTC interface + * @param mediaStream + */ + static registerMediaStream(mediaStream: MediaStream) { + mediaStream = Pointer.proxifyValue(mediaStream) // make sure the media stream is bound to a pointer + this.registeredMediaStreams.set(Pointer.getId(mediaStream)!, new WeakRef(mediaStream)); + } + + + static registeredMediaStreams = new Map>(); // TODO: garbage collect weakrefs + static connectingInterfaces = new Map(); + static connectedInterfaces = new Map(); + + static getInterfaceForEndpoint(endpoint: Endpoint, findConnecting = true, findConnected = true) { + return ( + (findConnecting ? this.connectingInterfaces.get(endpoint) : undefined) ?? + (findConnected ? this.connectedInterfaces.get(endpoint) : undefined) + ) } -} \ No newline at end of file + static getInterfaceConnection(endpoint: Endpoint, findConnecting = true, findConnected = true) { + if (!findConnecting && !findConnected) throw new Error("Cannot find WebRTC connection: both findConnecting and findConnected are false"); + + let interf = this.getInterfaceForEndpoint(endpoint, findConnecting, findConnected) + + // try with main instance + if (!interf) { + interf = this.getInterfaceForEndpoint(endpoint.main, findConnecting, findConnected); + if (interf) interf.#endpoint = endpoint; // specify received endpoint instance + } + + if (!interf) { + console.warn("No WebRTC interface found for endpoint " + endpoint); + return null; + } + else if (!interf.#connection) { + console.warn("No WebRTC connection found for endpoint " + endpoint); + return null; + } + else return interf.#connection + } + + static handleAnswer(endpoint: Endpoint, data: RTCSessionDescriptionInit) { + const connection = this.getInterfaceConnection(endpoint, true, true); + if (connection) connection.setRemoteDescription(data); + } + + static async handleOffer(endpoint: Endpoint, data: RTCSessionDescriptionInit) { + const interf = this.getInterfaceForEndpoint(endpoint, true, true); + // offer for existing interface + if (interf) { + await interf.handleOffer(data); + } + // create new interface + else { + await communicationHub.addInterface(new WebRTCInterface(datex.meta.sender, data)); + } + } + + + static handleCandidate(endpoint: Endpoint, data: RTCIceCandidateInit) { + const connection = this.getInterfaceConnection(endpoint, true, true); + if (connection) connection.addIceCandidate(data); + } + + static requestMediaStream(endpoint: Endpoint, ptrId: string) { + const connection = this.getInterfaceConnection(endpoint, false, true); + if (!connection) throw new Error("Cannot request MediaStream $" + ptrId + ": no WebRTC connection available"); + + const mediaStream = this.registeredMediaStreams.get(ptrId)?.deref(); + if (!mediaStream) throw new Error("MediaStream $" + ptrId + " not found"); + + console.log(endpoint + " requested mediastream", mediaStream) + const tracks = mediaStream.getTracks(); + for (const track of tracks) { + connection.addTrack(track, mediaStream); + } + return tracks.length + } + +} + +globalThis.WebRTCInterface=WebRTCInterface \ No newline at end of file diff --git a/runtime/pointers.ts b/runtime/pointers.ts index 8ce5cda0..acc7914b 100644 --- a/runtime/pointers.ts +++ b/runtime/pointers.ts @@ -1406,6 +1406,15 @@ export class Pointer extends Ref { return this.pointer_label_map.has(label) } + /** + * returns the pointer of a value if bound to a pointer, otherwise null + */ + public static getId(value:unknown) { + const pointer = this.pointerifyValue(value); + if (pointer instanceof Pointer) return pointer.id; + else return null + } + // get pointer by id, only returns pointer if pointer already exists static get(id:Uint8Array|string):Pointer|undefined { id = Pointer.normalizePointerId(id); @@ -2260,7 +2269,14 @@ export class Pointer extends Ref { this.finalizeSubscribe(override_endpoint, keep_pointer_origin) - if (!this.#loaded) return this.setValue(pointer_value); // set value + if (!this.#loaded) { + // special case: intercept MediaStream + if (globalThis.MediaStream && pointer_value instanceof MediaStream) { + const {WebRTCInterface} = await import("../network/communication-interfaces/webrtc-interface.ts") + return this.setValue(await WebRTCInterface.getMediaStream(this.id) as any); + } + else return this.setValue(pointer_value); // set value + } else return this; } @@ -3619,7 +3635,7 @@ export class Pointer extends Ref { } // fake primitives TODO: dynamic mime types - if (obj instanceof Quantity || obj instanceof Time || obj instanceof Type || obj instanceof URL || obj instanceof Target || obj instanceof Blob || (globalThis.HTMLImageElement && obj instanceof HTMLImageElement)) { + if (obj instanceof Quantity || obj instanceof Time || obj instanceof Type || obj instanceof URL || obj instanceof Target || obj instanceof Blob || (globalThis.MediaStream && obj instanceof MediaStream) || (globalThis.HTMLImageElement && obj instanceof HTMLImageElement)) { return obj; } diff --git a/runtime/runtime.ts b/runtime/runtime.ts index 3fa0fc0d..0fb9665a 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -2272,7 +2272,7 @@ export class Runtime { let new_value:any = UNKNOWN_TYPE; // only handle std namespace / js:Object / js:Symbol - if (type.namespace == "std" || type == Type.js.NativeObject || type == Type.js.Symbol || type == Type.js.RegExp) { + if (type.namespace == "std" || type == Type.js.NativeObject || type == Type.js.Symbol || type == Type.js.RegExp || type == Type.js.MediaStream) { const uncollapsed_old_value = old_value if (old_value instanceof Pointer) old_value = old_value.val; @@ -2371,6 +2371,18 @@ export class Runtime { else new_value = INVALID; break; } + case Type.js.MediaStream: { + if (!globalThis.MediaStream) throw new Error("MediaStreams are not supported on this endpoint") + if (old_value === VOID || typeof old_value == "object") { + if (assigningPtrId) { + const {WebRTCInterface} = await import("../network/communication-interfaces/webrtc-interface.ts") + new_value = await WebRTCInterface.getMediaStream(assigningPtrId) + } + else new_value = new MediaStream(); + } + else new_value = INVALID; + break; + } case Type.std.Tuple: { if (old_value === VOID) new_value = new Tuple().seal(); else if (old_value instanceof Array){ @@ -2710,6 +2722,8 @@ export class Runtime { // regex if (value instanceof RegExp) return value.flags ? new Tuple([value.source, value.flags]) : value.source; + if (globalThis.MediaStream && value instanceof MediaStream) return {}; + // weakref if (value instanceof WeakRef) { const deref = value.deref(); @@ -3266,7 +3280,7 @@ export class Runtime { } // subscribe for updates at pointer origin else { - ptr.subscribeForPointerUpdates(); + await ptr.subscribeForPointerUpdates(); } } diff --git a/types/type.ts b/types/type.ts index 1441a271..d19bccdc 100644 --- a/types/type.ts +++ b/types/type.ts @@ -833,6 +833,7 @@ export class Type extends ExtensibleFunction { if (typeof value == "boolean") return >Type.std.boolean; if (typeof value == "symbol") return Type.js.Symbol as unknown as Type; if (value instanceof RegExp) return Type.js.RegExp as unknown as Type; + if (globalThis.MediaStream && value instanceof MediaStream) return Type.js.MediaStream as unknown as Type; if (value instanceof ArrayBuffer || value instanceof TypedArray) return >Type.std.buffer; if (value instanceof Tuple) return >Type.std.Tuple; @@ -907,6 +908,7 @@ export class Type extends ExtensibleFunction { if (_forClass == globalThis.Boolean || globalThis.Boolean.isPrototypeOf(_forClass)) return >Type.std.boolean; if (_forClass == Symbol || Symbol.isPrototypeOf(_forClass)) return >Type.js.Symbol; if (_forClass == RegExp || RegExp.isPrototypeOf(_forClass)) return Type.js.RegExp as unknown as Type; + if (globalThis.MediaStream && _forClass == MediaStream) return Type.js.MediaStream as unknown as Type; if (_forClass == WeakRef || WeakRef.isPrototypeOf(_forClass)) return >Type.std.WeakRef; if (_forClass == ArrayBuffer || TypedArray.isPrototypeOf(_forClass)) return >Type.std.buffer; @@ -968,7 +970,8 @@ export class Type extends ExtensibleFunction { NativeObject: Type.get("js:Object"), // special object type for non-plain objects (objects with prototype) - no automatic children pointer initialization TransferableFunction: Type.get("js:Function"), Symbol: Type.get("js:Symbol"), - RegExp: Type.get("js:RegExp") + RegExp: Type.get("js:RegExp"), + MediaStream: Type.get("js:MediaStream") } /** From 312242707d3403c963deecbf58f84a51d455cd09 Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 14:28:21 +0100 Subject: [PATCH 02/29] fix iterable weak collections bug --- utils/iterable-weak-map.ts | 23 ++++++++++++++++------- utils/iterable-weak-set.ts | 19 +++++++++++++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/utils/iterable-weak-map.ts b/utils/iterable-weak-map.ts index 0dd02e55..42f6c92e 100644 --- a/utils/iterable-weak-map.ts +++ b/utils/iterable-weak-map.ts @@ -3,11 +3,20 @@ */ export class IterableWeakMap extends Map { + // additional internal WeakSet for faster lookups + #weakMap = new WeakMap() + set(key: K, value: V): this { + // already added + if (this.#weakMap.has(key)) return this; + this.#weakMap.set(key, value); return super.set(new WeakRef(key), value); } delete(key: K): boolean { + if (!this.#weakMap.has(key)) return false; + this.#weakMap.delete(key); + const deleting = new Set>() try { for (const keyRef of super.keys() as Iterable>) { @@ -30,10 +39,7 @@ export class IterableWeakMap extends Map { } has(key: K): boolean { - for (const unwrappedKey of this.keys()) { - if (unwrappedKey === key) return true; - } - return false; + return this.#weakMap.has(key); } *keys(): IterableIterator { @@ -54,9 +60,12 @@ export class IterableWeakMap extends Map { } get(key: K): V|undefined { - for (const [unwrappedKey, val] of this.entries()) { - if (unwrappedKey === key) return val; - } + return this.#weakMap.get(key); + } + + clear() { + this.#weakMap = new WeakMap() + super.clear() } *values(): IterableIterator { diff --git a/utils/iterable-weak-set.ts b/utils/iterable-weak-set.ts index 66d34dc3..7920934c 100644 --- a/utils/iterable-weak-set.ts +++ b/utils/iterable-weak-set.ts @@ -3,11 +3,20 @@ */ export class IterableWeakSet extends Set { + // additional internal WeakSet for faster lookups + #weakSet = new WeakSet() + add(value: T): this { + // already added + if (this.#weakSet.has(value)) return this; + this.#weakSet.add(value); return super.add(new WeakRef(value)); } delete(value: T): boolean { + if (!this.#weakSet.has(value)) return false; + this.#weakSet.delete(value); + const deleting = new Set>() try { for (const valRef of super.values() as Iterable>) { @@ -29,10 +38,7 @@ export class IterableWeakSet extends Set { } has(value: T): boolean { - for (const val of this.values()) { - if (val === value) return true; - } - return false; + return this.#weakSet.has(value); } *values(): IterableIterator { @@ -52,6 +58,11 @@ export class IterableWeakSet extends Set { } } + clear() { + this.#weakSet = new WeakSet() + super.clear() + } + keys(): IterableIterator { return this.values() } From 39fbcdfe9e77e24543ac829bedba06b9454333dd Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 14:28:45 +0100 Subject: [PATCH 03/29] add localEndpoint alias, rename datex.meta.caller --- datex_short.ts | 19 ++++++++++++++++++- runtime/runtime.ts | 1 + types/function.ts | 12 +++++++----- utils/global_types.ts | 31 ++++++++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/datex_short.ts b/datex_short.ts index 9380445e..956dfe9a 100644 --- a/datex_short.ts +++ b/datex_short.ts @@ -52,6 +52,11 @@ declare global { */ const isolate: typeof Ref.disableCapturing + /** + * The local endpoint of the current runtime (alias for Datex.Runtime.endpoint) + */ + const localEndpoint: Endpoint + // conflict with UIX.template (confusing) // const template: typeof _template; } @@ -78,6 +83,7 @@ globalThis.timeout = _timeout; // @ts-ignore global globalThis.sync = _sync; + // can be used instead of import(), calls a DATEX get instruction, works for urls, endpoint, ... export async function get(dx:string|URL|Endpoint, assert_type?:Type | Class | string, context_location?:URL|string, plugins?:string[]):Promise { // auto retrieve location from stack @@ -170,7 +176,16 @@ Object.defineProperty(_datex, 'get', {value:(res:string, type?:Class|Type, locat // add globalThis.meta // Object.defineProperty(globalThis, 'meta', {get:()=>getMeta(), set:()=>{}, configurable:false}) -export const datex = _datex; +export const datex = _datex; // @ts-ignore global datex globalThis.datex = datex; // global access to datex and meta @@ -668,6 +683,8 @@ Object.defineProperty(globalThis, 'grantAccess', {value:grantAccess, configurabl Object.defineProperty(globalThis, 'grantPublicAccess', {value:grantPublicAccess, configurable:false}) Object.defineProperty(globalThis, 'revokeAccess', {value:revokeAccess, configurable:false}) +Object.defineProperty(globalThis, 'localEndpoint', {get: ()=>Runtime.endpoint, configurable:false}) + // @ts-ignore globalThis.get = get // @ts-ignore diff --git a/runtime/runtime.ts b/runtime/runtime.ts index 0fb9665a..7595a8e3 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -5397,6 +5397,7 @@ export class Runtime { Object.defineProperty(scope.meta, 'encrypted', {value: header?.encrypted, writable: false, enumerable:true}); Object.defineProperty(scope.meta, 'signed', {value: header?.signed, writable: false, enumerable:true}); Object.defineProperty(scope.meta, 'sender', {value: header?.sender, writable: false, enumerable:true}); + Object.defineProperty(scope.meta, 'caller', {value: header?.sender, writable: false, enumerable:true}); Object.defineProperty(scope.meta, 'timestamp', {value: header?.timestamp, writable: false, enumerable:true}); Object.defineProperty(scope.meta, 'type', {value: header?.type, writable: false, enumerable:true}); diff --git a/types/function.ts b/types/function.ts index 8fca6c28..9e5f2cec 100644 --- a/types/function.ts +++ b/types/function.ts @@ -6,17 +6,17 @@ import { BROADCAST, Endpoint, endpoint_name, LOCAL_ENDPOINT, target_clause } fro import { Markdown } from "./markdown.ts"; import { Scope } from "./scope.ts"; import { Tuple } from "./tuple.ts"; -import type { datex_scope, compile_info, datex_meta } from "../utils/global_types.ts"; +import type { datex_scope, compile_info } from "../utils/global_types.ts"; import { Compiler } from "../compiler/compiler.ts"; import { Stream } from "./stream.ts" import { PermissionError, RuntimeError, TypeError, ValueError } from "./errors.ts"; import { ProtocolDataType } from "../compiler/protocol_types.ts"; import { DX_EXTERNAL_FUNCTION_NAME, DX_EXTERNAL_SCOPE_NAME, DX_TIMEOUT, VOID } from "../runtime/constants.ts"; import { Type, type_clause } from "./type.ts"; -import { callWithMetadata, callWithMetadataAsync, getMeta } from "../utils/caller_metadata.ts"; +import { callWithMetadata, callWithMetadataAsync } from "../utils/caller_metadata.ts"; import { Datex } from "../mod.ts"; import { Callable, ExtensibleFunction, getDeclaredExternalVariables, getDeclaredExternalVariablesAsync, getSourceWithoutUsingDeclaration } from "./function-utils.ts"; -import { Conjunction, Disjunction, Target } from "../datex_all.ts"; +import { Conjunction, Disjunction, Target, datex_meta } from "../datex_all.ts"; @@ -24,9 +24,10 @@ import { Conjunction, Disjunction, Target } from "../datex_all.ts"; * inject meta info to stack trace */ -export function getDefaultLocalMeta(){ +export function getDefaultLocalMeta(): datex_meta { return Object.seal({ sender: Runtime.endpoint, + caller: Runtime.endpoint, timestamp: new Date(), signed: true, encrypted: false, @@ -35,9 +36,10 @@ export function getDefaultLocalMeta(){ }) } -export function getUnknownMeta(){ +export function getUnknownMeta(): datex_meta { return Object.seal({ sender: BROADCAST, + caller: BROADCAST, timestamp: new Date(), signed: false, encrypted: false, diff --git a/utils/global_types.ts b/utils/global_types.ts index 045649b7..87a42501 100644 --- a/utils/global_types.ts +++ b/utils/global_types.ts @@ -143,7 +143,36 @@ export type datex_variables_scope = { [key: string]: any } & { // all available __encrypted: boolean, } -export type datex_meta = {encrypted?:boolean, signed?:boolean, sender:Endpoint, timestamp:Date, type:ProtocolDataType, local?:boolean}; +export type datex_meta = { + /** + * indicates if the datex block initiating the function call was encrypted + */ + encrypted?:boolean, + /** + * indicates if the datex block initiating the function call was signed + */ + signed?:boolean, + /** + * @deprecated use caller instead + */ + sender:Endpoint, + /** + * the endpoint that initiated the function call + */ + caller: Endpoint, + /** + * the time when the function call was initiated on the caller + */ + timestamp:Date, + /** + * the type of the datex block initiating the function call + */ + type:ProtocolDataType, + /** + * indicates if the function was called from the local endpoint + */ + local?:boolean +}; export type trace = { endpoint: Endpoint, From fd46c115c408631fa6f67376596c4a32eb21451b Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 17:38:18 +0100 Subject: [PATCH 04/29] improve http-over-datex info messages --- network/unyt.ts | 18 +++++++++++++++-- runtime/endpoint_config.ts | 40 ++++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/network/unyt.ts b/network/unyt.ts index 7336c270..8a9ce22e 100644 --- a/network/unyt.ts +++ b/network/unyt.ts @@ -16,6 +16,7 @@ import { Supranet } from "./supranet.ts"; import { Endpoint } from "../types/addressing.ts"; import { CommunicationInterfaceSocket } from "./communication-interface.ts"; import { communicationHub } from "./communication-hub.ts"; +import { endpoint_config } from "../runtime/endpoint_config.ts"; const logger = new Logger("unyt"); @@ -24,6 +25,7 @@ Supranet.onConnect = ()=>{ Unyt.endpoint_info.node = communicationHub.defaultSocket?.endpoint, Unyt.endpoint_info.interface = communicationHub.defaultSocket; Unyt.endpoint_info.datex_version = Runtime.VERSION; + Unyt.using_http_over_datex = endpoint_config.usingHTTPoverDATEX Unyt.logEndpointInfo(); } @@ -53,6 +55,8 @@ export class Unyt { static endpoint_info:EndpointInfo = {} + static using_http_over_datex = false; + static setAppInfo(app_info:AppInfo) { this.endpoint_info.app = app_info; } @@ -77,7 +81,17 @@ export class Unyt { // const urlEndpoint = (client_type == "browser" ? info.app?.backend : info.endpoint); // const endpointURLs = urlEndpoint ? [this.formatEndpointURL(urlEndpoint)] : []; // if (info.app?.domains) endpointURLs.unshift(...info.app.domains.map(d=>'https://'+d)) - return info.app?.dynamicData?.domains ? info.app.dynamicData.domains.map(d=>'https://'+d) : []; + const domains = info.app?.dynamicData?.domains ? info.app.dynamicData.domains.map(d=>'https://'+d.toLowerCase()) : []; + + // remove own domain + const ownDomain = globalThis.location?.origin.toLowerCase(); + if (ownDomain && domains.includes(ownDomain)) { + domains.splice(domains.indexOf(ownDomain),1); + } + // add own domain to the front + domains.unshift(ownDomain + (this.using_http_over_datex?ESCAPE_SEQUENCES.UNYT_CYAN+' (HTTP-over-DATEX)'+ESCAPE_SEQUENCES.RESET:'')); + + return domains; } /** @@ -122,7 +136,7 @@ export class Unyt { else if (info.datex_version) content += `${ESCAPE_SEQUENCES.UNYT_GREY}DATEX VERSION${ESCAPE_SEQUENCES.COLOR_DEFAULT} ${info.datex_version.replaceAll('\n','')}\n` content += `\n` - if (info.app?.stage == "Development" && info.app.backend) content += `Worbench Access for this App: https://workbench.unyt.org/\?e=${info.app.backend.toString()}\n` + // if (info.app?.stage == "dev" && info.app.backend) content += `Worbench Access for this App: https://workbench.unyt.org/\?e=${info.app.backend.toString()}\n` content += `${ESCAPE_SEQUENCES.UNYT_GREY}© ${new Date().getFullYear().toString()} unyt.org` diff --git a/runtime/endpoint_config.ts b/runtime/endpoint_config.ts index e5f5e38f..4c50df50 100644 --- a/runtime/endpoint_config.ts +++ b/runtime/endpoint_config.ts @@ -10,6 +10,7 @@ import { cache_path } from "./cache_path.ts"; import { DatexObject } from "../types/object.ts"; import { Ref } from "./pointers.ts"; import { normalizePath } from "../utils/normalize-path.ts"; +import { ESCAPE_SEQUENCES } from "../datex_all.ts"; type channel_type = 'websocket'|'http' type node_config = { @@ -42,6 +43,8 @@ class EndpointConfig implements EndpointConfigData { public blockchain_relay?: Endpoint /*****************/ + public usingHTTPoverDATEX = false; + // not saved in endpoint config, loaded from https://unyt.cc/nodes.dx public publicNodes?: Map @@ -97,25 +100,32 @@ class EndpointConfig implements EndpointConfigData { // try to get from .dx url if (!path) path = new URL('/'+this.DX_FILE_NAME, globalThis.location.href) try { - const configUpdate = await datex.get(path); - if (!config) { - config = configUpdate; - logger.info("loaded endpoint config from " + path); - } - else { - for (const [key, value] of DatexObject.entries(configUpdate as Record)) { - DatexObject.set(config as Record, key as string, value); + + const dxResponse = await fetch(path); + + // check headers for http-over-datex + if (dxResponse.headers.get("x-http-over-datex") == "yes") this.usingHTTPoverDATEX = true; + + if (dxResponse.ok) { + const content = await dxResponse.text(); + const configUpdate = await Runtime.executeDatexLocally(content, undefined, undefined, path) as EndpointConfigData; + if (!config) { + config = configUpdate; + logger.info("loaded endpoint config from " + path); + } + else { + for (const [key, value] of DatexObject.entries(configUpdate as Record)) { + DatexObject.set(config as Record, key as string, value); + } + logger.debug("updated endpoint config from " + path); } - logger.debug("updated endpoint config from " + path); } + // ignore if no .dx file found + } catch (e) { - // ignore if no .dx file found - if (!(await fetch(path)).ok) {} - else { - logger.error `Could not read config file ${path}: ${e.toString()}`; - throw "invalid config file" - } + logger.error `Could not read config file ${path}: ${e.toString()}`; + throw "invalid config file" } } From ab92ec0f790cfbf2f13fe190f8e6730b3aed2934 Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 18:22:26 +0100 Subject: [PATCH 05/29] webrtc interface cleanup --- .../webrtc-interface.ts | 44 +++++++------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/network/communication-interfaces/webrtc-interface.ts b/network/communication-interfaces/webrtc-interface.ts index a3e9cab0..8e704322 100644 --- a/network/communication-interfaces/webrtc-interface.ts +++ b/network/communication-interfaces/webrtc-interface.ts @@ -1,7 +1,7 @@ +import { logger } from "../../datex_all.ts"; import { Pointer } from "../../runtime/pointers.ts"; import { Endpoint } from "../../types/addressing.ts"; import { PermissionError } from "../../types/errors.ts"; -import { IterableWeakMap } from "../../utils/iterable-weak-map.ts"; import { communicationHub } from "../communication-hub.ts"; import { CommunicationInterface, CommunicationInterfaceSocket, InterfaceDirection, InterfaceProperties } from "../communication-interface.ts"; @@ -10,12 +10,10 @@ import { CommunicationInterface, CommunicationInterfaceSocket, InterfaceDirectio /** * signaling: offer|accept */ - @property static async negotiation(data: RTCSessionDescriptionInit) { + @property static negotiation(data: RTCSessionDescriptionInit) { if (!datex.meta.signed) throw new PermissionError("unauthorized"); - console.log("offer/accept from " + datex.meta!.sender, data) - - if (data.type == "offer") WebRTCInterface.handleOffer(datex.meta.sender, data); - else if (data.type == "answer") WebRTCInterface.handleAnswer(datex.meta.sender, data); + if (data.type == "offer") WebRTCInterface.handleOffer(datex.meta.caller, data); + else if (data.type == "answer") WebRTCInterface.handleAnswer(datex.meta.caller, data); else throw new Error("Unsupported session description type: " + data.type); } @@ -24,7 +22,7 @@ import { CommunicationInterface, CommunicationInterfaceSocket, InterfaceDirectio */ @property static candidate(data: RTCIceCandidateInit) { if (!datex.meta.signed) throw new PermissionError("unauthorized"); - WebRTCInterface.handleCandidate(datex.meta.sender, data); + WebRTCInterface.handleCandidate(datex.meta.caller, data); } /** @@ -32,7 +30,7 @@ import { CommunicationInterface, CommunicationInterfaceSocket, InterfaceDirectio */ @property static requestMediaStream(ptrId: string) { if (!datex.meta.signed) throw new PermissionError("unauthorized"); - return WebRTCInterface.requestMediaStream(datex.meta.sender, ptrId); + return WebRTCInterface.requestMediaStream(datex.meta.caller, ptrId); } } @@ -98,13 +96,12 @@ export class WebRTCInterface extends CommunicationInterface { this.properties.name = this.#endpoint.toString(); } - async connect() { + connect() { WebRTCInterface.connectingInterfaces.set(this.#endpoint, this); const {promise, resolve} = Promise.withResolvers() - // try to establish a WebRTC connection, exchange keys first this.#connection = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], @@ -134,9 +131,8 @@ export class WebRTCInterface extends CommunicationInterface { // received data channel this.#connection.ondatachannel = (event) => { - this.logger.success("received data channel"); + this.logger.debug("received WebRTC data channel"); const dataChannelIn = event.channel - console.log(dataChannelIn, dataChannelOut) this.#socket = new WebRTCInterfaceSocket(dataChannelIn, dataChannelOut); this.#socket.endpoint = this.#endpoint; @@ -146,19 +142,17 @@ export class WebRTCInterface extends CommunicationInterface { WebRTCInterface.connectingInterfaces.delete(this.#endpoint); WebRTCInterface.connectedInterfaces.set(this.#endpoint, this); } - console.log("CONNECTED!!") resolve(true); }; // received track this.#connection.ontrack = (event) => { - console.log("received track", event.track); + console.debug("received track", event.track); this.#resolveTrackReceivedPromise(event.track); this.generateTrackReceivedPromise() } - this.#connection.onnegotiationneeded = async (event) => { - console.log("negotiation needed"); + this.#connection.onnegotiationneeded = async () => { try { await this.#connection!.setLocalDescription(); WebRTCSignaling.negotiation.to(this.#endpoint)(this.#connection!.localDescription!.toJSON()) @@ -170,7 +164,6 @@ export class WebRTCInterface extends CommunicationInterface { // handle initial offer if (this.#sessionInit) { - console.log("accepting a WebRTC connection request ..."); this.handleOffer(this.#sessionInit); } @@ -192,8 +185,6 @@ export class WebRTCInterface extends CommunicationInterface { // throw if no new track was added (would lead to infinite loop) if (previousCount == tracks.length) throw new Error("Track promise was resolved, but no new track added to connection"); previousCount = tracks.length; - - console.log("not enough tracks collected, waiting for more..."); await this.#trackReceivedPromise } const mediaStream = new MediaStream(); @@ -240,15 +231,15 @@ export class WebRTCInterface extends CommunicationInterface { static async getMediaStream(ptrId: string) { const pointerOrigin = Pointer.getOriginFromPointerId(ptrId); - console.log("requesting mediastream for " + ptrId + ", origin " + pointerOrigin) + console.debug("requesting mediastream for " + ptrId + ", origin " + pointerOrigin) if (!this.connectedInterfaces.has(pointerOrigin)) await communicationHub.addInterface(new WebRTCInterface(pointerOrigin)); const interf = this.connectedInterfaces.get(pointerOrigin)!; if (!interf.#connection) throw new Error("No WebRTC connection could be established to get media stream"); const tracksCount = await WebRTCSignaling.requestMediaStream.to(pointerOrigin)(ptrId); - console.log("collecting tracks "+ tracksCount,interf) + console.debug("collecting "+tracksCount+" tracks") const mediaStream = await interf.collectMediaStreamTracks(tracksCount); - console.log("mediastream",mediaStream) + console.debug("mediastream",mediaStream) return mediaStream; } @@ -308,7 +299,8 @@ export class WebRTCInterface extends CommunicationInterface { } // create new interface else { - await communicationHub.addInterface(new WebRTCInterface(datex.meta.sender, data)); + logger.info("Received WebRTC offer from " + endpoint + ", creating new interface...") + await communicationHub.addInterface(new WebRTCInterface(endpoint, data)); } } @@ -325,7 +317,7 @@ export class WebRTCInterface extends CommunicationInterface { const mediaStream = this.registeredMediaStreams.get(ptrId)?.deref(); if (!mediaStream) throw new Error("MediaStream $" + ptrId + " not found"); - console.log(endpoint + " requested mediastream", mediaStream) + console.debug(endpoint + " requested mediastream $" + ptrId) const tracks = mediaStream.getTracks(); for (const track of tracks) { connection.addTrack(track, mediaStream); @@ -333,6 +325,4 @@ export class WebRTCInterface extends CommunicationInterface { return tracks.length } -} - -globalThis.WebRTCInterface=WebRTCInterface \ No newline at end of file +} \ No newline at end of file From 1c67c5b9eea37c361fdeb0884ab3cd5628ce7434 Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 18:29:25 +0100 Subject: [PATCH 06/29] webrtc interface cleanup --- network/communication-interfaces/webrtc-interface.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/network/communication-interfaces/webrtc-interface.ts b/network/communication-interfaces/webrtc-interface.ts index 8e704322..fe8b71f3 100644 --- a/network/communication-interfaces/webrtc-interface.ts +++ b/network/communication-interfaces/webrtc-interface.ts @@ -130,7 +130,6 @@ export class WebRTCInterface extends CommunicationInterface { // received data channel this.#connection.ondatachannel = (event) => { - this.logger.debug("received WebRTC data channel"); const dataChannelIn = event.channel @@ -147,7 +146,6 @@ export class WebRTCInterface extends CommunicationInterface { // received track this.#connection.ontrack = (event) => { - console.debug("received track", event.track); this.#resolveTrackReceivedPromise(event.track); this.generateTrackReceivedPromise() } @@ -231,15 +229,14 @@ export class WebRTCInterface extends CommunicationInterface { static async getMediaStream(ptrId: string) { const pointerOrigin = Pointer.getOriginFromPointerId(ptrId); - console.debug("requesting mediastream for " + ptrId + ", origin " + pointerOrigin) + console.debug("requesting mediastream $" + ptrId + ", origin " + pointerOrigin) if (!this.connectedInterfaces.has(pointerOrigin)) await communicationHub.addInterface(new WebRTCInterface(pointerOrigin)); const interf = this.connectedInterfaces.get(pointerOrigin)!; if (!interf.#connection) throw new Error("No WebRTC connection could be established to get media stream"); const tracksCount = await WebRTCSignaling.requestMediaStream.to(pointerOrigin)(ptrId); - console.debug("collecting "+tracksCount+" tracks") const mediaStream = await interf.collectMediaStreamTracks(tracksCount); - console.debug("mediastream",mediaStream) + console.debug("received mediastream",mediaStream) return mediaStream; } From 207db62c222258e18e8ac40604174ccb6052f336 Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 6 Mar 2024 19:55:49 +0100 Subject: [PATCH 07/29] add mediastream to docs --- docs/manual/11 Types.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index de90ec53..b96e5207 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -52,6 +52,7 @@ Datex.Type.std.Any === any | **Date** | Partial | std:time | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | | **RegExp** | Partial | js:RegExp | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | | **WeakRef** | Full | std:WeakRef | No (Immutable) | - | +| **MediaStream** | Partial | js:MediaStream | Yes | MediaStreams are only supported in browsers that provide a [WebRTC API](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) | | **Error** | Partial | std:Error | No | Error subclasses are not correctly mapped | | **HTMLElement** | Partial 2) | std:html | No | HTML element mutations are currently not synchronized | | **SVGElement** | Partial 2) | std:svg | No | SVG element mutations are currently not synchronized | @@ -115,6 +116,12 @@ The property values of a `js:Object` are never automatically bound to pointers w DATEX has no native symbol type. JavaScript symbols are mapped to `js:Symbol` values. +### js:MediaStream + +This type mapping allows sharing `MediaStream` objects with audio/video tracks between browser endpoints. +Backend (Deno) endpoints are not yet supported due to missing support for WebRTC. + + ## Structs The `struct` helper function allows you to define DATEX types with a From d708f8f2661b542cbbe7f8e83d55b2cb48448335 Mon Sep 17 00:00:00 2001 From: benStre Date: Mon, 11 Mar 2024 21:10:54 +0100 Subject: [PATCH 08/29] fix type errors, replace sync classes in docs --- docs/api/runtime/js_interface.md | 2 +- docs/manual/01 Introduction.md | 18 +++-- docs/manual/03 Pointers.md | 4 +- docs/manual/05 Eternal Pointers.md | 2 +- docs/manual/12 Classes.md | 103 ++++++++++++-------------- docs/manual/15 Storage Collections.md | 43 ++++++----- js_adapter/js_class_adapter.ts | 6 +- runtime/pointers.ts | 14 ++-- runtime/runtime.ts | 2 +- types/function.ts | 2 +- types/struct.ts | 6 ++ 11 files changed, 104 insertions(+), 98 deletions(-) diff --git a/docs/api/runtime/js_interface.md b/docs/api/runtime/js_interface.md index aee02647..e877d67f 100644 --- a/docs/api/runtime/js_interface.md +++ b/docs/api/runtime/js_interface.md @@ -2,7 +2,7 @@ create a custom DATEX JS Interface for a type with handlers - serialize efficiently with the serialize function and de-serialize in the cast function -- do not use @sync classes in combination with an additional js_interface_configuration!; +- do not use struct classes in combination with an additional js_interface_configuration!; ## class **JSInterface** ### Properties diff --git a/docs/manual/01 Introduction.md b/docs/manual/01 Introduction.md index 58d517fc..7efbb31b 100644 --- a/docs/manual/01 Introduction.md +++ b/docs/manual/01 Introduction.md @@ -51,24 +51,26 @@ how pointers are synchronized between endpoints. ### Creating DATEX-compatible classes -With the `@sync` decorator, a class can be bound to a new DATEX type. +With the `struct` wrapper, a class can be bound to a new DATEX type. All instance properties decorated with `@property` are bound to the DATEX value and also visible when the value is shared between endpoints. Per default, the properties are local and only available in the current JavaScript context. ```ts -@sync class MyObject { - @property a = 10 - @property b = 20 - localProp = 4 -} +const MyObject = struct( + class { + @property a = 10 + @property b = 20 + localProp = 4 + } +) const obj = new MyObject(); ``` -Instances of a class marked with `@sync` are also automatically bound to a pointer when created (The value does not have to be explicitly wrapped in `$$()`). +Instances of a class wrapped with `struct` are also automatically bound to a pointer when created (The value does not have to be explicitly wrapped in `$$()`). -Read more about `@sync` classes [here](./11%20Classes.md). +Read more about `struct` classes [here](./12%20Classes.md). ### Persistent data diff --git a/docs/manual/03 Pointers.md b/docs/manual/03 Pointers.md index bcdf8f94..f20df457 100644 --- a/docs/manual/03 Pointers.md +++ b/docs/manual/03 Pointers.md @@ -88,9 +88,9 @@ Datex.Ref.isRef(map.get('y')) // true, was implicitly bound to a pointer There are some exceptions to this behaviour: 1. Primitive property values are not converted to pointers per default 2. Normal [class instances](./10%20Types.md#jsobject) (`js:Object`) are not converted to pointers per default. - Instances of [`@sync`](11%20Classes.md) classes are still converted to pointers + Instances of [`struct`](12%20Classes.md) classes are still converted to pointers 3. When a [class instances](./10%20Types.md#jsobject) is directly bound to a pointer with `$$()`, its - properties are not converted to pointers per default (like 2., this does not affect `@sync` class instances + properties are not converted to pointers per default (like 2., this does not affect `struct` class instances diff --git a/docs/manual/05 Eternal Pointers.md b/docs/manual/05 Eternal Pointers.md index adc1422d..a6864e84 100644 --- a/docs/manual/05 Eternal Pointers.md +++ b/docs/manual/05 Eternal Pointers.md @@ -71,7 +71,7 @@ This guarantees that `eternal` can be used synchronously (without `await`). For the following usecases, the asynchronous `lazyEternal`/`lazyEternalVar` label should be used instead of `eternal`/`eternalVar`: * A value that consumes lots of memory and is only actually needed when certain conditions are met - * A value that requires custom JavaScript bindings (e.g. a `@sync` class instance). JavaScript bindings cannnot be properly initialized at endpoint startup if the corresponding JavaScript class definition is not yet loaded. + * A value that requires custom JavaScript bindings (e.g. a `struct` class instance). JavaScript bindings cannnot be properly initialized at endpoint startup if the corresponding JavaScript class definition is not yet loaded. The `lazyEternal`/`lazyEternalVar` label can be used the same was as the `eternal` label, only requiring an additional `await`: diff --git a/docs/manual/12 Classes.md b/docs/manual/12 Classes.md index 5c296666..b4c8aeb1 100644 --- a/docs/manual/12 Classes.md +++ b/docs/manual/12 Classes.md @@ -4,17 +4,19 @@ Per default, most native JavaScript types (Arrays, Maps, Sets, primitive values, Instances of custom classes are mapped to a DATEX representation of the generic type `js:Object` per default and thus lose their class type and prototypes. -With the `@sync` decorator, a class can be bound to a new DATEX type. +With the struct wrapper, a class can be bound to a new DATEX type. All instance properties decorated with `@property` are bound to the DATEX value and also visible when the value is shared between endpoints. Per default, the properties are local and only available in the current JavaScript context. ```ts -@sync class MyObject { - @property a = 10 - @property b = 20 - localProp = 4 -} +const MyObject = struct( + class { + @property a = 10 + @property b = 20 + localProp = 4 + } +) const obj = new MyObject(); obj.a // 10 @@ -22,11 +24,11 @@ obj.$.a // Datex.Ref<10> ``` > [!NOTE] -> A `@sync` class instance can only be reconstructed correctly on another endpoint or in a later session if the JavaScript class definition is already loaded. Otherwise, the DATEX Runtime can only map the value to a generic object. +> A class instances bound to a DATEX type can only be reconstructed correctly on another endpoint or in a later session if the JavaScript class definition is already loaded. Otherwise, the DATEX Runtime can only map the value to a generic object. ## Automatic Pointer Binding -Instances of a class marked with `@sync` are also automatically bound to a pointer when created (The value does not have to be explicitly wrapped in `$$()`). +Instances of a struct class are also automatically bound to a pointer when created (The value does not have to be explicitly wrapped in `$$()`). All non-primitive properties of an instance (that are decorated with `@property`) are automatically bound to a new pointer if they don't have a pointer yet. @@ -38,13 +40,15 @@ But there is one significant difference: The calculated value returned by the ge This has essentially the same effect as [using the `always()` function](./03%20Pointers.md#creating-pointers). Whenever a pointer value that is referenced in the getter function is updated, the pointer value of the property is also updated. ```ts -@sync class MyObject { - @property a = 10 - @property b = 20 - @property get sum() { - return this.a + this.b - } +const MyObject = struct( + class MyObject { + @property a = 10 + @property b = 20 + @property get sum() { + return this.a + this.b + } } +) const obj = new MyObject(); obj.a // 10 @@ -64,21 +68,23 @@ The normal JavaScript class constructor gets called every time an instance of a When an existing instance of a sync class is shared with another endpoint, the constructor is called again locally on the endpoint, which is not intended but can't be prevented. -We recommend using DATEX-compatible constructors instead, which are only ever called once at the initial creation of a sync class instance. -The DATEX constructor method is named `construct` and must be decorated with `@constructor`: +For this reason, struct classes cannot use normal constructors. +Instead, you can define a DATEX-compatible constructors named `construct` instead, which is only ever called once at the initial creation of a sync class instance: ```ts -@sync class MyObject { - @property a = 0 - @property b = 0 - - // DATEX-compatible constructor - @constructor construct() { - console.log("constructed a new MyObject") +const MyObject = struct( + class MyObject { + @property a = 0 + @property b = 0 + + // DATEX-compatible constructor + construct() { + console.log("constructed a new MyObject") + } } -} +) -const obj = new MyObject() // "constructed a new MyObject" is logged +const obj = new MyObject(42) // "constructed a new MyObject" is logged ``` When the `obj` pointer is now accessed on a remote endpoint, the `construct` method @@ -86,53 +92,38 @@ is not called again on the remote endpoint. You can also access constructor arguments like in a normal constructor: ```ts -@sync class MyObject { - @constructor construct(a: number, b: string) { - console.log("a", a) - console.log("b", a) +const MyObject = struct( + class { + construct(a: number, b: string) { + console.log("a", a) + console.log("b", a) + } } -} +) const obj = new MyObject(42, 'text') ``` -For correct typing, take a look at [this workaround](#workaround-to-get-correct-types). - ## Creating instances without `new` Class instances can also be created by calling the class as a function, passing in an object with the initial property values: ```ts -@sync class MyObject { - @property a = 0 - @property b = 0 -} +const MyObject = struct( + class { + @property a = 0 + @property b = 0 + } +) const obj = MyObject({a: 1, b: 2}) ``` -Currently, this results in a TypeScript error, but it runs without problems. -You can use [this workaround](#workaround-to-get-correct-types) to get rid of the TypeScript errors. - +> [!NOTE] +> Currently, when creating a struct instance this way, the TypeScript tranpiler wants you to set initial values for all properties, even if they +> are getters. This will be fixed in future versions as soon as TS decorator types are improved. -## Workaround to get correct types - -Currently, it is not possible to get the correct types for a sync class without some additional work. -You can add the following lines to a sync class to make the TypeScript compiler happy (this has no effect on the runtime behavior): -```ts -// sync class definition (private) -@sync class _MyObject { - @property a = 0 - @property b = 0 -} -// use these as public proxies for the actual class -export const MyObject = datexClass(_MyObject) -export type MyObject = datexClassType - -const obj1: MyObject = new MyObject() -const obj2: MyObject = MyObject({a: 1, b: 2}) -``` ## Using the raw API For more customization, you can directly use the [JavaScript interface API] which allows you to define custom DATEX mapping behaviours for specific JavaScript types. diff --git a/docs/manual/15 Storage Collections.md b/docs/manual/15 Storage Collections.md index 7e44488d..a14cf51a 100644 --- a/docs/manual/15 Storage Collections.md +++ b/docs/manual/15 Storage Collections.md @@ -49,7 +49,7 @@ Entries of a `StorageSet` can be efficiently queried by using the builtin patter For supported storage locations (e.g. sql storage), the pattern matching is directly performed in storage and non-matching entries are never loaded into RAM. > [!NOTE] -> Pattern matching currently only works with @sync class objects. +> Pattern matching currently only works with struct objects. ### Selecting by property @@ -59,11 +59,12 @@ The easiest way to match entries in a storage set is to provide one or multiple import { StorageSet } from "datex-core-legacy/types/storage-set.ts"; import { Time } from "unyt_core/datex_all.ts"; -@sync class User { - @property(string) name!: string - @property(number) age!: number - @property(Time) created!: Time -} +const User = struct({ + name: string, + age: nubmer, + created: Time +}) +type User = inferType const users = new StorageSet(); @@ -180,15 +181,18 @@ Example: ```ts import { ComputedProperty } from "datex-core-legacy/storage/storage.ts"; -@sync class Location { - @property(number) lat!: number - @property(number) lon!: number -} +const Location = struct({ + lat: number, + lon: number +}); +type Location = inferType -@sync class User { - @property(string) name!: string - @property(Location) location!: Location -} + +const User = struct({ + name: string, + location: Location +}) +type User = inferType const myPosition = {lat: 70.48, lon: -21.96} @@ -225,12 +229,13 @@ Calculates the sum of multiple properties or literal values Example: ```ts -@sync class TodoItem { - @property(number) completedTaskCount!: number - @property(number) openTaskCount!: number -} -const todoItems = new StorageSet() +const TodoItem = struct({ + completedTaskCount: number, + openTaskCount: number +}) +type TodoItem = inferType +const todoItems = new StorageSet() // sum of completedTaskCount and openTaskCount for a given TodoItem const totalTaskCount = ComputedProperty.sum( diff --git a/js_adapter/js_class_adapter.ts b/js_adapter/js_class_adapter.ts index 9ed2a12f..2a93ef2f 100644 --- a/js_adapter/js_class_adapter.ts +++ b/js_adapter/js_class_adapter.ts @@ -726,10 +726,8 @@ export type MethodKeys = { }[keyof T]; export type dc&{new (...args:unknown[]):unknown}, OT extends {new (...args:unknown[]):unknown} = ObjectRef> = - DatexClass & - OT & - // TODO: required instead of OT to disable default constructor, but leads to problems with typing - // Pick & + DatexClass & + Pick & ((struct:Omit, MethodKeys>>) => datexClassType); /** diff --git a/runtime/pointers.ts b/runtime/pointers.ts index acc7914b..ab598b13 100644 --- a/runtime/pointers.ts +++ b/runtime/pointers.ts @@ -828,11 +828,15 @@ export type ObjectRef = T // TODO: // {[K in keyof T]: MaybeObjectRef} - & - { - $:Proxy$ // reference to value (might generate pointer property, if no underlying pointer reference) - $$:PropertyProxy$ // always returns a pointer property reference - }; + & ( + // add $ and $$ properties if not already present + T extends {$: any, $$: any} ? + unknown: + { + $:Proxy$ // reference to value (might generate pointer property, if no underlying pointer reference) + $$:PropertyProxy$ // always returns a pointer property reference + } + ); export type MaybeObjectRef = T extends primitive|Function ? T : ObjectRef diff --git a/runtime/runtime.ts b/runtime/runtime.ts index 7595a8e3..7b0f0c66 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -2884,7 +2884,7 @@ export class Runtime { const compiled = new Uint8Array(Compiler.encodeValue(value, undefined, false, deep_clone, collapse_value, false, true, false, true)); return wasm_decompile(compiled, formatted, colorized, resolve_slots).replace(/\r\n$/, ''); } catch (e) { - console.debug(e); + // console.debug(e); return this.valueToDatexString(value, formatted) } // return Decompiler.decompile(Compiler.encodeValue(value, undefined, false, deep_clone, collapse_value), true, formatted, formatted, false); diff --git a/types/function.ts b/types/function.ts index 9e5f2cec..80857386 100644 --- a/types/function.ts +++ b/types/function.ts @@ -291,7 +291,7 @@ export class Function any = (...args: any) => any> e // run in scope, get result try { - const res = await Runtime.datexOut(compile_info, endpoint, undefined, true, undefined, undefined, false, this.datex_timeout); + const res = await Runtime.datexOut(compile_info, endpoint, undefined, true, undefined, undefined, false, this.datex_timeout??(this as any)[DX_TIMEOUT]); return res; } catch (e) { // error occured during scope execution => scope is broken, can no longer be used => create new scope diff --git a/types/struct.ts b/types/struct.ts index 5448c2a4..f1b211fd 100644 --- a/types/struct.ts +++ b/types/struct.ts @@ -112,6 +112,12 @@ export function struct(defOrTypeName: StructuralTypeDefIn|Class|string, def?: St const hash = typeName ?? sha256(Runtime.valueToDatexStringExperimental(template)) const type = new Type("struct", hash).setTemplate(template); + // custom instanceof handling for structs + // TODO: does not work in Deno (throws runtime error when checking instanceof) + (type as any)[Symbol.hasInstance] = (val: unknown) => { + return Type.ofValue(val).matchesType(type); + } + if (callerFile) type.jsTypeDefModule = callerFile; type.proxify_children = true; return type as any From 3e91840999b9146c29399de159477d0da84606c2 Mon Sep 17 00:00:00 2001 From: benStre Date: Mon, 11 Mar 2024 22:47:42 +0100 Subject: [PATCH 09/29] use unyt turn and stun servers --- network/communication-interfaces/webrtc-interface.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/network/communication-interfaces/webrtc-interface.ts b/network/communication-interfaces/webrtc-interface.ts index fe8b71f3..2c4013f7 100644 --- a/network/communication-interfaces/webrtc-interface.ts +++ b/network/communication-interfaces/webrtc-interface.ts @@ -102,9 +102,16 @@ export class WebRTCInterface extends CommunicationInterface { const {promise, resolve} = Promise.withResolvers() + const stunServers = [ + { urls: 'stun:195.201.173.190:3478' } + ] + const turnServers = [ + {urls: 'turn:195.201.173.190:3478', username: '1525325424', credential: 'YuzkH/Th9BBaRj4ivR03PiCfr+E='} // TODO: get turn server credentials from server + ] + // try to establish a WebRTC connection, exchange keys first this.#connection = new RTCPeerConnection({ - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + iceServers: [...stunServers, ...turnServers] }); const dataChannelOut = this.#connection.createDataChannel("datex", {protocol: "datex"}); @@ -194,6 +201,7 @@ export class WebRTCInterface extends CommunicationInterface { async handleOffer(data: RTCSessionDescriptionInit) { + console.log("xx handle offer",data,this.#connection) await this.#connection!.setRemoteDescription(data); const answer = await this.#connection!.createAnswer(); await this.#connection!.setLocalDescription(answer); @@ -285,6 +293,7 @@ export class WebRTCInterface extends CommunicationInterface { static handleAnswer(endpoint: Endpoint, data: RTCSessionDescriptionInit) { const connection = this.getInterfaceConnection(endpoint, true, true); + console.log("xx handle answer from " + endpoint ,data,connection) if (connection) connection.setRemoteDescription(data); } From d1db54c2388a3221c5ed0e98dde04fbd9faf8fe7 Mon Sep 17 00:00:00 2001 From: benStre Date: Mon, 11 Mar 2024 22:48:18 +0100 Subject: [PATCH 10/29] remove debug logs --- network/communication-interfaces/webrtc-interface.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/network/communication-interfaces/webrtc-interface.ts b/network/communication-interfaces/webrtc-interface.ts index 2c4013f7..15ef33b8 100644 --- a/network/communication-interfaces/webrtc-interface.ts +++ b/network/communication-interfaces/webrtc-interface.ts @@ -201,7 +201,6 @@ export class WebRTCInterface extends CommunicationInterface { async handleOffer(data: RTCSessionDescriptionInit) { - console.log("xx handle offer",data,this.#connection) await this.#connection!.setRemoteDescription(data); const answer = await this.#connection!.createAnswer(); await this.#connection!.setLocalDescription(answer); @@ -293,7 +292,6 @@ export class WebRTCInterface extends CommunicationInterface { static handleAnswer(endpoint: Endpoint, data: RTCSessionDescriptionInit) { const connection = this.getInterfaceConnection(endpoint, true, true); - console.log("xx handle answer from " + endpoint ,data,connection) if (connection) connection.setRemoteDescription(data); } From 87e41bc373d30430e3ad8de7e113f44bda64404e Mon Sep 17 00:00:00 2001 From: benStre Date: Tue, 12 Mar 2024 16:18:39 +0100 Subject: [PATCH 11/29] add webrtc/com interface docs chapter --- docs/manual/16 Communication Interfaces.md | 75 ++++++++++ docs/manual/assets/webrtc/legend.png | Bin 0 -> 129079 bytes .../assets/webrtc/webrtc-connecting.png | Bin 0 -> 143791 bytes .../webrtc/webrtc-direct-connection.png | Bin 0 -> 76682 bytes .../assets/webrtc/webrtc-turn-connection.png | Bin 0 -> 92285 bytes .../webrtc-interface.ts | 16 +- network/web_rtc_interface.ts | 137 ------------------ 7 files changed, 82 insertions(+), 146 deletions(-) create mode 100644 docs/manual/16 Communication Interfaces.md create mode 100644 docs/manual/assets/webrtc/legend.png create mode 100644 docs/manual/assets/webrtc/webrtc-connecting.png create mode 100644 docs/manual/assets/webrtc/webrtc-direct-connection.png create mode 100644 docs/manual/assets/webrtc/webrtc-turn-connection.png delete mode 100644 network/web_rtc_interface.ts diff --git a/docs/manual/16 Communication Interfaces.md b/docs/manual/16 Communication Interfaces.md new file mode 100644 index 00000000..dfd9ef69 --- /dev/null +++ b/docs/manual/16 Communication Interfaces.md @@ -0,0 +1,75 @@ +# Communication Interfaces + +DATEX communication is not restricted to a specific underlying communication channel. +DATEX blocks can be transmitted via WebSockets, TCP, WebRTC, HTTP or with Channel Messaging between browser workers or windows. +The DATEX JS Library provides a `CommunicationInterface` API which allows the implementation of other custom communication channels. + +## Connecting communication interfaces + +When calling `Supranet.connect()`, the DATEX Runtime automatically creates a connection with a communication interface. +Per default, WebSocket communication interfaces for public unyt.org relay endpoints (https://unyt.cc/nodes.dx) are used. + +To establish a connection over another communiction channel, you need to create a new instance of the corresponding `CommunicationInterface` and add it to the `communicationHub`: + +```ts +import { WebSocketClientInterface } from "datex-core-legacy/network/communication-interfaces/websocket-client-interface.ts"; +import { communicationHub } from "datex-core-legacy/network/communication-hub.ts"; + +// create a new WebSocketClientInterface connected to wss://example.com +const webSocketInterface = new WebSocketClientInterface("wss://example.com"); + +// add the interface to the communication hub +const connected = await communicationHub.addInterface(webSocketInterface) + +// true if connection could be establised: +console.log("connected:", connected); +``` + +The interface constructor signature can be different for other communication interfaces, but everything else works the same way. + +## Builtin commmunication interfaces + +### WebSocket +- +### HTTP +- +### Worker +- +### Window +- +### WebRTC + +#### Legend + + +#### Establishing a WebRTC connection + +To establish a [WebRTC](https://webrtc.org/) connection between two endpoints, each endpoint first gets its own public IP address from a STUN Server (Step 1 and 3). + +The two endpoints then negotiate a session by exchanging SDP offers and answers (Step 2 and 4). The DATEX WebRTC communication interface does not require an explicit [signaling server](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling#the_signaling_server). Instead, SDP negotation happens directly between the two endpoints via DATEX (this might require a relay endpoint, which could be regarded as a kind of signaling server). + +![](./assets/webrtc/webrtc-connecting.png) + +The negotiated session can either use a direct or an indirect connection via a [TURN server](https://webrtc.org/getting-started/turn-server). + +#### Direct WebRTC connection + +If the two clients are in the same network or if [NAT traversal](https://en.wikipedia.org/wiki/NAT_traversal) is possible using public ip addresses of the two clients, +a direct connection can be established: +![](./assets/webrtc/webrtc-direct-connection.png) + + +#### Indirect WebRTC connection + +As a fallback, WebRTC connections are relayed using a public TURN server. +![](./assets/webrtc/webrtc-turn-connection.png) + + +#### WebRTC data exchange + +Once a connection is established, it can be used to transmit video or audio streams, as well as DATEX blocks using a [data channel](https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel). +`MediaStream` tracks are transmitted directly via WebRTC, any other data is transmitted via the DATEX data channel. + +## Implementing custom communication interfaces + +- \ No newline at end of file diff --git a/docs/manual/assets/webrtc/legend.png b/docs/manual/assets/webrtc/legend.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6d2d02c733c212fe4838680ef6f207e9425c46 GIT binary patch literal 129079 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%0AfP{T!>S(rW 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 DMmT#I literal 0 HcmV?d00001 diff --git a/docs/manual/assets/webrtc/webrtc-connecting.png b/docs/manual/assets/webrtc/webrtc-connecting.png new file mode 100644 index 0000000000000000000000000000000000000000..545650cb1bd5ee947eb08948fdeb7cf5e99095f7 GIT binary patch literal 143791 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 jk|X3baW0)ypXrXD$c{xd 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 gKUU&@b4}Md`zX?5+F0oAJr#zcm|JQS?5RCivc( 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¬>qg!;J{R%BD2CtIEZB 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 literal 0 HcmV?d00001 diff --git a/network/communication-interfaces/webrtc-interface.ts b/network/communication-interfaces/webrtc-interface.ts index 15ef33b8..6df18340 100644 --- a/network/communication-interfaces/webrtc-interface.ts +++ b/network/communication-interfaces/webrtc-interface.ts @@ -82,11 +82,14 @@ export class WebRTCInterface extends CommunicationInterface { #endpoint: Endpoint; #connection?: RTCPeerConnection; + #stunServers: RTCIceServer[] + #turnServers: RTCIceServer[] + #resolveTrackReceivedPromise!: (track: MediaStreamTrack) => void; #trackReceivedPromise!: Promise - constructor(endpoint: Endpoint, sesionInit?: RTCSessionDescriptionInit) { + constructor(endpoint: Endpoint, sesionInit?: RTCSessionDescriptionInit, stunServers?: RTCIceServer[], turnServers?: RTCIceServer[]) { if (WebRTCInterface.connectedInterfaces.has(endpoint)) throw new Error("A WebRTCInterface for " + endpoint + " already exists"); super() @@ -94,6 +97,8 @@ export class WebRTCInterface extends CommunicationInterface { this.#endpoint = endpoint; this.#sessionInit = sesionInit; this.properties.name = this.#endpoint.toString(); + this.#stunServers = stunServers ?? [{urls: 'stun:195.201.173.190:3478'}]; + this.#turnServers = turnServers ?? [{urls: 'turn:195.201.173.190:3478', username: '1525325424', credential: 'YuzkH/Th9BBaRj4ivR03PiCfr+E='}]; // TODO: get turn server credentials from server } connect() { @@ -102,16 +107,9 @@ export class WebRTCInterface extends CommunicationInterface { const {promise, resolve} = Promise.withResolvers() - const stunServers = [ - { urls: 'stun:195.201.173.190:3478' } - ] - const turnServers = [ - {urls: 'turn:195.201.173.190:3478', username: '1525325424', credential: 'YuzkH/Th9BBaRj4ivR03PiCfr+E='} // TODO: get turn server credentials from server - ] - // try to establish a WebRTC connection, exchange keys first this.#connection = new RTCPeerConnection({ - iceServers: [...stunServers, ...turnServers] + iceServers: [...this.#stunServers, ...this.#turnServers] }); const dataChannelOut = this.#connection.createDataChannel("datex", {protocol: "datex"}); diff --git a/network/web_rtc_interface.ts b/network/web_rtc_interface.ts deleted file mode 100644 index b83b8df6..00000000 --- a/network/web_rtc_interface.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { remote, expose } from "../mod.ts"; -import { Endpoint, Target, datex_advanced, scope } from "../datex_all.ts"; -import { client_type } from "../utils/constants.ts"; - -import InterfaceManager, { CommonInterface } from "./client.ts"; - -// signaling for WebRTC connections (used by WebRTCClientInterface) -@scope("webrtc") class _WebRTCSignaling { - - @expose @remote static offer(data:any) { - InterfaceManager.connect("webrtc", datex.meta!.sender, [data]); - } - - @expose @remote static accept(data:any) { - WebRTCClientInterface.waiting_interfaces_by_endpoint.get(datex.meta!.sender)?.setRemoteDescription(data); - } - - @expose @remote static candidate(data:any) { - WebRTCClientInterface.waiting_interfaces_by_endpoint.get(datex.meta!.sender)?.addICECandidate(data); - } -} -const WebRTCSignaling = datex_advanced(_WebRTCSignaling); - - -/** 'Relayed' interface */ -export class WebRTCClientInterface extends CommonInterface { - - override type = "webrtc" - - connection?: RTCPeerConnection - data_channel_out?: RTCDataChannel - data_channel_in?: RTCDataChannel - - override in = true - override out = true - override global = false - - static waiting_interfaces_by_endpoint:Map = new Map() - - constructor(endpoint: Endpoint){ - super(endpoint); - if (client_type != "browser") return; - WebRTCClientInterface.waiting_interfaces_by_endpoint.set(endpoint, this); - } - - public override disconnect(){ - super.disconnect(); - this.connection?.close() - } - - connect() { - const description:RTCSessionDescription = this.initial_arguments[0]; - - // deno-lint-ignore no-async-promise-executor - return new Promise(async resolve=>{ - - // try to establish a WebRTC connection, exchange keys first - this.connection = new RTCPeerConnection({ - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }); - - // listeners - this.connection.onicecandidate = (e) => { - if (e.candidate) WebRTCSignaling.to(this.endpoint).candidate(e.candidate.toJSON()) - }; - - // connected - this.connection.addEventListener('connectionstatechange', event => { - switch(this.connection?.connectionState) { - case "connected": - WebRTCClientInterface.waiting_interfaces_by_endpoint.delete(this.endpoint); - //resolve(true); - break; - case "disconnected": this.connected = false;resolve(false);break; - case "closed": this.connected = false;resolve(false);break; - case "failed": resolve(false); - } - }); - - // received data channel - this.connection.ondatachannel = (event) => { - this.data_channel_in = event.channel; - this.logger.success("received data channel"); - console.log(this.data_channel_in) - this.data_channel_in.onmessage = (event)=>{ - console.log("in>") - InterfaceManager.handleReceiveBlock(event.data, this.endpoint, this); - } - this.connected = true; - resolve(true); - }; - - // create an offer - if (!description) { - this.logger.success("initializing a WebRTC connection ...", this.connection); - - this.data_channel_out = this.connection.createDataChannel("datex", {protocol: "datex"}); - - // this.data_channel_out.addEventListener('open', e => console.warn('local data channel opened', e)); - // this.data_channel_out.addEventListener('close', e => console.warn('local data channel closed')); - - const offer = await this.connection.createOffer(); - await this.connection.setLocalDescription(offer); - WebRTCSignaling.to(this.endpoint).offer(this.connection.localDescription!.toJSON()) - } - - // accept offer - else { - this.logger.success("accepting a WebRTC connection request ..."); - - this.data_channel_out = this.connection.createDataChannel("datex", {protocol: "datex"}); - - await this.connection.setRemoteDescription(description) - const answer = await this.connection.createAnswer(); - await this.connection.setLocalDescription(answer); - - WebRTCSignaling.to(this.endpoint).accept(this.connection.localDescription!.toJSON()) - } - }) - - } - - async setRemoteDescription(description:any) { - await this.connection?.setRemoteDescription(description) - } - - async addICECandidate(candidate:object) { - await this.connection?.addIceCandidate(new RTCIceCandidate(candidate)); - } - - sendBlock(datex:ArrayBuffer){ - console.log("send",this,this.data_channel_out) - this.data_channel_out?.send(datex) - } -} - -InterfaceManager.registerInterface("webrtc", WebRTCClientInterface); \ No newline at end of file From 55f431f61dde90ed272fcfc976e040a9ce7c2488 Mon Sep 17 00:00:00 2001 From: benStre Date: Tue, 12 Mar 2024 16:20:08 +0100 Subject: [PATCH 12/29] fix newlines --- docs/manual/16 Communication Interfaces.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/manual/16 Communication Interfaces.md b/docs/manual/16 Communication Interfaces.md index dfd9ef69..765ede02 100644 --- a/docs/manual/16 Communication Interfaces.md +++ b/docs/manual/16 Communication Interfaces.md @@ -56,12 +56,14 @@ The negotiated session can either use a direct or an indirect connection via a [ If the two clients are in the same network or if [NAT traversal](https://en.wikipedia.org/wiki/NAT_traversal) is possible using public ip addresses of the two clients, a direct connection can be established: + ![](./assets/webrtc/webrtc-direct-connection.png) #### Indirect WebRTC connection As a fallback, WebRTC connections are relayed using a public TURN server. + ![](./assets/webrtc/webrtc-turn-connection.png) From 513f7597e4bb9f47dd7c376fa9a96b075053ed2d Mon Sep 17 00:00:00 2001 From: benStre Date: Tue, 12 Mar 2024 21:52:43 +0100 Subject: [PATCH 13/29] fix SafRai cookies --- network/communication-hub.ts | 2 +- utils/cookies.ts | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/network/communication-hub.ts b/network/communication-hub.ts index 5b743094..a6691083 100644 --- a/network/communication-hub.ts +++ b/network/communication-hub.ts @@ -214,7 +214,7 @@ export class CommunicationHubHandler { ) const identifier = comInterface.toString() if (!mapping.has(identifier)) mapping.set(identifier, new Map()) - sockets.forEach(([endpoint, socket]) => mapping.get(identifier)!.set(socket, {directEndpoint: endpoint, directEndpointDynamicProperties: this.#endpointSockets.get(endpoint)!.get(socket)!, indirectEndpoints: new Map()})) + sockets.forEach(([endpoint, socket]) => mapping.get(identifier)!.set(socket, {directEndpoint: endpoint, directEndpointDynamicProperties: this.#endpointSockets.get(endpoint)?.get(socket), indirectEndpoints: new Map()})) } // indirect connections diff --git a/utils/cookies.ts b/utils/cookies.ts index e763db4d..22d0c239 100644 --- a/utils/cookies.ts +++ b/utils/cookies.ts @@ -4,8 +4,7 @@ import { client_type } from "./constants.ts"; const port = globalThis.location?.port; -const isSafari = (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)); - +const browserIsSafariLocalhost = window.location?.hostname == "localhost" && (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)); export function deleteCookie(name: string) { if (client_type !== "browser") { @@ -29,7 +28,7 @@ export function setCookie(name: string, value: string, expDays?: number) { expiryDate.setTime(expiryDate.getTime() + (expDays * 24 * 60 * 60 * 1000)); } const expires = expDays == 0 ? "" : "expires=" + expiryDate.toUTCString() + ";"; - document.cookie = name + "=" + value + "; " + expires + " path=/; SameSite=None;" + (isSafari ? "" :" Secure;") + document.cookie = name + "=" + value + "; " + expires + " path=/; SameSite=None;" + (browserIsSafariLocalhost ? "" :" Secure;") } export function getCookie(name: string) { From 12f33efbd2c4c1a4fe940d2d8e9d59c7fe3bdf55 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:15:06 +0100 Subject: [PATCH 14/29] add DATEX support for js Files, Generators, TypedArrays, and Promises --- compiler/compiler.ts | 16 +++++--- docs/manual/11 Types.md | 16 +++++++- runtime/io_handler.ts | 2 +- runtime/js_interface.ts | 15 +++---- runtime/runtime.ts | 87 +++++++++++++++++++++++++++++++++++------ types/native_types.ts | 68 +++++++++++++++++++++++++++++++- types/type.ts | 59 ++++++++++++++++++++++++---- utils/global_values.ts | 1 + 8 files changed, 230 insertions(+), 34 deletions(-) diff --git a/compiler/compiler.ts b/compiler/compiler.ts index 5c55abb3..1f289461 100644 --- a/compiler/compiler.ts +++ b/compiler/compiler.ts @@ -5171,6 +5171,12 @@ export class Compiler { // make sure WebRTC interface is loaded ({ WebRTCInterface } = await import("../network/communication-interfaces/webrtc-interface.ts")); + // cache inserted blob values + const promises = []; + for (const val of SCOPE.data??[]) { + if (val instanceof Blob) promises.push(Runtime.cacheValue(val)); + } + if (promises.length) await Promise.all(promises); const body_compile_measure = RuntimePerformance.enabled ? RuntimePerformance.startMeasure("compile time", "body") : undefined; @@ -5553,12 +5559,12 @@ export class Compiler { /** create a dxb file created from a DATEX Script string and convert to data url */ static async datexScriptToDataURL(dx:string, type = ProtocolDataType.DATA):Promise { - let dxb = await Compiler.compile(dx, [], {sign:false, encrypt: false, type}) + const dxb = await Compiler.compile(dx, [], {sign:false, encrypt: false, type}) - let blob = new Blob([dxb], {type: "text/dxb"}); // workaround to prevent download + const blob = new Blob([dxb], {type: "text/dxb"}); // workaround to prevent download return new Promise(resolve=>{ - var a = new FileReader(); + const a = new FileReader(); a.onload = function(e) {resolve(e.target.result);} a.readAsDataURL(blob); }); @@ -5566,9 +5572,9 @@ export class Compiler { /** create a dxb file created from a DATEX Script string and convert to object url */ static async datexScriptToObjectURL(dx:string, type = ProtocolDataType.DATA):Promise { - let dxb = await Compiler.compile(dx, [], {sign:false, encrypt: false, type}) + const dxb = await Compiler.compile(dx, [], {sign:false, encrypt: false, type}) - let blob = new Blob([dxb], {type: "text/dxb"}); // workaround to prevent download + const blob = new Blob([dxb], {type: "text/dxb"}); // workaround to prevent download return URL.createObjectURL(blob); } diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index b96e5207..b7bc7db6 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -46,10 +46,24 @@ Datex.Type.std.Any === any | **WeakMap** | None | - | - | Cannot be implemented because `WeakMap` internals are not accessible. Alternative: `StorageWeakMap` | | **Function** | Sufficient | std:Function | No (Immutable) | Functions always return a Promise, even if they are synchronous | | **AsyncFunction** | Sufficient | std:Function | No (Immutable) | - | -| **GeneratorFunction** | None | - | - | - | +| **Generator** | Sufficient | js:AsyncGenerator | - | Generators are always mapped to AsyncGenerators | +| **AsyncGenerator** | Full | js:AsyncGenerator | - | - | | **ArrayBuffer** | Partial | std:buffer | No | ArrayBuffer mutations are currently not synchronized | +| **Uint8Array** | Partial | js:TypedArray/u8 | No | ArrayBuffer mutations are currently not synchronized | +| **Uint16Array** | Partial | js:TypedArray/u16 | No | ArrayBuffer mutations are currently not synchronized | +| **Uint32Array** | Partial | js:TypedArray/u32 | No | ArrayBuffer mutations are currently not synchronized | +| **BigUint64Array** | Partial | js:TypedArray/u64 | No | ArrayBuffer mutations are currently not synchronized | +| **Int8Array** | Partial | js:TypedArray/i8 | No | ArrayBuffer mutations are currently not synchronized | +| **Int16Array** | Partial | js:TypedArray/i16 | No | ArrayBuffer mutations are currently not synchronized | +| **Int32Array** | Partial | js:TypedArray/i32 | No | ArrayBuffer mutations are currently not synchronized | +| **BigInt64Array** | Partial | js:TypedArray/i64 | No | ArrayBuffer mutations are currently not synchronized | +| **Float32Array** | Partial | js:TypedArray/f32 | No | ArrayBuffer mutations are currently not synchronized | +| **Float64Array** | Partial | js:TypedArray/f64 | No | ArrayBuffer mutations are currently not synchronized | +| **Promise** | Full | js:Promise | No (Immutable) | - | | **URL** | Partial | std:url | No | URL mutations are currently not synchronized | | **Date** | Partial | std:time | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | +| **Blob** | Full | std:*/*, | No (Immutable) | - | +| **File** | Full | js:File | No (Immutable) | - | | **RegExp** | Partial | js:RegExp | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | | **WeakRef** | Full | std:WeakRef | No (Immutable) | - | | **MediaStream** | Partial | js:MediaStream | Yes | MediaStreams are only supported in browsers that provide a [WebRTC API](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) | diff --git a/runtime/io_handler.ts b/runtime/io_handler.ts index d8f98c22..48327b81 100644 --- a/runtime/io_handler.ts +++ b/runtime/io_handler.ts @@ -18,7 +18,7 @@ export class IOHandler { // redirect std/print private static std_out:(data:any[])=>void|Promise = async (data:any[])=>{ for (let d=0; d = { handle_transform?: (value: T, pointer: Pointer) => void, // gets called when a transform function produces a new value, default override behaviour is ignored allow_transform_value?: (type: Type, pointer: Pointer) => string|true, // returns true if the value can be wrapped with wrap transform, allows pointer union types class?: Class, // the corresponding JS class or a prototype + no_instanceof?: boolean, // if true, don't use instanceof checks for the class, instead use isPrototypeOf prototype?: object, // the inherited JS prototype detect_class?: (value:any)=>boolean, // a function that returns whether the value has the type of the pseudo class @@ -158,7 +159,7 @@ export class JSInterface { public static handleConfigUpdate(type:Type, config:js_interface_configuration){ if (!type) throw new Error ("A type is required for a type configuration") - if (!config.class && !config.prototype) throw new Error ("The 'class' or 'prototype' property is required for a type configuration") + if (!config.class && !config.prototype && !config.detect_class) throw new Error ("The 'class', or 'prototype' property is required for a type configuration") config.__type = type; // save type to config for faster type reference @@ -181,14 +182,14 @@ export class JSInterface { // return if a value has a matching pseudo class configuration static hasPseudoClass(value:any):boolean { - for (let [_class, config] of this.configurations_by_class) { + for (const [_class, config] of this.configurations_by_class) { if (value instanceof _class) { // is class instance if (config.detect_class instanceof globalThis.Function && !(config.detect_class)(value)) return false; // detect class invalid return true; } } - for (let [proto, config] of this.configurations_by_prototype) { + for (const [proto, config] of this.configurations_by_prototype) { if (proto.isPrototypeOf(value)) { // has prototype if (config.detect_class instanceof globalThis.Function && !(config.detect_class)(value)) return false; // detect class invalid return true; @@ -271,20 +272,20 @@ export class JSInterface { // value -> static getValueDatexType(value:any):Type { - for (let [_class, config] of this.configurations_by_class) { - if (value instanceof _class) { + for (const [_class, config] of this.configurations_by_class) { + if (!config.detect_class && value instanceof _class) { return config.get_type ? config.get_type(value) : config.__type; } } - for (let [proto, config] of this.configurations_by_prototype) { + for (const [proto, config] of this.configurations_by_prototype) { if (proto.isPrototypeOf(value)) { return config.get_type ? config.get_type(value) : config.__type; } } // try afterwards (less likely to happen) - for (let [_class, config] of this.configurations_by_class) { + for (const [_class, config] of this.configurations_by_class) { if (config.detect_class instanceof globalThis.Function && (config.detect_class)(value) ) { return config.get_type ? config.get_type(value) : config.__type; } diff --git a/runtime/runtime.ts b/runtime/runtime.ts index 7b0f0c66..74d17db7 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -215,6 +215,8 @@ type Source = '_source'|{}; */ export type trustedEndpointPermission = "remote-js-execution" | "protected-pointer-access" | "fallback-pointer-source"; +export const WRAPPED_PROMISE = Symbol("WRAPPED_PROMISE"); + export class Runtime { @@ -689,7 +691,7 @@ export class Runtime { else { if (!type) throw Error("Cannot infer type from URL content"); const mime_type = type.split("/"); - result = Runtime.castValue(Type.get("std",mime_type[0], mime_type[1].split(/;| /)[0]), content); + result = Runtime.collapseValueCast(await Runtime.castValue(Type.get("std",mime_type[0], mime_type[1].split(/;| /)[0]), content)); } } } @@ -747,7 +749,7 @@ export class Runtime { if (raw) result = [content, mime_type]; else { const type = mime_type.split("/"); - result = Runtime.castValue(Type.get("std",type[0], type[1].split(/;| /)[0]), content); + result = Runtime.collapseValueCast(await Runtime.castValue(Type.get("std",type[0], type[1].split(/;| /)[0]), content)); } } @@ -2261,7 +2263,18 @@ export class Runtime { return this.persistent_memory?.get(scope_identifier) } - /** casts an object, handles all types */ + /** + * Collapses WRAPPED_PROMISE values returned from Runtime.castValue + */ + public static collapseValueCast(value: unknown) { + if (value && value[WRAPPED_PROMISE]) return value[WRAPPED_PROMISE]; + else return value; + } + + /** + * Cast a value to a specific type + * Result must be awaited and collapsed with Runtime.collapseValueCast + */ public static async castValue(type:Type, value:any, context?:any, context_location?:URL, origin:Endpoint = Runtime.endpoint, no_fetch?:boolean, assigningPtrId?: string): Promise { let old_type = Type.ofValue(value); @@ -2272,12 +2285,12 @@ export class Runtime { let new_value:any = UNKNOWN_TYPE; // only handle std namespace / js:Object / js:Symbol - if (type.namespace == "std" || type == Type.js.NativeObject || type == Type.js.Symbol || type == Type.js.RegExp || type == Type.js.MediaStream) { + if (type.namespace == "std" || type == Type.js.NativeObject || type == Type.js.Symbol || type == Type.js.RegExp || type == Type.js.MediaStream || type == Type.js.File || type.root_type == Type.js.TypedArray) { const uncollapsed_old_value = old_value if (old_value instanceof Pointer) old_value = old_value.val; // handle default casts - switch (type) { + switch (type.root_type) { // get case Type.std.Type:{ @@ -2371,6 +2384,37 @@ export class Runtime { else new_value = INVALID; break; } + case Type.js.File: { + if (old_value && typeof old_value == "object") { + new_value = new File([old_value.content], old_value.name, { + type: old_value.type, + lastModified: old_value.lastModified + }); + } + else new_value = INVALID; + break; + } + case Type.js.TypedArray: { + if (old_value instanceof ArrayBuffer) { + switch (type.variation) { + case "u8": new_value = new Uint8Array(old_value); break; + case "u16": new_value = new Uint16Array(old_value); break; + case "u32": new_value = new Uint32Array(old_value); break; + case "u64": new_value = new BigUint64Array(old_value); break; + case "i8": new_value = new Int8Array(old_value); break; + case "i16": new_value = new Int16Array(old_value); break; + case "i32": new_value = new Int32Array(old_value); break; + case "i64": new_value = new BigInt64Array(old_value); break; + case "f32": new_value = new Float32Array(old_value); break; + case "f64": new_value = new Float64Array(old_value); break; + default: new_value = INVALID; + } + } + else new_value = INVALID; + + break; + } + case Type.js.MediaStream: { if (!globalThis.MediaStream) throw new Error("MediaStreams are not supported on this endpoint") if (old_value === VOID || typeof old_value == "object") { @@ -2682,7 +2726,9 @@ export class Runtime { } // return new value - return new_value; + // dont' collapes Promise on return + if (new_value instanceof Promise) return {[WRAPPED_PROMISE]: new_value} + else return new_value; } @@ -2704,6 +2750,9 @@ export class Runtime { let type:Type; + // file (special handling of DX_SERIALIZED inherited from Blob) + if (value instanceof File) return {name: value.name, type: value.type, size: value.size, lastModified: value.lastModified, content: (value as any)[DX_SERIALIZED]}; + // cached serialized (e.g. for mime types) if ((>value)?.[DX_SERIALIZED]) return (>value)[DX_SERIALIZED]; @@ -2952,7 +3001,19 @@ export class Runtime { string = value.toString(); } else if (value instanceof ArrayBuffer || value instanceof TypedArray) { - string = "`"+buffer2hex(value instanceof Uint8Array ? value : new Uint8Array(value instanceof TypedArray ? value.buffer : value), null, null)+"`" + let type = "" + if (value instanceof Uint8Array) type = ""; + else if (value instanceof Uint16Array) type = ""; + else if (value instanceof Uint32Array) type = ""; + else if (value instanceof BigInt64Array) type = ""; + else if (value instanceof Int8Array) type = ""; + else if (value instanceof Int16Array) type = ""; + else if (value instanceof Int32Array) type = ""; + else if (value instanceof BigUint64Array) type = ""; + else if (value instanceof Float32Array) type = ""; + else if (value instanceof Float64Array) type = ""; + + string = type+"`"+buffer2hex(value instanceof Uint8Array ? value : new Uint8Array(value instanceof TypedArray ? value.buffer : value), undefined, null)+"`" } else if (value instanceof Scope) { const spaces = Array(this.FORMAT_INDENT*(depth+1)).join(' '); @@ -3242,14 +3303,14 @@ export class Runtime { let el = INNER_SCOPE.type_casts.pop(); let type:Type | undefined; // iterate over now remaining type casts - while (type = INNER_SCOPE.type_casts.pop()) el = await Runtime.castValue(type, el, INNER_SCOPE.ctx_intern, SCOPE.context_location, SCOPE.origin) + while ((type = INNER_SCOPE.type_casts.pop())) el = await Runtime.castValue(type, el, INNER_SCOPE.ctx_intern, SCOPE.context_location, SCOPE.origin) INNER_SCOPE.active_value = el; } // assignments: // get current active value - let el = INNER_SCOPE.active_value; + const el = INNER_SCOPE.active_value; let did_assignment = false; // make sure endpoint has access (TODO: INNER_SCOPE.active_value should never be set if no access) @@ -4281,6 +4342,8 @@ export class Runtime { const pointer = el instanceof Pointer ? el : Pointer.getByValue(el); if (pointer instanceof Pointer) pointer.assertEndpointCanRead(SCOPE?.sender) + // make sure promise wrappers are collapsed + el = Runtime.collapseValueCast(el) // first make sure pointers are collapsed el = Ref.collapseValue(el) @@ -4419,8 +4482,8 @@ export class Runtime { // apply all casts if (INNER_SCOPE.type_casts) { - let type:Type - while (type = INNER_SCOPE.type_casts.pop()) { + let type:Type|undefined + while ((type = INNER_SCOPE.type_casts.pop())) { // workaround to get pointer that the new cast value will be assigned to const waitingPtr = [...INNER_SCOPE.waiting_ptrs??[]][0]; let ptrId: string|undefined; @@ -5069,7 +5132,7 @@ export class Runtime { // create conjunctive (&) value by extending const base_type = Type.ofValue(val); - const base = await base_type.createDefaultValue(); + const base = Runtime.collapseValueCast(await base_type.createDefaultValue()); DatexObject.extend(base, val); DatexObject.extend(base, el); INNER_SCOPE.active_value = base; diff --git a/types/native_types.ts b/types/native_types.ts index ff9b1ab5..061af52d 100644 --- a/types/native_types.ts +++ b/types/native_types.ts @@ -3,7 +3,7 @@ import { ValueError } from "./errors.ts"; import { Type } from "./type.ts"; import { Pointer } from "../runtime/pointers.ts"; import type { any_class } from "../utils/global_types.ts"; -import { INVALID, NOT_EXISTING } from "../runtime/constants.ts"; +import { DX_TIMEOUT, INVALID, NOT_EXISTING } from "../runtime/constants.ts"; import { Tuple } from "./tuple.ts"; import "../utils/auto_map.ts" @@ -289,6 +289,72 @@ Type.std.Set.setJSInterface({ values: (parent:Set) => [...parent], }) + +const AsyncGenerator = Object.getPrototypeOf(Object.getPrototypeOf((async function*(){})())); +const Generator = Object.getPrototypeOf(Object.getPrototypeOf((function*(){})())) + +Type.js.AsyncGenerator.setJSInterface({ + no_instanceof: true, + class: AsyncGenerator, + detect_class: (val) => AsyncGenerator.isPrototypeOf(val) || Generator.isPrototypeOf(val), + + is_normal_object: true, + proxify_children: true, + + serialize: value => { + return { + next: (...args: []|[unknown]) => value.next(...args), + return: (v: any) => value.return(v), + throw: (v: any) => value.throw(v), + } + }, + + + cast: value => { + if (value && value.next && value.return && value.throw) { + return async function*() { + let res = await value.next(); + while (!res.done) { + yield res.value; + res = await value.next(); + } + return value.return(); + }() + } + else return INVALID; + } +}) + + +Type.js.Promise.setJSInterface({ + class: Promise, + + is_normal_object: true, + proxify_children: true, + + serialize: value => { + return { + then: (onFulfilled:any, onRejected:any) => value.then(onFulfilled, onRejected), + catch: (onRejected:any) => value.catch(onRejected) + } + }, + + + cast: value => { + if (value && value.then && value.catch) { + (value.then as any)[DX_TIMEOUT] = Infinity; + (value.catch as any)[DX_TIMEOUT] = Infinity; + return new Promise((resolve, reject) => { + value + .then(resolve) + .catch(reject); + }) + } + else return INVALID; + } +}) + + // override set prototype to make sure all sets are sorted at runtime when calling [...set] (TODO is that good?) // const set_iterator = Set.prototype[Symbol.iterator]; // Set.prototype[Symbol.iterator] = function() { diff --git a/types/type.ts b/types/type.ts index d19bccdc..ae6b47bd 100644 --- a/types/type.ts +++ b/types/type.ts @@ -256,6 +256,10 @@ export class Type extends ExtensibleFunction { return (assign_to_object instanceof DatexObject ? DatexObject.seal(assign_to_object) : assign_to_object); } + + /** + * Result must be awaited and collapsed with Runtime.collapseValueCast + */ public createDefaultValue(context?:any, origin:Endpoint = Runtime.endpoint, context_location?: URL): Promise{ return Runtime.castValue(this, VOID, context, context_location, origin); } @@ -814,11 +818,11 @@ export class Type extends ExtensibleFunction { if (value?.[DX_TYPE]) return value[DX_TYPE]; // get type from pointer - let type:Type - if (type = Pointer.getByValue(value)?.type) return type; + let type:Type|undefined + if ((type = Pointer.getByValue(value)?.type)) return type; // get custom type - let custom_type = JSInterface.getValueDatexType(value); + const custom_type = JSInterface.getValueDatexType(value); if (!custom_type) { if (value === VOID) return Type.std.void; @@ -835,12 +839,32 @@ export class Type extends ExtensibleFunction { if (value instanceof RegExp) return Type.js.RegExp as unknown as Type; if (globalThis.MediaStream && value instanceof MediaStream) return Type.js.MediaStream as unknown as Type; - if (value instanceof ArrayBuffer || value instanceof TypedArray) return >Type.std.buffer; + if (value instanceof TypedArray) { + switch (value.constructor) { + case Uint8Array: return Type.js.TypedArray.getVariation('u8') as unknown as Type; + case Uint16Array: return Type.js.TypedArray.getVariation('u16') as unknown as Type; + case Uint32Array: return Type.js.TypedArray.getVariation('u32') as unknown as Type; + case BigUint64Array: return Type.js.TypedArray.getVariation('u64') as unknown as Type; + case Int8Array: return Type.js.TypedArray.getVariation('i8') as unknown as Type; + case Int16Array: return Type.js.TypedArray.getVariation('i16') as unknown as Type; + case Int32Array: return Type.js.TypedArray.getVariation('i32') as unknown as Type; + case BigInt64Array: return Type.js.TypedArray.getVariation('i64') as unknown as Type; + case Float32Array: return Type.js.TypedArray.getVariation('f32') as unknown as Type; + case Float64Array: return Type.js.TypedArray.getVariation('f64') as unknown as Type; + default: throw new ValueError("Invalid TypedArray"); + } + } + + if (value instanceof ArrayBuffer) return >Type.std.buffer; if (value instanceof Tuple) return >Type.std.Tuple; if (value instanceof Array) return >Type.std.Array; + if (value instanceof File) return Type.js.File as unknown as Type; + // mime types - if (value instanceof Blob) return Type.get("std", ...<[string, string]>value.type.split("/")) + if (value instanceof Blob) { + return Type.get("std", ...(value.type ? value.type.split("/") : ["application","octet-stream"]) as [string, string]) + } if (Runtime.mime_type_classes.has(value.constructor)) return Type.get("std", ...<[string, string]>Runtime.mime_type_classes.get(value.constructor).split("/")) if (value instanceof SyntaxError) return Type.std.SyntaxError; @@ -908,10 +932,27 @@ export class Type extends ExtensibleFunction { if (_forClass == globalThis.Boolean || globalThis.Boolean.isPrototypeOf(_forClass)) return >Type.std.boolean; if (_forClass == Symbol || Symbol.isPrototypeOf(_forClass)) return >Type.js.Symbol; if (_forClass == RegExp || RegExp.isPrototypeOf(_forClass)) return Type.js.RegExp as unknown as Type; + if (_forClass == File || File.isPrototypeOf(_forClass)) return Type.js.File as unknown as Type; if (globalThis.MediaStream && _forClass == MediaStream) return Type.js.MediaStream as unknown as Type; if (_forClass == WeakRef || WeakRef.isPrototypeOf(_forClass)) return >Type.std.WeakRef; - if (_forClass == ArrayBuffer || TypedArray.isPrototypeOf(_forClass)) return >Type.std.buffer; + if (TypedArray.isPrototypeOf(_forClass)) { + switch (_forClass) { + case Uint8Array: return Type.js.TypedArray.getVariation('u8') as unknown as Type; + case Uint16Array: return Type.js.TypedArray.getVariation('u16') as unknown as Type; + case Uint32Array: return Type.js.TypedArray.getVariation('u32') as unknown as Type; + case BigUint64Array: return Type.js.TypedArray.getVariation('u64') as unknown as Type; + case Int8Array: return Type.js.TypedArray.getVariation('i8') as unknown as Type; + case Int16Array: return Type.js.TypedArray.getVariation('i16') as unknown as Type; + case Int32Array: return Type.js.TypedArray.getVariation('i32') as unknown as Type; + case BigInt64Array: return Type.js.TypedArray.getVariation('i64') as unknown as Type; + case Float32Array: return Type.js.TypedArray.getVariation('f32') as unknown as Type; + case Float64Array: return Type.js.TypedArray.getVariation('f64') as unknown as Type; + default: throw new ValueError("Invalid TypedArray"); + } + } + + if (_forClass == ArrayBuffer) return >Type.std.buffer; if (_forClass == Tuple || Tuple.isPrototypeOf(_forClass)) return >Type.std.Tuple; if (_forClass == Array || Array.isPrototypeOf(_forClass)) return >Type.std.Array; @@ -971,7 +1012,11 @@ export class Type extends ExtensibleFunction { TransferableFunction: Type.get("js:Function"), Symbol: Type.get("js:Symbol"), RegExp: Type.get("js:RegExp"), - MediaStream: Type.get("js:MediaStream") + MediaStream: Type.get("js:MediaStream"), + File: Type.get("js:File"), + TypedArray: Type.get("js:TypedArray"), + AsyncGenerator: Type.get("js:AsyncGenerator"), + Promise: Type.get>("js:Promise") } /** diff --git a/utils/global_values.ts b/utils/global_values.ts index bbb1624d..8c9898a9 100644 --- a/utils/global_values.ts +++ b/utils/global_values.ts @@ -5,6 +5,7 @@ import {Logger} from "./logger.ts"; if (globalThis.process) throw new Error("node.js is currently not supported - use deno instead") export const TypedArray:typeof Uint8Array|typeof Uint16Array|typeof Uint32Array|typeof Int8Array|typeof Int16Array|typeof Int32Array|typeof BigInt64Array|typeof BigUint64Array|typeof Float32Array|typeof Float64Array = Object.getPrototypeOf(Uint8Array); +export type TypedArray = Uint8Array|Uint16Array|Uint32Array|Int8Array|Int16Array|Int32Array|BigInt64Array|BigUint64Array|Float32Array|Float64Array; // @ts-ignore const is_worker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope); From e30ddd0c01b1326969352216baf8546842182499 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:17:12 +0100 Subject: [PATCH 15/29] fix formatting --- docs/manual/11 Types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index b7bc7db6..3e16ff75 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -62,7 +62,7 @@ Datex.Type.std.Any === any | **Promise** | Full | js:Promise | No (Immutable) | - | | **URL** | Partial | std:url | No | URL mutations are currently not synchronized | | **Date** | Partial | std:time | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | -| **Blob** | Full | std:*/*, | No (Immutable) | - | +| **Blob** | Full | std:\*/\**, | No (Immutable) | - | | **File** | Full | js:File | No (Immutable) | - | | **RegExp** | Partial | js:RegExp | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | | **WeakRef** | Full | std:WeakRef | No (Immutable) | - | From 1dde375104b0e2fcb907a3d01301e1adad193d38 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:17:25 +0100 Subject: [PATCH 16/29] fix formatting --- docs/manual/11 Types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index 3e16ff75..66ab0943 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -62,7 +62,7 @@ Datex.Type.std.Any === any | **Promise** | Full | js:Promise | No (Immutable) | - | | **URL** | Partial | std:url | No | URL mutations are currently not synchronized | | **Date** | Partial | std:time | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | -| **Blob** | Full | std:\*/\**, | No (Immutable) | - | +| **Blob** | Full | std:\*/\*, | No (Immutable) | - | | **File** | Full | js:File | No (Immutable) | - | | **RegExp** | Partial | js:RegExp | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | | **WeakRef** | Full | std:WeakRef | No (Immutable) | - | From ffdc762f2b4290d53bd18b36098ef885e5fc2732 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:21:12 +0100 Subject: [PATCH 17/29] improve formatting --- docs/manual/11 Types.md | 90 ++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index 66ab0943..e63adca6 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -28,51 +28,51 @@ Datex.Type.std.Any === any ``` ## Supported built-in JS and Web types -| **JS Type** | **Support** | **DATEX Type** | **Synchronizable** | **Limitations** | -|:-------------------------------|:----------------------|:---------------|:-------------------|:------------------------------------------------------------------------------------------| -| **string** | Full | std:text | Yes 1) | 3) | -| **number** | Full | std:decimal | Yes 1) | 3) | -| **bigint** | Full | std:integer | Yes 1) | 3) | -| **boolean** | Full | std:boolean | Yes 1) | 3) | -| **null** | Full | std:null | Yes 1) | - | -| **undefined** | Full | std:void | Yes 1) | - | -| **symbol** | Partial | js:Symbol | Yes 1) | Registered and well-known symbols are not yet supported | -| **Object (without prototype)** | Full | std:Object | Yes | Objects with prototypes other than `Object.prototype` or `null` are mapped to `js:Object` | -| **Object** | Sufficient | js:Object | Yes | No synchronisation for nested objects per default | -| **Array** | Full | std:Array | Yes | - | -| **Set** | Full | std:Set | Yes | - | -| **Map** | Full | std:Map | Yes | - | -| **WeakSet** | None | - | - | Cannot be implemented because `WeakSet` internals are not accessible. Alternative: `StorageWeakSet` | -| **WeakMap** | None | - | - | Cannot be implemented because `WeakMap` internals are not accessible. Alternative: `StorageWeakMap` | -| **Function** | Sufficient | std:Function | No (Immutable) | Functions always return a Promise, even if they are synchronous | -| **AsyncFunction** | Sufficient | std:Function | No (Immutable) | - | -| **Generator** | Sufficient | js:AsyncGenerator | - | Generators are always mapped to AsyncGenerators | -| **AsyncGenerator** | Full | js:AsyncGenerator | - | - | -| **ArrayBuffer** | Partial | std:buffer | No | ArrayBuffer mutations are currently not synchronized | -| **Uint8Array** | Partial | js:TypedArray/u8 | No | ArrayBuffer mutations are currently not synchronized | -| **Uint16Array** | Partial | js:TypedArray/u16 | No | ArrayBuffer mutations are currently not synchronized | -| **Uint32Array** | Partial | js:TypedArray/u32 | No | ArrayBuffer mutations are currently not synchronized | -| **BigUint64Array** | Partial | js:TypedArray/u64 | No | ArrayBuffer mutations are currently not synchronized | -| **Int8Array** | Partial | js:TypedArray/i8 | No | ArrayBuffer mutations are currently not synchronized | -| **Int16Array** | Partial | js:TypedArray/i16 | No | ArrayBuffer mutations are currently not synchronized | -| **Int32Array** | Partial | js:TypedArray/i32 | No | ArrayBuffer mutations are currently not synchronized | -| **BigInt64Array** | Partial | js:TypedArray/i64 | No | ArrayBuffer mutations are currently not synchronized | -| **Float32Array** | Partial | js:TypedArray/f32 | No | ArrayBuffer mutations are currently not synchronized | -| **Float64Array** | Partial | js:TypedArray/f64 | No | ArrayBuffer mutations are currently not synchronized | -| **Promise** | Full | js:Promise | No (Immutable) | - | -| **URL** | Partial | std:url | No | URL mutations are currently not synchronized | -| **Date** | Partial | std:time | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | -| **Blob** | Full | std:\*/\*, | No (Immutable) | - | -| **File** | Full | js:File | No (Immutable) | - | -| **RegExp** | Partial | js:RegExp | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | -| **WeakRef** | Full | std:WeakRef | No (Immutable) | - | -| **MediaStream** | Partial | js:MediaStream | Yes | MediaStreams are only supported in browsers that provide a [WebRTC API](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) | -| **Error** | Partial | std:Error | No | Error subclasses are not correctly mapped | -| **HTMLElement** | Partial 2) | std:html | No | HTML element mutations are currently not synchronized | -| **SVGElement** | Partial 2) | std:svg | No | SVG element mutations are currently not synchronized | -| **MathMLElement** | Partial 2) | std:mathml | No | MathML element mutations are currently not synchronized | -| **Document** | Partial 2) | std:htmldocument | No | Document mutations are currently not synchronized | -| **DocumentFragment** | Partial 2) | std:htmlfragment | No | DocumentFragment mutations are currently not synchronized | +| **JS Type** | **Support** | **DATEX Type** | **Synchronizable** | **Limitations** | +|:-------------------------------|:----------------------|:----------------|:-------------------|:------------------------------------------------------------------------------------------| +| **string** | Full | `std:text` | Yes 1) | 3) | +| **number** | Full | `std:decimal` | Yes 1) | 3) | +| **bigint** | Full | `std:integer` | Yes 1) | 3) | +| **boolean** | Full | `std:boolean` | Yes 1) | 3) | +| **null** | Full | `std:null` | Yes 1) | - | +| **undefined** | Full | `std:void` | Yes 1) | - | +| **symbol** | Partial | `js:Symbol` | Yes 1) | Registered and well-known symbols are not yet supported | +| **Object (without prototype)** | Full | `std:Object` | Yes | Objects with prototypes other than `Object.prototype` or `null` are mapped to `js:Object` | +| **Object** | Sufficient | `js:Object` | Yes | No synchronisation for nested objects per default | +| **Array** | Full | `std:Array` | Yes | - | +| **Set** | Full | `std:Set` | Yes | - | +| **Map** | Full | `std:Map` | Yes | - | +| **WeakSet** | None | - | - | Cannot be implemented because `WeakSet` internals are not accessible. Alternative: `StorageWeakSet` | +| **WeakMap** | None | - | - | Cannot be implemented because `WeakMap` internals are not accessible. Alternative: `StorageWeakMap` | +| **Function** | Sufficient | `std:Function` | No (Immutable) | Functions always return a Promise, even if they are synchronous | +| **AsyncFunction** | Sufficient | `std:Function` | No (Immutable) | - | +| **Generator** | Sufficient | `js:AsyncGenerator` | - | Generators are always mapped to AsyncGenerators | +| **AsyncGenerator** | Full | `js:AsyncGenerator` | - | - | +| **ArrayBuffer** | Partial | `std:buffer` | No | ArrayBuffer mutations are currently not synchronized | +| **Uint8Array** | Partial | `js:TypedArray/u8` | No | ArrayBuffer mutations are currently not synchronized | +| **Uint16Array** | Partial | `js:TypedArray/u16` | No | ArrayBuffer mutations are currently not synchronized | +| **Uint32Array** | Partial | `js:TypedArray/u32` | No | ArrayBuffer mutations are currently not synchronized | +| **BigUint64Array** | Partial | `js:TypedArray/u64` | No | ArrayBuffer mutations are currently not synchronized | +| **Int8Array** | Partial | `js:TypedArray/i8` | No | ArrayBuffer mutations are currently not synchronized | +| **Int16Array** | Partial | `js:TypedArray/i16` | No | ArrayBuffer mutations are currently not synchronized | +| **Int32Array** | Partial | `js:TypedArray/i32` | No | ArrayBuffer mutations are currently not synchronized | +| **BigInt64Array** | Partial | `js:TypedArray/i64` | No | ArrayBuffer mutations are currently not synchronized | +| **Float32Array** | Partial | `js:TypedArray/f32` | No | ArrayBuffer mutations are currently not synchronized | +| **Float64Array** | Partial | `js:TypedArray/f64` | No | ArrayBuffer mutations are currently not synchronized | +| **Promise** | Full | `js:Promise` | No (Immutable) | - | +| **URL** | Partial | `std:url` | No | URL mutations are currently not synchronized | +| **Date** | Partial | `std:time` | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | +| **Blob** | Full | `std:\*/\*,` | No (Immutable) | - | +| **File** | Full | `js:File` | No (Immutable) | - | +| **RegExp** | Partial | `js:RegExp` | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | +| **WeakRef** | Full | `std:WeakRef` | No (Immutable) | - | +| **MediaStream** | Partial | `js:MediaStream` | Yes | MediaStreams are only supported in browsers that provide a [WebRTC API](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) | +| **Error** | Partial | `std:Error` | No | Error subclasses are not correctly mapped | +| **HTMLElement** | Partial 2) | `std:html` | No | HTML element mutations are currently not synchronized | +| **SVGElement** | Partial 2) | `std:svg` | No | SVG element mutations are currently not synchronized | +| **MathMLElement** | Partial 2) | `std:mathml` | No | MathML element mutations are currently not synchronized | +| **Document** | Partial 2) | `std:htmldocument` | No | Document mutations are currently not synchronized | +| **DocumentFragment** | Partial 2) | `std:htmlfragment` | No | DocumentFragment mutations are currently not synchronized | 1) Primitive JS values are immutable and cannot be synchronized on their own, but when wrapped in a Ref.
From 90939cb473830a6fb69d6ceec4e2e26c146af2b8 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:22:10 +0100 Subject: [PATCH 18/29] update table --- docs/manual/11 Types.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index e63adca6..efcdb732 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -46,8 +46,8 @@ Datex.Type.std.Any === any | **WeakMap** | None | - | - | Cannot be implemented because `WeakMap` internals are not accessible. Alternative: `StorageWeakMap` | | **Function** | Sufficient | `std:Function` | No (Immutable) | Functions always return a Promise, even if they are synchronous | | **AsyncFunction** | Sufficient | `std:Function` | No (Immutable) | - | -| **Generator** | Sufficient | `js:AsyncGenerator` | - | Generators are always mapped to AsyncGenerators | -| **AsyncGenerator** | Full | `js:AsyncGenerator` | - | - | +| **Generator** | Sufficient | `js:AsyncGenerator` | No (Immutable) | Generators are always mapped to AsyncGenerators | +| **AsyncGenerator** | Full | `js:AsyncGenerator` | No (Immutable) | - | | **ArrayBuffer** | Partial | `std:buffer` | No | ArrayBuffer mutations are currently not synchronized | | **Uint8Array** | Partial | `js:TypedArray/u8` | No | ArrayBuffer mutations are currently not synchronized | | **Uint16Array** | Partial | `js:TypedArray/u16` | No | ArrayBuffer mutations are currently not synchronized | From aabe9e9e4365f71a2e61522629e962cbd1d93fa7 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:23:28 +0100 Subject: [PATCH 19/29] update docs --- docs/manual/11 Types.md | 56 ++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index efcdb732..614a77d4 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -1,34 +1,10 @@ # Types -The DATEX Runtime comes with its own type system which can be mapped to JavaScript types. -DATEX types can be access via `Datex.Type`. +The DATEX Runtime comes with its own type system which is mapped to JavaScript types. +DATEX types can be accessed via `Datex.Type`. -## Std types -The `Datex.Type.std` namespace contains all the builtin (*std*) DATEX types that can be accessed as runtime values, e.g.: -```ts -// primitive types -Datex.Type.std.text -Datex.Type.std.integer -Datex.Type.std.integer_8 -Datex.Type.std.integer_64 - -// complex types -Datex.Type.std.Array -Datex.Type.std.Array_8 -Datex.Type.std.Function -``` - -There also exist globally accessible short names for some of the types, matching their respective typescript names: -```ts -Datex.Type.std.text === string -Datex.Type.std.decimal === number -Datex.Type.std.integer === bigint -Datex.Type.std.boolean === boolean -Datex.Type.std.Any === any -``` - -## Supported built-in JS and Web types -| **JS Type** | **Support** | **DATEX Type** | **Synchronizable** | **Limitations** | +## Supported built-in JavaScript and Web types +| **JavaScript Type** | **Support** | **DATEX Type** | **Synchronizable** | **Limitations** | |:-------------------------------|:----------------------|:----------------|:-------------------|:------------------------------------------------------------------------------------------| | **string** | Full | `std:text` | Yes 1) | 3) | | **number** | Full | `std:decimal` | Yes 1) | 3) | @@ -79,6 +55,30 @@ Datex.Type.std.Any === any 2) [UIX-DOM](https://github.com/unyt-org/uix-dom) required
3) The corresponding object values of primitive values (e.g. `new Number()` for `number`) are not supported
+## Std types +The `Datex.Type.std` namespace contains all the builtin (*std*) DATEX types that can be accessed as runtime values, e.g.: +```ts +// primitive types +Datex.Type.std.text +Datex.Type.std.integer +Datex.Type.std.integer_8 +Datex.Type.std.integer_64 + +// complex types +Datex.Type.std.Array +Datex.Type.std.Array_8 +Datex.Type.std.Function +``` + +There also exist globally accessible short names for some of the types, matching their respective typescript names: +```ts +Datex.Type.std.text === string +Datex.Type.std.decimal === number +Datex.Type.std.integer === bigint +Datex.Type.std.boolean === boolean +Datex.Type.std.Any === any +``` + ## Special JS types Most builtin JavaScript types, like Map, Set or Array have equivalent types in the DATEX std library. From 649fb536db2839b89c814a0e95792952346d16bf Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:25:34 +0100 Subject: [PATCH 20/29] update docs --- docs/manual/11 Types.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index 614a77d4..34761bca 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -13,8 +13,8 @@ DATEX types can be accessed via `Datex.Type`. | **null** | Full | `std:null` | Yes 1) | - | | **undefined** | Full | `std:void` | Yes 1) | - | | **symbol** | Partial | `js:Symbol` | Yes 1) | Registered and well-known symbols are not yet supported | -| **Object (without prototype)** | Full | `std:Object` | Yes | Objects with prototypes other than `Object.prototype` or `null` are mapped to `js:Object` | -| **Object** | Sufficient | `js:Object` | Yes | No synchronisation for nested objects per default | +| **Object** | Full | `std:Object` | Yes | Objects with prototypes other than `Object.prototype` or `null` are mapped to `js:Object` | +| **Object (with prototype)** | Sufficient | `js:Object` | Yes | No synchronisation for nested objects per default | | **Array** | Full | `std:Array` | Yes | - | | **Set** | Full | `std:Set` | Yes | - | | **Map** | Full | `std:Map` | Yes | - | @@ -38,7 +38,7 @@ DATEX types can be accessed via `Datex.Type`. | **Promise** | Full | `js:Promise` | No (Immutable) | - | | **URL** | Partial | `std:url` | No | URL mutations are currently not synchronized | | **Date** | Partial | `std:time` | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | -| **Blob** | Full | `std:\*/\*,` | No (Immutable) | - | +| **Blob** | Full | `std:*/*,` | No (Immutable) | - | | **File** | Full | `js:File` | No (Immutable) | - | | **RegExp** | Partial | `js:RegExp` | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | | **WeakRef** | Full | `std:WeakRef` | No (Immutable) | - | From 8d8431fa9dbbe67b06161358adb60cebaeff02d2 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 18:28:09 +0100 Subject: [PATCH 21/29] update docs --- docs/manual/11 Types.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index 34761bca..dca3aff7 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -117,7 +117,7 @@ In contrast to `std:Object`, `js:Object` is used for JavaScript object with a pr Examples for `std:Object`s: * A plain object like `{x: 1, y: new Set()}` - * Object with `null` prototype `{__proto__: null, x: 1}` + * Object with `null` prototype (e.g. `{__proto__: null, x: 1}`) Examples for `js:Object`s: * A builtin object like `console` @@ -138,7 +138,7 @@ Backend (Deno) endpoints are not yet supported due to missing support for WebRTC ## Structs -The `struct` helper function allows you to define DATEX types with a +The `struct` helper function allows you to define custom DATEX types with a fixed structure. All `struct` values are represented as plain objects in JavaScripts. They can take any DATEX compatible value as properties. @@ -150,7 +150,7 @@ structs are more efficient than plain objects. **Usage**: ```ts -import { struct } from "datex-core-legacy/types/struct.ts"; +import { struct, inferType } from "datex-core-legacy/types/struct.ts"; // struct definition const MyStruct = struct({ From bb5399c29c69934791d948c220ea698123f6f679 Mon Sep 17 00:00:00 2001 From: benStre Date: Thu, 14 Mar 2024 23:41:11 +0100 Subject: [PATCH 22/29] throw useful error when promise was restored from storage --- types/native_types.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/types/native_types.ts b/types/native_types.ts index 061af52d..03a5741a 100644 --- a/types/native_types.ts +++ b/types/native_types.ts @@ -325,7 +325,6 @@ Type.js.AsyncGenerator.setJSInterface({ } }) - Type.js.Promise.setJSInterface({ class: Promise, @@ -334,8 +333,22 @@ Type.js.Promise.setJSInterface({ serialize: value => { return { - then: (onFulfilled:any, onRejected:any) => value.then(onFulfilled, onRejected), - catch: (onRejected:any) => value.catch(onRejected) + then: (onFulfilled:any, onRejected:any) => { + // fails if promise was serialized and js function was reconstructed locally + try {value} + catch { + throw new Error("Promise cannot be restored - storing Promises persistently is not supported") + } + return value.then(onFulfilled, onRejected) + }, + catch: (onRejected:any) => { + // fails if promise was serialized and js function was reconstructed locally + try {value} + catch { + throw new Error("Promise cannot be restored - storing Promises persistently is not supported") + } + return value.catch(onRejected) + } } }, From 4672036b766d542ee792b403f3184bceb005e0c3 Mon Sep 17 00:00:00 2001 From: benStre Date: Fri, 15 Mar 2024 11:44:00 +0100 Subject: [PATCH 23/29] handle recursive blob caching --- compiler/compiler.ts | 16 ++++++++++++---- runtime/runtime.ts | 5 ++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/compiler/compiler.ts b/compiler/compiler.ts index 1f289461..c9b6398c 100644 --- a/compiler/compiler.ts +++ b/compiler/compiler.ts @@ -5164,6 +5164,17 @@ export class Compiler { ) : SCOPE.buffer; } + /** + * Workaround: recursively cache all blob values in the iterable + */ + static cacheValues(iterable: Iterable, promises:Promise[] = []): Promise[] { + for (const val of iterable) { + if (val instanceof Blob) promises.push(Runtime.cacheValue(val)); + else if (typeof val == "object" && (val as any)?.[Symbol.iterator]) this.cacheValues((val as any), promises); + } + return promises; + } + // compile loop static async compileLoop(SCOPE:compiler_scope):Promise> { @@ -5172,10 +5183,7 @@ export class Compiler { ({ WebRTCInterface } = await import("../network/communication-interfaces/webrtc-interface.ts")); // cache inserted blob values - const promises = []; - for (const val of SCOPE.data??[]) { - if (val instanceof Blob) promises.push(Runtime.cacheValue(val)); - } + const promises = SCOPE.data ? this.cacheValues(SCOPE.data) : []; if (promises.length) await Promise.all(promises); const body_compile_measure = RuntimePerformance.enabled ? RuntimePerformance.startMeasure("compile time", "body") : undefined; diff --git a/runtime/runtime.ts b/runtime/runtime.ts index 74d17db7..919b8f87 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -2751,7 +2751,10 @@ export class Runtime { let type:Type; // file (special handling of DX_SERIALIZED inherited from Blob) - if (value instanceof File) return {name: value.name, type: value.type, size: value.size, lastModified: value.lastModified, content: (value as any)[DX_SERIALIZED]}; + if (value instanceof File) { + if (!(value as any)[DX_SERIALIZED]) throw new RuntimeError("Cannot serialize file without cached content"); + return {name: value.name, type: value.type, size: value.size, lastModified: value.lastModified, content: (value as any)[DX_SERIALIZED]}; + } // cached serialized (e.g. for mime types) if ((>value)?.[DX_SERIALIZED]) return (>value)[DX_SERIALIZED]; From d9ed214e65cc2e59e28b582b297ba0f35b095a42 Mon Sep 17 00:00:00 2001 From: benStre Date: Fri, 15 Mar 2024 20:17:04 +0100 Subject: [PATCH 24/29] remove DX_SERIALIZED after some time --- js_adapter/js_class_adapter.ts | 5 ++++- runtime/runtime.ts | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/js_adapter/js_class_adapter.ts b/js_adapter/js_class_adapter.ts index 2a93ef2f..77ea763a 100644 --- a/js_adapter/js_class_adapter.ts +++ b/js_adapter/js_class_adapter.ts @@ -288,7 +288,10 @@ export class Decorators { originalClass[METADATA]?.[Decorators.FORCE_TYPE] && Object.hasOwn(originalClass[METADATA]?.[Decorators.FORCE_TYPE], 'constructor') ) normalizedType = originalClass[METADATA]?.[Decorators.FORCE_TYPE]?.constructor - else normalizedType = Type.get("ext", originalClass.name.replace(/^_/, '')); // remove leading _ from type name + else { + if (!originalClass.name) throw new Error("Cannot create DATEX type mapping for an anonymous class") + normalizedType = Type.get("ext", originalClass.name.replace(/^_/, '')); // remove leading _ from type name + } if (!callerFile && client_type == "deno" && normalizedType.namespace !== "std") { callerFile = getCallerInfo()?.[3]?.file ?? undefined; diff --git a/runtime/runtime.ts b/runtime/runtime.ts index 919b8f87..b4354cf1 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -2734,7 +2734,11 @@ export class Runtime { static async cacheValue(value:unknown){ if (value instanceof Blob) { - (>value)[DX_SERIALIZED] = await value.arrayBuffer(); + if (!(value as any)[DX_SERIALIZED]) { + (value as any)[DX_SERIALIZED] = await value.arrayBuffer(); + // remove serialized value cache after 1 minute + setTimeout(()=>{delete (value as any)[DX_SERIALIZED]}, 60_000); + } } else { throw new ValueError("Cannot cache value of type " + Type.ofValue(value)); From 335ffe4c8367fd69b0c44dd37f4e66f0c552e018 Mon Sep 17 00:00:00 2001 From: benStre Date: Sun, 17 Mar 2024 19:22:13 +0100 Subject: [PATCH 25/29] fix app urls --- network/unyt.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/network/unyt.ts b/network/unyt.ts index 8a9ce22e..c8f22cc6 100644 --- a/network/unyt.ts +++ b/network/unyt.ts @@ -88,8 +88,9 @@ export class Unyt { if (ownDomain && domains.includes(ownDomain)) { domains.splice(domains.indexOf(ownDomain),1); } + // add own domain to the front - domains.unshift(ownDomain + (this.using_http_over_datex?ESCAPE_SEQUENCES.UNYT_CYAN+' (HTTP-over-DATEX)'+ESCAPE_SEQUENCES.RESET:'')); + if (ownDomain) domains.unshift(ownDomain + (this.using_http_over_datex?ESCAPE_SEQUENCES.UNYT_CYAN+' (HTTP-over-DATEX)'+ESCAPE_SEQUENCES.RESET:'')); return domains; } From 28e550ec6b7ac4b06252f65c2884085ea564d672 Mon Sep 17 00:00:00 2001 From: benStre Date: Mon, 18 Mar 2024 20:33:25 +0100 Subject: [PATCH 26/29] fix url content loading for arraybuffers, reset page on fatal error --- runtime/crypto.ts | 10 ++++++++-- runtime/display.ts | 5 +++++ runtime/pointers.ts | 2 +- runtime/runtime.ts | 3 ++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/runtime/crypto.ts b/runtime/crypto.ts index 3a3393e4..d3982173 100644 --- a/runtime/crypto.ts +++ b/runtime/crypto.ts @@ -75,7 +75,10 @@ export class Crypto { /** Sign + Verify */ static async sign(buffer:ArrayBuffer): Promise { - if (!this.available) throw new SecurityError("Cannot sign DATEX requests, missing private keys"); + if (!this.available) { + displayFatalError('missing-private-keys'); + throw new SecurityError("Cannot sign DATEX requests, missing private keys"); + } return await crypto.subtle.sign(this.sign_key_options, this.rsa_sign_key, buffer); } static async verify(data:ArrayBuffer, signature:ArrayBuffer, endpoint:Endpoint): Promise { @@ -86,7 +89,10 @@ export class Crypto { /** Encypt + Decrypt (RSA) */ static async encrypt(buffer:ArrayBuffer, endpoint:Endpoint): Promise { - if (!this.available) throw new SecurityError("Cannot encrypt DATEX requests, missing private keys"); + if (!this.available) { + displayFatalError('missing-private-keys'); + throw new SecurityError("Cannot encrypt DATEX requests, missing private keys"); + } const keys = await this.getKeysForEndpoint(endpoint); if (!keys || keys[1]==null) throw new SecurityError("Cannot encrypt DATEX requests, could not get keys for endpoint"); return await crypto.subtle.encrypt("RSA-OAEP", keys[1], buffer); diff --git a/runtime/display.ts b/runtime/display.ts index d57f6b94..f6f88892 100644 --- a/runtime/display.ts +++ b/runtime/display.ts @@ -35,6 +35,11 @@ function setup() { export function displayFatalError(code:string, reset_btn = true) { + + // disable error screen (at least for now, immediately reset page) + errorReset(); + return; + // @ts-ignore if (client_type !== "deno" && globalThis.window && globalThis.document) { // @ts-ignore diff --git a/runtime/pointers.ts b/runtime/pointers.ts index ab598b13..1749eeb2 100644 --- a/runtime/pointers.ts +++ b/runtime/pointers.ts @@ -1436,7 +1436,7 @@ export class Pointer extends Ref { private static loading_pointers:Map, scopeList: WeakSet}> = new Map(); // load from storage or request from remote endpoint if pointer not yet loaded - static load(id:string|Uint8Array, SCOPE?:datex_scope, only_load_local = false, sender_knows_pointer = true, allow_failure = true): Promise|Pointer|LazyPointer { + static load(id:string|Uint8Array, SCOPE?:datex_scope, only_load_local = false, sender_knows_pointer = true, allow_failure = false): Promise|Pointer|LazyPointer { // pointer already exists const existing_pointer = Pointer.get(id); diff --git a/runtime/runtime.ts b/runtime/runtime.ts index b4354cf1..d5504367 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -740,7 +740,7 @@ export class Runtime { } else { if (!mime) throw Error("Cannot infer type from URL content - missing mime module"); - const content = (await getFileContent(url, true, true)); + const content = ((await getFileContent(url, true, true)) as Uint8Array).buffer; const ext = url.toString().match(/\.[^./]*$/)?.[0].replace(".",""); if (!ext) throw Error("Cannot infer type from URL content (no extension)"); const mime_type = mime.getType(ext); @@ -2312,6 +2312,7 @@ export class Runtime { if (old_value === VOID) new_value = globalThis.String() else if (old_value instanceof Markdown) new_value = old_value.toString(); else if (old_value instanceof ArrayBuffer) new_value = Runtime.utf8_decoder.decode(old_value); // cast to + else if (old_value instanceof TypedArray) new_value = Runtime.utf8_decoder.decode(old_value.buffer); // cast to else if (old_value instanceof Blob) new_value = await old_value.text() else new_value = this.valueToDatexString(value, false, true); break; From fe2562e524a0faa268b6cc0d8d2f4d966b689227 Mon Sep 17 00:00:00 2001 From: benStre Date: Mon, 18 Mar 2024 21:47:17 +0100 Subject: [PATCH 27/29] more efficient pointer lookup, warning for invalid html element pointer state --- compiler/compiler.ts | 6 +++++- runtime/pointers.ts | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/compiler/compiler.ts b/compiler/compiler.ts index c9b6398c..1cdecfe9 100644 --- a/compiler/compiler.ts +++ b/compiler/compiler.ts @@ -27,7 +27,7 @@ import { BinaryCode } from "./binary_codes.ts"; import { Scope } from "../types/scope.ts"; import { ProtocolDataType } from "./protocol_types.ts"; import { Quantity } from "../types/quantity.ts"; -import { EXTENDED_OBJECTS, INHERITED_PROPERTIES, VOID, SLOT_WRITE, SLOT_READ, SLOT_EXEC, NOT_EXISTING, SLOT_GET, SLOT_SET, DX_IGNORE, DX_BOUND_LOCAL_SLOT, DX_REPLACE } from "../runtime/constants.ts"; +import { EXTENDED_OBJECTS, INHERITED_PROPERTIES, VOID, SLOT_WRITE, SLOT_READ, SLOT_EXEC, NOT_EXISTING, SLOT_GET, SLOT_SET, DX_IGNORE, DX_BOUND_LOCAL_SLOT, DX_REPLACE, DX_PTR } from "../runtime/constants.ts"; import { arrayBufferToBase64, base64ToArrayBuffer, buffer2hex, hex2buffer } from "../utils/utils.ts"; import { RuntimePerformance } from "../runtime/performance_measure.ts"; import { Conjunction, Disjunction, Logical, Negation } from "../types/logic.ts"; @@ -2910,6 +2910,10 @@ export class Compiler { if (option_collapse && !SCOPE.options.no_create_pointers && !skip_first_collapse) SCOPE.uint8[SCOPE.b_index++] = BinaryCode.CREATE_POINTER; } + // temporary to find errors: throw if a cloned html element without a unique ptr id + if (globalThis.HTMLElement && value instanceof HTMLElement && value.hasAttribute("uix-ptr") && !(value as any)[DX_PTR]) console.error("Invalid cloned HTMLElement " + value.tagName + (value.hasAttribute("id")?"#"+value.getAttribute("id"):"")); + + // first value was collapsed (if no_proxify == false, it was still collapsed because it's not a pointer reference) // if (SCOPE.options.collapse_first_inserted) SCOPE.options.collapse_first_inserted = false; // reset SCOPE.options._first_insert_done = true; diff --git a/runtime/pointers.ts b/runtime/pointers.ts index 1749eeb2..aede9948 100644 --- a/runtime/pointers.ts +++ b/runtime/pointers.ts @@ -1393,11 +1393,11 @@ export class Pointer extends Ref { // returns the existing pointer for a value, or the value, if no pointer exists public static pointerifyValue(value:any):Pointer|any { - return value instanceof Pointer ? value : this.pointer_value_map.get(value) ?? value; + return value?.[DX_PTR] ?? (value instanceof Pointer ? value : this.pointer_value_map.get(value)) ?? value; } // returns pointer only if pointer exists - public static getByValue(value:RefOrValue):Pointer|undefined{ - return >this.pointer_value_map.get(Pointer.collapseValue(value)); + public static getByValue(value:RefOrValue): Pointer|undefined{ + return (value?.[DX_PTR] ?? this.pointer_value_map.get(Pointer.collapseValue(value))) as Pointer; } // returns pointer only if pointer exists From 4d5e947175e11eec58b2b17b2945050a515822bc Mon Sep 17 00:00:00 2001 From: benStre Date: Tue, 19 Mar 2024 11:54:10 +0100 Subject: [PATCH 28/29] add support for Readable/WritableStream, improve streams --- compiler/compiler.ts | 3 +++ docs/manual/11 Types.md | 10 ++++---- runtime/runtime.ts | 5 ++-- types/native_types.ts | 32 +++++++++++++++++++++++++ types/stream.ts | 53 ++++++++++++++++++++++++++++++++++++----- types/type.ts | 4 +++- utils/polyfills.ts | 49 +++++++++++++++++++++++++++++++++++++ 7 files changed, 143 insertions(+), 13 deletions(-) diff --git a/compiler/compiler.ts b/compiler/compiler.ts index 1cdecfe9..76c1429c 100644 --- a/compiler/compiler.ts +++ b/compiler/compiler.ts @@ -2840,6 +2840,9 @@ export class Compiler { WebRTCInterface.registerMediaStream(value); } + // streams: always create pointer binding + if (value instanceof Stream) value = Pointer.proxifyValue(value); + // exception for Date: convert to Time (TODO: different approach?) if (value instanceof Date && !(value instanceof Time)) { try { diff --git a/docs/manual/11 Types.md b/docs/manual/11 Types.md index dca3aff7..34ccb704 100644 --- a/docs/manual/11 Types.md +++ b/docs/manual/11 Types.md @@ -22,8 +22,8 @@ DATEX types can be accessed via `Datex.Type`. | **WeakMap** | None | - | - | Cannot be implemented because `WeakMap` internals are not accessible. Alternative: `StorageWeakMap` | | **Function** | Sufficient | `std:Function` | No (Immutable) | Functions always return a Promise, even if they are synchronous | | **AsyncFunction** | Sufficient | `std:Function` | No (Immutable) | - | -| **Generator** | Sufficient | `js:AsyncGenerator` | No (Immutable) | Generators are always mapped to AsyncGenerators | -| **AsyncGenerator** | Full | `js:AsyncGenerator` | No (Immutable) | - | +| **Generator** | Sufficient | `js:AsyncGenerator` | No (Immutable) | Generators are always mapped to AsyncGenerators. Generators cannot be stored persistently | +| **AsyncGenerator** | Sufficient | `js:AsyncGenerator` | No (Immutable) | Generators cannot be stored persistently | | **ArrayBuffer** | Partial | `std:buffer` | No | ArrayBuffer mutations are currently not synchronized | | **Uint8Array** | Partial | `js:TypedArray/u8` | No | ArrayBuffer mutations are currently not synchronized | | **Uint16Array** | Partial | `js:TypedArray/u16` | No | ArrayBuffer mutations are currently not synchronized | @@ -35,11 +35,13 @@ DATEX types can be accessed via `Datex.Type`. | **BigInt64Array** | Partial | `js:TypedArray/i64` | No | ArrayBuffer mutations are currently not synchronized | | **Float32Array** | Partial | `js:TypedArray/f32` | No | ArrayBuffer mutations are currently not synchronized | | **Float64Array** | Partial | `js:TypedArray/f64` | No | ArrayBuffer mutations are currently not synchronized | -| **Promise** | Full | `js:Promise` | No (Immutable) | - | +| **Promise** | Full | `js:Promise` | No (Immutable) | Promises cannot be stored persistently | | **URL** | Partial | `std:url` | No | URL mutations are currently not synchronized | | **Date** | Partial | `std:time` | No | `Date` objects are currently asymetrically mapped to DATEX `Time` objects | -| **Blob** | Full | `std:*/*,` | No (Immutable) | - | +| **Blob** | Full | `std:*/*,` | No (Immutable) | - | | **File** | Full | `js:File` | No (Immutable) | - | +| **ReadableStream** | Full | `js:ReadableStream` | Yes | - | +| **WritableStream** | Full | `js:WritableStream` | Yes | - | | **RegExp** | Partial | `js:RegExp` | No (Immutable) | RegExp values wrapped in a Ref are currently not synchronized | | **WeakRef** | Full | `std:WeakRef` | No (Immutable) | - | | **MediaStream** | Partial | `js:MediaStream` | Yes | MediaStreams are only supported in browsers that provide a [WebRTC API](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) | diff --git a/runtime/runtime.ts b/runtime/runtime.ts index d5504367..3dad8f69 100644 --- a/runtime/runtime.ts +++ b/runtime/runtime.ts @@ -232,7 +232,8 @@ export class Runtime { ERROR_STACK_TRACES: true, // create detailed stack traces with all DATEX Errors NATIVE_ERROR_STACK_TRACES: true, // create detailed stack traces of JS Errors (NATIVE_ERROR_MESSAGES must be true) NATIVE_ERROR_DEBUG_STACK_TRACES: false, // also display internal DATEX library stack traces (hidden per default) - NATIVE_ERROR_MESSAGES: true // expose native error messages + NATIVE_ERROR_MESSAGES: true, // expose native error messages + DATEX_HTTP_ORIGIN: globalThis.location?.origin // http origin to use to send datex-over-http messages (e.g. GOODBYE messages), default is current origin for browsers } public static MIME_TYPE_MAPPING: Record> = { @@ -1217,7 +1218,7 @@ export class Runtime { this.ownLastEndpoint = endpoint; this.lastEndpointUnloadHandler = () => { // send goodbye - if (this.goodbyeMessage) sendDatexViaHTTPChannel(this.goodbyeMessage); + if (this.goodbyeMessage) sendDatexViaHTTPChannel(this.goodbyeMessage, this.OPTIONS.DATEX_HTTP_ORIGIN); if (client_type == "browser") { try { // remove from localstorage list diff --git a/types/native_types.ts b/types/native_types.ts index 03a5741a..5a1c0db9 100644 --- a/types/native_types.ts +++ b/types/native_types.ts @@ -8,6 +8,7 @@ import { Tuple } from "./tuple.ts"; import "../utils/auto_map.ts" import { ReactiveMapMethods } from "./reactive-methods/map.ts"; +import { Stream } from "./stream.ts"; // @ts-ignore accecssible to dev console globalThis.serializeImg = (img:HTMLImageElement)=> { @@ -367,6 +368,37 @@ Type.js.Promise.setJSInterface({ } }) +Type.js.ReadableStream.setJSInterface({ + class: ReadableStream, + + serialize: value => { + return {stream:new Stream(value)} + }, + + cast: value => { + if (value?.stream instanceof Stream) { + return (value.stream as Stream).readable_stream + } + else return INVALID; + } +}) + +Type.js.WritableStream.setJSInterface({ + class: WritableStream, + + serialize: value => { + const stream = new Stream(); + stream.pipeTo(value); + return {stream}; + }, + + cast: value => { + if (value?.stream instanceof Stream) { + return (value.stream as Stream).writable_stream + } + else return INVALID; + } +}) // override set prototype to make sure all sets are sorted at runtime when calling [...set] (TODO is that good?) // const set_iterator = Set.prototype[Symbol.iterator]; diff --git a/types/stream.ts b/types/stream.ts index 44743a5d..89547daf 100644 --- a/types/stream.ts +++ b/types/stream.ts @@ -13,27 +13,50 @@ export class Stream implements StreamConsumer { controller?: ReadableStreamDefaultController readable_stream: ReadableStream + #writable_stream?: WritableStream + + get writable_stream() { + if (!this.#writable_stream) { + this.#writable_stream = new WritableStream({ + write: (chunk) => { + this.write(chunk); + } + }); + } + return this.#writable_stream; + } constructor(readable_stream?:ReadableStream) { this.readable_stream = readable_stream ?? new ReadableStream({ start: controller => {this.controller = controller} }); + // immediately start stream out if readable_stream is given + if (readable_stream) this.#startStreamOut() } started_ptr_stream = false + #startStreamOut() { + const ptr = Pointer.createOrGet(this); + if (ptr instanceof Pointer) { + logger.info("Start stream out for " + ptr.idString()); + setTimeout(() => { + ptr.startStreamOut(); // stream to all subscribers or origin, workaround: timeout to prevent stream init too early (TODO: fix) + }, 100) + } + else { + throw new Error("Could not bind stream to pointer.") + } + this.started_ptr_stream = true; + } + write(chunk: T, scope?: datex_scope) { // convert buffers // if (chunk instanceof TypedArray) chunk = (chunk).buffer; if (!this.started_ptr_stream && !scope) { // no scope -> assume called from JS, not DATEX - this.started_ptr_stream = true; - const ptr = Pointer.getByValue(this); - if (ptr instanceof Pointer) { - logger.info("Start stream out for " + ptr.idString()); - ptr.startStreamOut(); // stream to all subscribers or origin - } + this.#startStreamOut() } try { @@ -54,6 +77,17 @@ export class Stream implements StreamConsumer { } } + async pipeTo(out_stream:WritableStream) { + const reader = this.getReader(); + const writer = out_stream.getWriter(); + let next:ReadableStreamReadResult; + while (true) { + next = await reader.read() + if (next.done) break; + writer.write(next.value); + } + } + close() { this.controller?.close() this.controller = undefined; @@ -66,4 +100,11 @@ export class Stream implements StreamConsumer { return streams[0].getReader() } + values() { + return this.readable_stream.values() + } + + get [Symbol.asyncIterator]() { + return this.readable_stream.values.bind(this.readable_stream) + } } diff --git a/types/type.ts b/types/type.ts index ae6b47bd..040ef00a 100644 --- a/types/type.ts +++ b/types/type.ts @@ -1016,7 +1016,9 @@ export class Type extends ExtensibleFunction { File: Type.get("js:File"), TypedArray: Type.get("js:TypedArray"), AsyncGenerator: Type.get("js:AsyncGenerator"), - Promise: Type.get>("js:Promise") + Promise: Type.get>("js:Promise"), + ReadableStream: Type.get("js:ReadableStream"), + WritableStream: Type.get("js:WritableStream"), } /** diff --git a/utils/polyfills.ts b/utils/polyfills.ts index 3e43910b..1e9c0efd 100644 --- a/utils/polyfills.ts +++ b/utils/polyfills.ts @@ -48,3 +48,52 @@ Map.groupBy ??= function groupBy (iterable, callbackfn) { } return map } + + +/** + * A polyfill for `ReadableStream.protototype[Symbol.asyncIterator]`, + * aligning as closely as possible to the specification. + * + * @see https://streams.spec.whatwg.org/#rs-asynciterator + * @see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#async_iteration + */ +ReadableStream.prototype.values ??= function({ preventCancel = false } = {}) { + const reader = this.getReader(); + return { + async next() { + try { + const result = await reader.read(); + if (result.done) { + reader.releaseLock(); + } + return result; + } catch (e) { + reader.releaseLock(); + throw e; + } + }, + async return(value) { + if (!preventCancel) { + const cancelPromise = reader.cancel(value); + reader.releaseLock(); + await cancelPromise; + } else { + reader.releaseLock(); + } + return { done: true, value }; + }, + [Symbol.asyncIterator]() { + return this; + } + }; + }; + + +ReadableStream.prototype[Symbol.asyncIterator] ??= ReadableStream.prototype.values; + +declare global { + interface ReadableStream { + values(options?: { preventCancel?: boolean }): AsyncIterable; + [Symbol.asyncIterator](): AsyncIterableIterator; + } +} \ No newline at end of file From bbd01d608d3e942c18745fbf6d6d8747562fb462 Mon Sep 17 00:00:00 2001 From: benStre Date: Wed, 20 Mar 2024 11:59:35 +0100 Subject: [PATCH 29/29] update docs --- docs/manual/12 Classes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual/12 Classes.md b/docs/manual/12 Classes.md index b4c8aeb1..fe8ad762 100644 --- a/docs/manual/12 Classes.md +++ b/docs/manual/12 Classes.md @@ -65,7 +65,7 @@ obj.sum // 26 ## Constructors The normal JavaScript class constructor gets called every time an instance of a sync class is created. -When an existing instance of a sync class is shared with another endpoint, the constructor is +When an existing instance of a struct class is shared with another endpoint, the constructor is called again locally on the endpoint, which is not intended but can't be prevented. For this reason, struct classes cannot use normal constructors. @@ -84,7 +84,7 @@ const MyObject = struct( } ) -const obj = new MyObject(42) // "constructed a new MyObject" is logged +const obj = new MyObject() // "constructed a new MyObject" is logged ``` When the `obj` pointer is now accessed on a remote endpoint, the `construct` method