@prismicio/simulator 0.2.3 → 0.2.4-canary.331b982
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SimulatorAPI.cjs +6 -6
- package/dist/SimulatorAPI.cjs.map +1 -1
- package/dist/SimulatorAPI.d.cts +3 -5
- package/dist/SimulatorAPI.d.cts.map +1 -1
- package/dist/SimulatorAPI.d.ts +3 -5
- package/dist/SimulatorAPI.d.ts.map +1 -1
- package/dist/SimulatorAPI.js +6 -6
- package/dist/SimulatorAPI.js.map +1 -1
- package/dist/SimulatorClient.cjs +9 -9
- package/dist/SimulatorClient.cjs.map +1 -1
- package/dist/SimulatorClient.d.cts +2 -4
- package/dist/SimulatorClient.d.cts.map +1 -1
- package/dist/SimulatorClient.d.ts +2 -4
- package/dist/SimulatorClient.d.ts.map +1 -1
- package/dist/SimulatorClient.js +9 -9
- package/dist/SimulatorClient.js.map +1 -1
- package/dist/channel/ChannelEmitter.cjs +6 -8
- package/dist/channel/ChannelEmitter.cjs.map +1 -1
- package/dist/channel/ChannelEmitter.d.cts +3 -5
- package/dist/channel/ChannelEmitter.d.cts.map +1 -1
- package/dist/channel/ChannelEmitter.d.ts +3 -5
- package/dist/channel/ChannelEmitter.d.ts.map +1 -1
- package/dist/channel/ChannelEmitter.js +6 -9
- package/dist/channel/ChannelEmitter.js.map +1 -1
- package/dist/channel/ChannelNetwork.cjs +13 -11
- package/dist/channel/ChannelNetwork.cjs.map +1 -1
- package/dist/channel/ChannelNetwork.d.cts +3 -5
- package/dist/channel/ChannelNetwork.d.cts.map +1 -1
- package/dist/channel/ChannelNetwork.d.ts +3 -5
- package/dist/channel/ChannelNetwork.d.ts.map +1 -1
- package/dist/channel/ChannelNetwork.js +13 -12
- package/dist/channel/ChannelNetwork.js.map +1 -1
- package/dist/channel/ChannelReceiver.cjs +6 -8
- package/dist/channel/ChannelReceiver.cjs.map +1 -1
- package/dist/channel/ChannelReceiver.d.cts +3 -5
- package/dist/channel/ChannelReceiver.d.cts.map +1 -1
- package/dist/channel/ChannelReceiver.d.ts +3 -5
- package/dist/channel/ChannelReceiver.d.ts.map +1 -1
- package/dist/channel/ChannelReceiver.js +6 -9
- package/dist/channel/ChannelReceiver.js.map +1 -1
- package/dist/channel/errors.cjs.map +1 -1
- package/dist/channel/errors.d.cts +7 -9
- package/dist/channel/errors.d.cts.map +1 -1
- package/dist/channel/errors.d.ts +7 -9
- package/dist/channel/errors.d.ts.map +1 -1
- package/dist/channel/errors.js.map +1 -1
- package/dist/channel/messages.cjs.map +1 -1
- package/dist/channel/messages.d.cts +5 -7
- package/dist/channel/messages.d.cts.map +1 -1
- package/dist/channel/messages.d.ts +5 -7
- package/dist/channel/messages.d.ts.map +1 -1
- package/dist/channel/messages.js.map +1 -1
- package/dist/channel/types.d.cts +21 -22
- package/dist/channel/types.d.cts.map +1 -1
- package/dist/channel/types.d.ts +21 -22
- package/dist/channel/types.d.ts.map +1 -1
- package/dist/globalExtensions.d.cts +2 -2
- package/dist/globalExtensions.d.cts.map +1 -1
- package/dist/globalExtensions.d.ts +1 -2
- package/dist/globalExtensions.d.ts.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/kit/SimulatorManager.cjs +7 -6
- package/dist/kit/SimulatorManager.cjs.map +1 -1
- package/dist/kit/SimulatorManager.d.cts +1 -3
- package/dist/kit/SimulatorManager.d.cts.map +1 -1
- package/dist/kit/SimulatorManager.d.ts +1 -3
- package/dist/kit/SimulatorManager.d.ts.map +1 -1
- package/dist/kit/SimulatorManager.js +7 -6
- package/dist/kit/SimulatorManager.js.map +1 -1
- package/dist/kit/State.cjs +4 -4
- package/dist/kit/State.cjs.map +1 -1
- package/dist/kit/State.d.cts +1 -3
- package/dist/kit/State.d.cts.map +1 -1
- package/dist/kit/State.d.ts +1 -3
- package/dist/kit/State.d.ts.map +1 -1
- package/dist/kit/State.js +4 -4
- package/dist/kit/State.js.map +1 -1
- package/dist/kit/domHelpers.cjs.map +1 -1
- package/dist/kit/domHelpers.d.cts +4 -5
- package/dist/kit/domHelpers.d.cts.map +1 -1
- package/dist/kit/domHelpers.d.ts +4 -5
- package/dist/kit/domHelpers.d.ts.map +1 -1
- package/dist/kit/domHelpers.js.map +1 -1
- package/dist/kit/eventHandlers.cjs.map +1 -1
- package/dist/kit/eventHandlers.d.cts +2 -3
- package/dist/kit/eventHandlers.d.cts.map +1 -1
- package/dist/kit/eventHandlers.d.ts +2 -3
- package/dist/kit/eventHandlers.d.ts.map +1 -1
- package/dist/kit/eventHandlers.js.map +1 -1
- package/dist/kit/getDefault.cjs.map +1 -1
- package/dist/kit/getDefault.d.cts +3 -5
- package/dist/kit/getDefault.d.cts.map +1 -1
- package/dist/kit/getDefault.d.ts +3 -5
- package/dist/kit/getDefault.d.ts.map +1 -1
- package/dist/kit/getDefault.js.map +1 -1
- package/dist/kit/messages.cjs.map +1 -1
- package/dist/kit/messages.d.cts +1 -2
- package/dist/kit/messages.d.cts.map +1 -1
- package/dist/kit/messages.d.ts +1 -2
- package/dist/kit/messages.d.ts.map +1 -1
- package/dist/kit/messages.js.map +1 -1
- package/dist/kit/types.cjs.map +1 -1
- package/dist/kit/types.d.cts +5 -7
- package/dist/kit/types.d.cts.map +1 -1
- package/dist/kit/types.d.ts +5 -7
- package/dist/kit/types.d.ts.map +1 -1
- package/dist/kit/types.js.map +1 -1
- package/dist/lib/EventEmitter.cjs.map +1 -1
- package/dist/lib/EventEmitter.d.cts +3 -4
- package/dist/lib/EventEmitter.d.cts.map +1 -1
- package/dist/lib/EventEmitter.d.ts +3 -4
- package/dist/lib/EventEmitter.d.ts.map +1 -1
- package/dist/lib/EventEmitter.js.map +1 -1
- package/dist/lib/throttle.cjs.map +1 -1
- package/dist/lib/throttle.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +6 -8
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +6 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +11 -11
- package/src/kit/SimulatorManager.ts +1 -0
- package/dist/channel/types.cjs +0 -14
- package/dist/channel/types.cjs.map +0 -1
- package/dist/channel/types.js +0 -13
- package/dist/channel/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelEmitter.js","names":[],"sources":["../../src/channel/ChannelEmitter.ts"],"sourcesContent":["import type { ChannelNetworkOptions, PostRequestOptions } from \"./ChannelNetwork\"\nimport { ChannelNetwork } from \"./ChannelNetwork\"\nimport type { AllChannelReceiverOptions } from \"./ChannelReceiver\"\nimport { ChannelNotSetError, ConnectionTimeoutError, NotReadyError } from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterTransactions,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\nimport { InternalEmitterRequestType, InternalReceiverRequestType } from \"./types\"\n\nexport type ChannelEmitterOptions = {\n\tconnectTimeout: number\n}\n\nexport const channelEmitterDefaultOptions: ChannelEmitterOptions & Partial<ChannelNetworkOptions> =\n\t{\n\t\tconnectTimeout: 20000,\n\t\trequestIDPrefix: \"emitter-\",\n\t}\n\nexport type AllChannelEmitterOptions = ChannelEmitterOptions & ChannelNetworkOptions\n\nexport abstract class ChannelEmitter<\n\tTReceiverTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n\tTReceiverOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<TReceiverTransactions, ChannelEmitterOptions & TOptions> {\n\tprivate _target: HTMLIFrameElement\n\tprivate _channel: MessageChannel | null = null\n\tprotected get channel(): MessageChannel {\n\t\tif (!this._channel) {\n\t\t\tthrow new ChannelNotSetError()\n\t\t}\n\n\t\treturn this._channel\n\t}\n\tprotected set channel(channel: MessageChannel | null) {\n\t\tthis._channel = channel\n\n\t\t// Update port automatically\n\t\tif (this._channel) {\n\t\t\tthis.port = this._channel.port1\n\t\t} else {\n\t\t\tthis.port = null\n\t\t}\n\t}\n\tprivate _receiverReady = \"\"\n\tprivate _receiverReadyCallback: (() => Promise<void>) | null = null\n\tprivate _connected = false\n\tpublic get connected(): boolean {\n\t\treturn this._connected\n\t}\n\n\tconstructor(\n\t\ttarget: HTMLIFrameElement,\n\t\trequestHandlers: TransactionsHandlers<TReceiverTransactions>,\n\t\toptions: Partial<AllChannelEmitterOptions> & TOptions,\n\t) {\n\t\tsuper(requestHandlers, { ...channelEmitterDefaultOptions, ...options })\n\n\t\tthis._target = target\n\n\t\twindow.addEventListener(\"message\", (event) => {\n\t\t\tthis._onPublicMessage(event)\n\t\t})\n\t}\n\n\t/**\n\t * Initiates connection to receiver\n\t *\n\t * @param receiverOptions - Options to configure the receiver with\n\t * @param newOrigin - Indicates to the emitter that we're connecting to a new origin\n\t * @returns Success connect message\n\t */\n\tconnect(\n\t\treceiverOptions: InternalEmitterTransactions<\n\t\t\tAllChannelReceiverOptions & TReceiverOptions\n\t\t>[\"connect\"][\"request\"][\"data\"] = {},\n\t\tnewOrigin = false,\n\t): Promise<SuccessResponseMessage> {\n\t\t// Disconnect first\n\t\tthis.disconnect()\n\t\t// If changing origin we'll need to wait for receiver to be ready again\n\t\tif (newOrigin) {\n\t\t\tthis._receiverReady = \"\"\n\t\t}\n\n\t\t// Handshake promise\n\t\treturn new Promise<SuccessResponseMessage>((resolve, reject) => {\n\t\t\t// Wait for target to be loaded\n\t\t\tthis._target.addEventListener(\n\t\t\t\t\"load\",\n\t\t\t\t() => {\n\t\t\t\t\t// Throw if target doesn't allow access to content window\n\t\t\t\t\tif (!this._target.contentWindow) {\n\t\t\t\t\t\treturn reject(new Error(\"Target window is not available\"))\n\t\t\t\t\t}\n\n\t\t\t\t\tconst receiverReadyTimeout = setTimeout(() => {\n\t\t\t\t\t\treject(new ConnectionTimeoutError())\n\t\t\t\t\t}, this.options.connectTimeout)\n\n\t\t\t\t\t// Connect to target once ready\n\t\t\t\t\tconst receiverReadyCallback = async (): Promise<void> => {\n\t\t\t\t\t\t// Clear receiver ready timeout\n\t\t\t\t\t\tclearTimeout(receiverReadyTimeout)\n\n\t\t\t\t\t\t// Create new message channel (set up port automatically)\n\t\t\t\t\t\t// This is done here to prevent transferable objects neutering\n\t\t\t\t\t\t// when calling `connect()` multiple times\n\t\t\t\t\t\tthis.channel = new MessageChannel()\n\n\t\t\t\t\t\t// Conclude handshake by sending message channel port to target\n\t\t\t\t\t\tconst request = this.createRequestMessage(\n\t\t\t\t\t\t\tInternalEmitterRequestType.Connect,\n\t\t\t\t\t\t\treceiverOptions,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst response = await this.postRequest<\n\t\t\t\t\t\t\tInternalEmitterTransactions<\n\t\t\t\t\t\t\t\tAllChannelReceiverOptions & TReceiverOptions\n\t\t\t\t\t\t\t>[\"connect\"][\"request\"],\n\t\t\t\t\t\t\tInternalEmitterTransactions<\n\t\t\t\t\t\t\t\tAllChannelReceiverOptions & TReceiverOptions\n\t\t\t\t\t\t\t>[\"connect\"][\"response\"]\n\t\t\t\t\t\t>(request, (request) => {\n\t\t\t\t\t\t\t// Target content window is checked in previous statement\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\tthis._target.contentWindow!.postMessage(request, \"*\", [this.channel.port2])\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\t// Finish by aknowledging ready\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateSuccessResponseMessage(this._receiverReady, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t// Target content window is checked in previous statement\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\t\tthis._target.contentWindow!.postMessage(response, \"*\")\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t// If post request succeed, we're connected\n\t\t\t\t\t\tthis._connected = true\n\n\t\t\t\t\t\tresolve(response)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._receiverReady) {\n\t\t\t\t\t\t// If receiver is already ready, send port immediately\n\t\t\t\t\t\treceiverReadyCallback()\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Else wait for receiver to be ready\n\t\t\t\t\t\tthis._receiverReadyCallback = receiverReadyCallback\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t)\n\t\t})\n\t}\n\n\t/** Destroys current connection to receiver if any */\n\tdisconnect(): void {\n\t\tthis._connected = false\n\t\tthis.channel = null\n\t}\n\n\t/** Handles public messages */\n\tprivate async _onPublicMessage(event: MessageEvent<unknown>): Promise<void> {\n\t\t// Return is event is not from target\n\t\tif (event.source !== this._target.contentWindow) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (this.options.debug) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.debug(event.data)\n\t\t\t\t}\n\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase InternalReceiverRequestType.Ready:\n\t\t\t\t\t\tthis._receiverReady = message.requestID\n\n\t\t\t\t\t\t// If emitter is waiting for receiver to be ready\n\t\t\t\t\t\tif (this._receiverReadyCallback) {\n\t\t\t\t\t\t\t// We don't await the promise directly as we need to clear the callback first\n\t\t\t\t\t\t\tconst receiverReadyCallbackPromise = this._receiverReadyCallback()\n\n\t\t\t\t\t\t\tthis._receiverReadyCallback = null\n\n\t\t\t\t\t\t\tawait receiverReadyCallbackPromise\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t;(event.source as WindowProxy).postMessage(response, event.origin)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No response messages are expected on public channel\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\t// Ignore unknown messages\n\t\t\t} else {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postFormattedRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\ttype: TRequest[\"type\"],\n\t\tdata?: TRequest[\"data\"],\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (!this._connected) {\n\t\t\tthrow new NotReadyError(\"Emitter is not connected, use `ChannelEmitter.connect()` first\")\n\t\t}\n\n\t\treturn this.postRequest(this.createRequestMessage(type, data), undefined, options)\n\t}\n}\n"],"mappings":";;;;;AAyBA,MAAa,+BACZ;CACC,gBAAgB;CAChB,iBAAiB;CACjB;AAIF,IAAsB,iBAAtB,cAIU,eAAwE;CACjF;CACA,WAA0C;CAC1C,IAAc,UAA0B;AACvC,MAAI,CAAC,KAAK,SACT,OAAM,IAAI,oBAAoB;AAG/B,SAAO,KAAK;;CAEb,IAAc,QAAQ,SAAgC;AACrD,OAAK,WAAW;AAGhB,MAAI,KAAK,SACR,MAAK,OAAO,KAAK,SAAS;MAE1B,MAAK,OAAO;;CAGd,iBAAyB;CACzB,yBAA+D;CAC/D,aAAqB;CACrB,IAAW,YAAqB;AAC/B,SAAO,KAAK;;CAGb,YACC,QACA,iBACA,SACC;AACD,QAAM,iBAAiB;GAAE,GAAG;GAA8B,GAAG;GAAS,CAAC;AAEvE,OAAK,UAAU;AAEf,SAAO,iBAAiB,YAAY,UAAU;AAC7C,QAAK,iBAAiB,MAAM;IAC3B;;;;;;;;;CAUH,QACC,kBAEkC,EAAE,EACpC,YAAY,OACsB;AAElC,OAAK,YAAY;AAEjB,MAAI,UACH,MAAK,iBAAiB;AAIvB,SAAO,IAAI,SAAiC,SAAS,WAAW;AAE/D,QAAK,QAAQ,iBACZ,cACM;AAEL,QAAI,CAAC,KAAK,QAAQ,cACjB,QAAO,uBAAO,IAAI,MAAM,iCAAiC,CAAC;IAG3D,MAAM,uBAAuB,iBAAiB;AAC7C,YAAO,IAAI,wBAAwB,CAAC;OAClC,KAAK,QAAQ,eAAe;IAG/B,MAAM,wBAAwB,YAA2B;AAExD,kBAAa,qBAAqB;AAKlC,UAAK,UAAU,IAAI,gBAAgB;KAGnC,MAAM,UAAU,KAAK,qBACpB,2BAA2B,SAC3B,gBACA;KACD,MAAM,WAAW,MAAM,KAAK,YAO1B,UAAU,YAAY;AAGvB,WAAK,QAAQ,cAAe,YAAY,SAAS,KAAK,CAAC,KAAK,QAAQ,MAAM,CAAC;OAC1E;AAGF,UAAK,aACJ,6BAA6B,KAAK,gBAAgB,KAAA,EAAU,GAC3D,aAAa;AAGb,WAAK,QAAQ,cAAe,YAAY,UAAU,IAAI;OAEvD;AAGD,UAAK,aAAa;AAElB,aAAQ,SAAS;;AAGlB,QAAI,KAAK,eAER,wBAAuB;QAGvB,MAAK,yBAAyB;MAGhC,EAAE,MAAM,MAAM,CACd;IACA;;;CAIH,aAAmB;AAClB,OAAK,aAAa;AAClB,OAAK,UAAU;;;CAIhB,MAAc,iBAAiB,OAA6C;AAE3E,MAAI,MAAM,WAAW,KAAK,QAAQ,cACjC;AAGD,MAAI;GACH,MAAM,UAAU,gBAAgB,MAAM,KAAK;AAE3C,OAAI,iBAAiB,QAAQ,EAAE;AAC9B,QAAI,KAAK,QAAQ,MAEhB,SAAQ,MAAM,MAAM,KAAK;AAG1B,YAAQ,QAAQ,MAAhB;KACC,KAAK,4BAA4B;AAChC,WAAK,iBAAiB,QAAQ;AAG9B,UAAI,KAAK,wBAAwB;OAEhC,MAAM,+BAA+B,KAAK,wBAAwB;AAElE,YAAK,yBAAyB;AAE9B,aAAM;;AAEP;KAED;AACC,WAAK,aACJ,2BAA2B,QAAQ,WAAW,KAAA,EAAU,GACvD,aAAa;AACX,aAAM,OAAuB,YAAY,UAAU,MAAM,OAAO;QAEnE;AACD;;;WAKK,OAAO;AACf,OAAI,iBAAiB,WAAW,OAG/B,OAAM;;;CAKT,qBAIC,MACA,MACA,UAA8B,EAAE,EACoB;AACpD,MAAI,CAAC,KAAK,WACT,OAAM,IAAI,cAAc,iEAAiE;AAG1F,SAAO,KAAK,YAAY,KAAK,qBAAqB,MAAM,KAAK,EAAE,KAAA,GAAW,QAAQ"}
|
|
1
|
+
{"version":3,"file":"ChannelEmitter.js","names":[],"sources":["../../src/channel/ChannelEmitter.ts"],"sourcesContent":["import type { ChannelNetworkOptions, PostRequestOptions } from \"./ChannelNetwork\"\nimport { ChannelNetwork } from \"./ChannelNetwork\"\nimport type { AllChannelReceiverOptions } from \"./ChannelReceiver\"\nimport { ChannelNotSetError, ConnectionTimeoutError, NotReadyError } from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterTransactions,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\nimport { InternalEmitterRequestType, InternalReceiverRequestType } from \"./types\"\n\nexport type ChannelEmitterOptions = {\n\tconnectTimeout: number\n}\n\nexport const channelEmitterDefaultOptions: ChannelEmitterOptions & Partial<ChannelNetworkOptions> =\n\t{\n\t\tconnectTimeout: 20000,\n\t\trequestIDPrefix: \"emitter-\",\n\t}\n\nexport type AllChannelEmitterOptions = ChannelEmitterOptions & ChannelNetworkOptions\n\nexport abstract class ChannelEmitter<\n\tTReceiverTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n\tTReceiverOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<TReceiverTransactions, ChannelEmitterOptions & TOptions> {\n\tprivate _target: HTMLIFrameElement\n\tprivate _channel: MessageChannel | null = null\n\tprotected get channel(): MessageChannel {\n\t\tif (!this._channel) {\n\t\t\tthrow new ChannelNotSetError()\n\t\t}\n\n\t\treturn this._channel\n\t}\n\tprotected set channel(channel: MessageChannel | null) {\n\t\tthis._channel = channel\n\n\t\t// Update port automatically\n\t\tif (this._channel) {\n\t\t\tthis.port = this._channel.port1\n\t\t} else {\n\t\t\tthis.port = null\n\t\t}\n\t}\n\tprivate _receiverReady = \"\"\n\tprivate _receiverReadyCallback: (() => Promise<void>) | null = null\n\tprivate _connected = false\n\tpublic get connected(): boolean {\n\t\treturn this._connected\n\t}\n\n\tconstructor(\n\t\ttarget: HTMLIFrameElement,\n\t\trequestHandlers: TransactionsHandlers<TReceiverTransactions>,\n\t\toptions: Partial<AllChannelEmitterOptions> & TOptions,\n\t) {\n\t\tsuper(requestHandlers, { ...channelEmitterDefaultOptions, ...options })\n\n\t\tthis._target = target\n\n\t\twindow.addEventListener(\"message\", (event) => {\n\t\t\tthis._onPublicMessage(event)\n\t\t})\n\t}\n\n\t/**\n\t * Initiates connection to receiver\n\t *\n\t * @param receiverOptions - Options to configure the receiver with\n\t * @param newOrigin - Indicates to the emitter that we're connecting to a new origin\n\t * @returns Success connect message\n\t */\n\tconnect(\n\t\treceiverOptions: InternalEmitterTransactions<\n\t\t\tAllChannelReceiverOptions & TReceiverOptions\n\t\t>[\"connect\"][\"request\"][\"data\"] = {},\n\t\tnewOrigin = false,\n\t): Promise<SuccessResponseMessage> {\n\t\t// Disconnect first\n\t\tthis.disconnect()\n\t\t// If changing origin we'll need to wait for receiver to be ready again\n\t\tif (newOrigin) {\n\t\t\tthis._receiverReady = \"\"\n\t\t}\n\n\t\t// Handshake promise\n\t\treturn new Promise<SuccessResponseMessage>((resolve, reject) => {\n\t\t\t// Wait for target to be loaded\n\t\t\tthis._target.addEventListener(\n\t\t\t\t\"load\",\n\t\t\t\t() => {\n\t\t\t\t\t// Throw if target doesn't allow access to content window\n\t\t\t\t\tif (!this._target.contentWindow) {\n\t\t\t\t\t\treturn reject(new Error(\"Target window is not available\"))\n\t\t\t\t\t}\n\n\t\t\t\t\tconst receiverReadyTimeout = setTimeout(() => {\n\t\t\t\t\t\treject(new ConnectionTimeoutError())\n\t\t\t\t\t}, this.options.connectTimeout)\n\n\t\t\t\t\t// Connect to target once ready\n\t\t\t\t\tconst receiverReadyCallback = async (): Promise<void> => {\n\t\t\t\t\t\t// Clear receiver ready timeout\n\t\t\t\t\t\tclearTimeout(receiverReadyTimeout)\n\n\t\t\t\t\t\t// Create new message channel (set up port automatically)\n\t\t\t\t\t\t// This is done here to prevent transferable objects neutering\n\t\t\t\t\t\t// when calling `connect()` multiple times\n\t\t\t\t\t\tthis.channel = new MessageChannel()\n\n\t\t\t\t\t\t// Conclude handshake by sending message channel port to target\n\t\t\t\t\t\tconst request = this.createRequestMessage(\n\t\t\t\t\t\t\tInternalEmitterRequestType.Connect,\n\t\t\t\t\t\t\treceiverOptions,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst response = await this.postRequest<\n\t\t\t\t\t\t\tInternalEmitterTransactions<\n\t\t\t\t\t\t\t\tAllChannelReceiverOptions & TReceiverOptions\n\t\t\t\t\t\t\t>[\"connect\"][\"request\"],\n\t\t\t\t\t\t\tInternalEmitterTransactions<\n\t\t\t\t\t\t\t\tAllChannelReceiverOptions & TReceiverOptions\n\t\t\t\t\t\t\t>[\"connect\"][\"response\"]\n\t\t\t\t\t\t>(request, (request) => {\n\t\t\t\t\t\t\t// Target content window is checked in previous statement\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\tthis._target.contentWindow!.postMessage(request, \"*\", [this.channel.port2])\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\t// Finish by aknowledging ready\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateSuccessResponseMessage(this._receiverReady, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t// Target content window is checked in previous statement\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\t\tthis._target.contentWindow!.postMessage(response, \"*\")\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t// If post request succeed, we're connected\n\t\t\t\t\t\tthis._connected = true\n\n\t\t\t\t\t\tresolve(response)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._receiverReady) {\n\t\t\t\t\t\t// If receiver is already ready, send port immediately\n\t\t\t\t\t\treceiverReadyCallback()\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Else wait for receiver to be ready\n\t\t\t\t\t\tthis._receiverReadyCallback = receiverReadyCallback\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t)\n\t\t})\n\t}\n\n\t/** Destroys current connection to receiver if any */\n\tdisconnect(): void {\n\t\tthis._connected = false\n\t\tthis.channel = null\n\t}\n\n\t/** Handles public messages */\n\tprivate async _onPublicMessage(event: MessageEvent<unknown>): Promise<void> {\n\t\t// Return is event is not from target\n\t\tif (event.source !== this._target.contentWindow) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (this.options.debug) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.debug(event.data)\n\t\t\t\t}\n\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase InternalReceiverRequestType.Ready:\n\t\t\t\t\t\tthis._receiverReady = message.requestID\n\n\t\t\t\t\t\t// If emitter is waiting for receiver to be ready\n\t\t\t\t\t\tif (this._receiverReadyCallback) {\n\t\t\t\t\t\t\t// We don't await the promise directly as we need to clear the callback first\n\t\t\t\t\t\t\tconst receiverReadyCallbackPromise = this._receiverReadyCallback()\n\n\t\t\t\t\t\t\tthis._receiverReadyCallback = null\n\n\t\t\t\t\t\t\tawait receiverReadyCallbackPromise\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t;(event.source as WindowProxy).postMessage(response, event.origin)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No response messages are expected on public channel\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\t// Ignore unknown messages\n\t\t\t} else {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postFormattedRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\ttype: TRequest[\"type\"],\n\t\tdata?: TRequest[\"data\"],\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (!this._connected) {\n\t\t\tthrow new NotReadyError(\"Emitter is not connected, use `ChannelEmitter.connect()` first\")\n\t\t}\n\n\t\treturn this.postRequest(this.createRequestMessage(type, data), undefined, options)\n\t}\n}\n"],"mappings":";;;;AAyBA,MAAa,+BACZ;CACC,gBAAgB;CAChB,iBAAiB;AAClB;AAID,IAAsB,iBAAtB,cAIU,eAAwE;CACjF;CACA,WAA0C;CAC1C,IAAc,UAA0B;EACvC,IAAI,CAAC,KAAK,UACT,MAAM,IAAI,mBAAmB;EAG9B,OAAO,KAAK;CACb;CACA,IAAc,QAAQ,SAAgC;EACrD,KAAK,WAAW;EAGhB,IAAI,KAAK,UACR,KAAK,OAAO,KAAK,SAAS;OAE1B,KAAK,OAAO;CAEd;CACA,iBAAyB;CACzB,yBAA+D;CAC/D,aAAqB;CACrB,IAAW,YAAqB;EAC/B,OAAO,KAAK;CACb;CAEA,YACC,QACA,iBACA,SACC;EACD,MAAM,iBAAiB;GAAE,GAAG;GAA8B,GAAG;EAAQ,CAAC;EAEtE,KAAK,UAAU;EAEf,OAAO,iBAAiB,YAAY,UAAU;GAC7C,KAAK,iBAAiB,KAAK;EAC5B,CAAC;CACF;;;;;;;;CASA,QACC,kBAEkC,CAAC,GACnC,YAAY,OACsB;EAElC,KAAK,WAAW;EAEhB,IAAI,WACH,KAAK,iBAAiB;EAIvB,OAAO,IAAI,SAAiC,SAAS,WAAW;GAE/D,KAAK,QAAQ,iBACZ,cACM;IAEL,IAAI,CAAC,KAAK,QAAQ,eACjB,OAAO,uBAAO,IAAI,MAAM,gCAAgC,CAAC;IAG1D,MAAM,uBAAuB,iBAAiB;KAC7C,OAAO,IAAI,uBAAuB,CAAC;IACpC,GAAG,KAAK,QAAQ,cAAc;IAG9B,MAAM,wBAAwB,YAA2B;KAExD,aAAa,oBAAoB;KAKjC,KAAK,UAAU,IAAI,eAAe;KAGlC,MAAM,UAAU,KAAK,qBAAA,WAEpB,eACD;KACA,MAAM,WAAW,MAAM,KAAK,YAO1B,UAAU,YAAY;MAGvB,KAAK,QAAQ,cAAe,YAAY,SAAS,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC;KAC3E,CAAC;KAGD,KAAK,aACJ,6BAA6B,KAAK,gBAAgB,KAAA,CAAS,IAC1D,aAAa;MAGb,KAAK,QAAQ,cAAe,YAAY,UAAU,GAAG;KACtD,CACD;KAGA,KAAK,aAAa;KAElB,QAAQ,QAAQ;IACjB;IAEA,IAAI,KAAK,gBAER,sBAAsB;SAGtB,KAAK,yBAAyB;GAEhC,GACA,EAAE,MAAM,KAAK,CACd;EACD,CAAC;CACF;;CAGA,aAAmB;EAClB,KAAK,aAAa;EAClB,KAAK,UAAU;CAChB;;CAGA,MAAc,iBAAiB,OAA6C;EAE3E,IAAI,MAAM,WAAW,KAAK,QAAQ,eACjC;EAGD,IAAI;GACH,MAAM,UAAU,gBAAgB,MAAM,IAAI;GAE1C,IAAI,iBAAiB,OAAO,GAAG;IAC9B,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,MAAM,IAAI;IAGzB,QAAQ,QAAQ,MAAhB;KACC,KAAA;MACC,KAAK,iBAAiB,QAAQ;MAG9B,IAAI,KAAK,wBAAwB;OAEhC,MAAM,+BAA+B,KAAK,uBAAuB;OAEjE,KAAK,yBAAyB;OAE9B,MAAM;MACP;MACA;KAED,SACC,KAAK,aACJ,2BAA2B,QAAQ,WAAW,KAAA,CAAS,IACtD,aAAa;MACZ,MAAO,OAAuB,YAAY,UAAU,MAAM,MAAM;KAClE,CACD;IAEF;GACD;EAGD,SAAS,OAAO;GACf,IAAI,iBAAiB,WAAW,CAEhC,OACC,MAAM;EAER;CACD;CAEA,qBAIC,MACA,MACA,UAA8B,CAAC,GACqB;EACpD,IAAI,CAAC,KAAK,YACT,MAAM,IAAI,cAAc,gEAAgE;EAGzF,OAAO,KAAK,YAAY,KAAK,qBAAqB,MAAM,IAAI,GAAG,KAAA,GAAW,OAAO;CAClF;AACD"}
|
|
@@ -35,17 +35,18 @@ var ChannelNetwork = class {
|
|
|
35
35
|
if (this.options.debug) console.debug(event.data);
|
|
36
36
|
try {
|
|
37
37
|
const message = require_messages.validateMessage(event.data);
|
|
38
|
-
if (require_messages.isRequestMessage(message))
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
if (require_messages.isRequestMessage(message)) {
|
|
39
|
+
if (!this.requestHandlers[message.type]) this.postResponse(require_messages.createErrorResponseMessage(message.requestID, void 0, 501));
|
|
40
|
+
else try {
|
|
41
|
+
const response = await this.requestHandlers[message.type](message, {
|
|
42
|
+
success: require_messages.createSuccessResponseMessage.bind(this, message.requestID),
|
|
43
|
+
error: require_messages.createErrorResponseMessage.bind(this, message.requestID)
|
|
44
|
+
});
|
|
45
|
+
this.postResponse(response);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
this.postResponse(require_messages.createErrorResponseMessage(message.requestID, error, 500));
|
|
48
|
+
}
|
|
49
|
+
} else if (!this._pendingRequests.has(message.requestID)) console.error(`Unknown request ID received in response: ${JSON.stringify(message)}`);
|
|
49
50
|
else {
|
|
50
51
|
this._pendingRequests.get(message.requestID)(message);
|
|
51
52
|
this._pendingRequests.delete(message.requestID);
|
|
@@ -79,5 +80,6 @@ var ChannelNetwork = class {
|
|
|
79
80
|
};
|
|
80
81
|
//#endregion
|
|
81
82
|
exports.ChannelNetwork = ChannelNetwork;
|
|
83
|
+
exports.channelNetworkDefaultOptions = channelNetworkDefaultOptions;
|
|
82
84
|
|
|
83
85
|
//# sourceMappingURL=ChannelNetwork.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelNetwork.cjs","names":["PortNotSetError","createRequestMessage","validateMessage","isRequestMessage","createErrorResponseMessage","createSuccessResponseMessage","TooManyConcurrentRequestsError","RequestTimeoutError","isSuccessResponseMessage","ResponseError"],"sources":["../../src/channel/ChannelNetwork.ts"],"sourcesContent":["import {\n\tPortNotSetError,\n\tRequestTimeoutError,\n\tResponseError,\n\tTooManyConcurrentRequestsError,\n} from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateRequestMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tisSuccessResponseMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractErrorResponseMessage,\n\tExtractSuccessResponseMessage,\n\tRequestMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\n\nexport type PostRequestOptions = {\n\ttimeout?: number\n}\n\nexport type ChannelNetworkOptions = {\n\tdebug: boolean\n\tmaximumRequestConcurrency: number\n\tdefaultTimeout: number\n\trequestIDPrefix: string\n}\n\nexport const channelNetworkDefaultOptions: ChannelNetworkOptions = {\n\tdebug: false,\n\tmaximumRequestConcurrency: 20,\n\tdefaultTimeout: 5000,\n\trequestIDPrefix: \"channel-\",\n}\n\nexport abstract class ChannelNetwork<\n\tTPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> {\n\tpublic requestHandlers: TransactionsHandlers<TPartnerTransactions>\n\tpublic options: ChannelNetworkOptions & TOptions\n\n\tprivate _port: MessagePort | null = null\n\tprotected get port(): MessagePort {\n\t\tif (!this._port) {\n\t\t\tthrow new PortNotSetError()\n\t\t}\n\n\t\treturn this._port\n\t}\n\tprotected set port(port: MessagePort | null) {\n\t\t// Destroy old port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = null\n\t\t}\n\n\t\tthis._port = port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = this.onMessage.bind(this)\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tprivate _pendingRequests: Map<string, (response: any) => void> = new Map()\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TPartnerTransactions>,\n\t\toptions: Partial<ChannelNetworkOptions> & TOptions,\n\t) {\n\t\tthis.requestHandlers = requestHandlers\n\t\tthis.options = { ...channelNetworkDefaultOptions, ...options }\n\t}\n\n\tpublic createRequestMessage<TType extends string = string, TData = undefined>(\n\t\ttype: TType,\n\t\tdata: TData,\n\t): RequestMessage<TType, TData> {\n\t\treturn createRequestMessage(type, data, this.options.requestIDPrefix)\n\t}\n\n\tprotected async onMessage(event: MessageEvent<unknown>): Promise<void> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(event.data)\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (!this.requestHandlers[message.type]) {\n\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, undefined, 501))\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// TODO: Figure out why type cannot be inferred on its own anymore\n\t\t\t\t\t\tconst response = await this.requestHandlers[message.type](message, {\n\t\t\t\t\t\t\tsuccess: createSuccessResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"success\"],\n\t\t\t\t\t\t\terror: createErrorResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"error\"],\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, error, 500))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!this._pendingRequests.has(message.requestID)) {\n\t\t\t\t\tconsole.error(`Unknown request ID received in response: ${JSON.stringify(message)}`)\n\t\t\t\t} else {\n\t\t\t\t\t// Pending requests are checked in previous statement\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tthis._pendingRequests.get(message.requestID)!(message)\n\t\t\t\t\tthis._pendingRequests.delete(message.requestID)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\tconsole.warn(error.message)\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\trequest: TRequest,\n\t\tpostMessage = (request: TRequest): void => this.port.postMessage(request),\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(request)\n\t\t}\n\n\t\tif (this._pendingRequests.size >= this.options.maximumRequestConcurrency) {\n\t\t\tthrow new TooManyConcurrentRequestsError(request)\n\t\t}\n\n\t\treturn new Promise<ExtractSuccessResponseMessage<TResponse>>((resolve, reject) => {\n\t\t\tconst requestTimeout = setTimeout(() => {\n\t\t\t\tif (this._pendingRequests.has(request.requestID)) {\n\t\t\t\t\tthis._pendingRequests.delete(request.requestID)\n\t\t\t\t}\n\t\t\t\treject(new RequestTimeoutError(request))\n\t\t\t}, options.timeout || this.options.defaultTimeout)\n\n\t\t\tthis._pendingRequests.set(request.requestID, (response: TResponse): void => {\n\t\t\t\tclearTimeout(requestTimeout)\n\n\t\t\t\tif (isSuccessResponseMessage(response)) {\n\t\t\t\t\tresolve(response as ExtractSuccessResponseMessage<TResponse>)\n\t\t\t\t} else {\n\t\t\t\t\treject(new ResponseError(response as ExtractErrorResponseMessage<TResponse>))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tpostMessage(request)\n\t\t})\n\t}\n\n\tprotected postResponse<TResponse extends UnknownResponseMessage>(\n\t\tresponse: TResponse,\n\t\tpostMessage = (response: TResponse): void => this.port.postMessage(response),\n\t): TResponse {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(response)\n\t\t}\n\n\t\tpostMessage(response)\n\n\t\treturn response\n\t}\n}\n"],"mappings":";;;AAmCA,MAAa,+BAAsD;CAClE,OAAO;CACP,2BAA2B;CAC3B,gBAAgB;CAChB,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ChannelNetwork.cjs","names":["PortNotSetError","createRequestMessage","validateMessage","isRequestMessage","createErrorResponseMessage","createSuccessResponseMessage","TooManyConcurrentRequestsError","RequestTimeoutError","isSuccessResponseMessage","ResponseError"],"sources":["../../src/channel/ChannelNetwork.ts"],"sourcesContent":["import {\n\tPortNotSetError,\n\tRequestTimeoutError,\n\tResponseError,\n\tTooManyConcurrentRequestsError,\n} from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateRequestMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tisSuccessResponseMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractErrorResponseMessage,\n\tExtractSuccessResponseMessage,\n\tRequestMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\n\nexport type PostRequestOptions = {\n\ttimeout?: number\n}\n\nexport type ChannelNetworkOptions = {\n\tdebug: boolean\n\tmaximumRequestConcurrency: number\n\tdefaultTimeout: number\n\trequestIDPrefix: string\n}\n\nexport const channelNetworkDefaultOptions: ChannelNetworkOptions = {\n\tdebug: false,\n\tmaximumRequestConcurrency: 20,\n\tdefaultTimeout: 5000,\n\trequestIDPrefix: \"channel-\",\n}\n\nexport abstract class ChannelNetwork<\n\tTPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> {\n\tpublic requestHandlers: TransactionsHandlers<TPartnerTransactions>\n\tpublic options: ChannelNetworkOptions & TOptions\n\n\tprivate _port: MessagePort | null = null\n\tprotected get port(): MessagePort {\n\t\tif (!this._port) {\n\t\t\tthrow new PortNotSetError()\n\t\t}\n\n\t\treturn this._port\n\t}\n\tprotected set port(port: MessagePort | null) {\n\t\t// Destroy old port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = null\n\t\t}\n\n\t\tthis._port = port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = this.onMessage.bind(this)\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tprivate _pendingRequests: Map<string, (response: any) => void> = new Map()\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TPartnerTransactions>,\n\t\toptions: Partial<ChannelNetworkOptions> & TOptions,\n\t) {\n\t\tthis.requestHandlers = requestHandlers\n\t\tthis.options = { ...channelNetworkDefaultOptions, ...options }\n\t}\n\n\tpublic createRequestMessage<TType extends string = string, TData = undefined>(\n\t\ttype: TType,\n\t\tdata: TData,\n\t): RequestMessage<TType, TData> {\n\t\treturn createRequestMessage(type, data, this.options.requestIDPrefix)\n\t}\n\n\tprotected async onMessage(event: MessageEvent<unknown>): Promise<void> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(event.data)\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (!this.requestHandlers[message.type]) {\n\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, undefined, 501))\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// TODO: Figure out why type cannot be inferred on its own anymore\n\t\t\t\t\t\tconst response = await this.requestHandlers[message.type](message, {\n\t\t\t\t\t\t\tsuccess: createSuccessResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"success\"],\n\t\t\t\t\t\t\terror: createErrorResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"error\"],\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, error, 500))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!this._pendingRequests.has(message.requestID)) {\n\t\t\t\t\tconsole.error(`Unknown request ID received in response: ${JSON.stringify(message)}`)\n\t\t\t\t} else {\n\t\t\t\t\t// Pending requests are checked in previous statement\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tthis._pendingRequests.get(message.requestID)!(message)\n\t\t\t\t\tthis._pendingRequests.delete(message.requestID)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\tconsole.warn(error.message)\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\trequest: TRequest,\n\t\tpostMessage = (request: TRequest): void => this.port.postMessage(request),\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(request)\n\t\t}\n\n\t\tif (this._pendingRequests.size >= this.options.maximumRequestConcurrency) {\n\t\t\tthrow new TooManyConcurrentRequestsError(request)\n\t\t}\n\n\t\treturn new Promise<ExtractSuccessResponseMessage<TResponse>>((resolve, reject) => {\n\t\t\tconst requestTimeout = setTimeout(() => {\n\t\t\t\tif (this._pendingRequests.has(request.requestID)) {\n\t\t\t\t\tthis._pendingRequests.delete(request.requestID)\n\t\t\t\t}\n\t\t\t\treject(new RequestTimeoutError(request))\n\t\t\t}, options.timeout || this.options.defaultTimeout)\n\n\t\t\tthis._pendingRequests.set(request.requestID, (response: TResponse): void => {\n\t\t\t\tclearTimeout(requestTimeout)\n\n\t\t\t\tif (isSuccessResponseMessage(response)) {\n\t\t\t\t\tresolve(response as ExtractSuccessResponseMessage<TResponse>)\n\t\t\t\t} else {\n\t\t\t\t\treject(new ResponseError(response as ExtractErrorResponseMessage<TResponse>))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tpostMessage(request)\n\t\t})\n\t}\n\n\tprotected postResponse<TResponse extends UnknownResponseMessage>(\n\t\tresponse: TResponse,\n\t\tpostMessage = (response: TResponse): void => this.port.postMessage(response),\n\t): TResponse {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(response)\n\t\t}\n\n\t\tpostMessage(response)\n\n\t\treturn response\n\t}\n}\n"],"mappings":";;;AAmCA,MAAa,+BAAsD;CAClE,OAAO;CACP,2BAA2B;CAC3B,gBAAgB;CAChB,iBAAiB;AAClB;AAEA,IAAsB,iBAAtB,MAGE;CACD;CACA;CAEA,QAAoC;CACpC,IAAc,OAAoB;EACjC,IAAI,CAAC,KAAK,OACT,MAAM,IAAIA,eAAAA,gBAAgB;EAG3B,OAAO,KAAK;CACb;CACA,IAAc,KAAK,MAA0B;EAE5C,IAAI,KAAK,OACR,KAAK,MAAM,YAAY;EAGxB,KAAK,QAAQ;EACb,IAAI,KAAK,OACR,KAAK,MAAM,YAAY,KAAK,UAAU,KAAK,IAAI;CAEjD;CAGA,mCAAiE,IAAI,IAAI;CAEzE,YACC,iBACA,SACC;EACD,KAAK,kBAAkB;EACvB,KAAK,UAAU;GAAE,GAAG;GAA8B,GAAG;EAAQ;CAC9D;CAEA,qBACC,MACA,MAC+B;EAC/B,OAAOC,iBAAAA,qBAAqB,MAAM,MAAM,KAAK,QAAQ,eAAe;CACrE;CAEA,MAAgB,UAAU,OAA6C;EACtE,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,MAAM,IAAI;EAGzB,IAAI;GACH,MAAM,UAAUC,iBAAAA,gBAAgB,MAAM,IAAI;GAE1C,IAAIC,iBAAAA,iBAAiB,OAAO,GAAG;IAC9B,IAAI,CAAC,KAAK,gBAAgB,QAAQ,OACjC,KAAK,aAAaC,iBAAAA,2BAA2B,QAAQ,WAAW,KAAA,GAAW,GAAG,CAAC;SAE/E,IAAI;KAEH,MAAM,WAAW,MAAM,KAAK,gBAAgB,QAAQ,KAAK,CAAC,SAAS;MAClE,SAASC,iBAAAA,6BAA6B,KAAK,MAAM,QAAQ,SAAS;MAGlE,OAAOD,iBAAAA,2BAA2B,KAAK,MAAM,QAAQ,SAAS;KAG/D,CAAC;KAED,KAAK,aAAa,QAAQ;IAC3B,SAAS,OAAO;KACf,KAAK,aAAaA,iBAAAA,2BAA2B,QAAQ,WAAW,OAAO,GAAG,CAAC;IAC5E;GAEF,OACC,IAAI,CAAC,KAAK,iBAAiB,IAAI,QAAQ,SAAS,GAC/C,QAAQ,MAAM,4CAA4C,KAAK,UAAU,OAAO,GAAG;QAC7E;IAGN,KAAK,iBAAiB,IAAI,QAAQ,SAAS,CAAC,CAAE,OAAO;IACrD,KAAK,iBAAiB,OAAO,QAAQ,SAAS;GAC/C;EAEF,SAAS,OAAO;GACf,IAAI,iBAAiB,WACpB,QAAQ,KAAK,MAAM,OAAO;QAG1B,MAAM;EAER;CACD;CAEA,YAIC,SACA,eAAe,YAA4B,KAAK,KAAK,YAAY,OAAO,GACxE,UAA8B,CAAC,GACqB;EACpD,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,OAAO;EAGtB,IAAI,KAAK,iBAAiB,QAAQ,KAAK,QAAQ,2BAC9C,MAAM,IAAIE,eAAAA,+BAA+B,OAAO;EAGjD,OAAO,IAAI,SAAmD,SAAS,WAAW;GACjF,MAAM,iBAAiB,iBAAiB;IACvC,IAAI,KAAK,iBAAiB,IAAI,QAAQ,SAAS,GAC9C,KAAK,iBAAiB,OAAO,QAAQ,SAAS;IAE/C,OAAO,IAAIC,eAAAA,oBAAoB,OAAO,CAAC;GACxC,GAAG,QAAQ,WAAW,KAAK,QAAQ,cAAc;GAEjD,KAAK,iBAAiB,IAAI,QAAQ,YAAY,aAA8B;IAC3E,aAAa,cAAc;IAE3B,IAAIC,iBAAAA,yBAAyB,QAAQ,GACpC,QAAQ,QAAoD;SAE5D,OAAO,IAAIC,eAAAA,cAAc,QAAkD,CAAC;GAE9E,CAAC;GAED,YAAY,OAAO;EACpB,CAAC;CACF;CAEA,aACC,UACA,eAAe,aAA8B,KAAK,KAAK,YAAY,QAAQ,GAC/D;EACZ,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,QAAQ;EAGvB,YAAY,QAAQ;EAEpB,OAAO;CACR;AACD"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { ExtractSuccessResponseMessage, RequestMessage, TransactionsHandlers, UnknownRequestMessage, UnknownResponseMessage, UnknownTransaction } from "./types.cjs";
|
|
2
|
-
|
|
3
2
|
//#region src/channel/ChannelNetwork.d.ts
|
|
4
|
-
type PostRequestOptions = {
|
|
3
|
+
export type PostRequestOptions = {
|
|
5
4
|
timeout?: number;
|
|
6
5
|
};
|
|
7
|
-
type ChannelNetworkOptions = {
|
|
6
|
+
export type ChannelNetworkOptions = {
|
|
8
7
|
debug: boolean;
|
|
9
8
|
maximumRequestConcurrency: number;
|
|
10
9
|
defaultTimeout: number;
|
|
11
10
|
requestIDPrefix: string;
|
|
12
11
|
};
|
|
13
|
-
declare abstract class ChannelNetwork<TPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> {
|
|
12
|
+
export declare abstract class ChannelNetwork<TPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> {
|
|
14
13
|
requestHandlers: TransactionsHandlers<TPartnerTransactions>;
|
|
15
14
|
options: ChannelNetworkOptions & TOptions;
|
|
16
15
|
private _port;
|
|
@@ -24,5 +23,4 @@ declare abstract class ChannelNetwork<TPartnerTransactions extends Record<string
|
|
|
24
23
|
protected postResponse<TResponse extends UnknownResponseMessage>(response: TResponse, postMessage?: (response: TResponse) => void): TResponse;
|
|
25
24
|
}
|
|
26
25
|
//#endregion
|
|
27
|
-
export { ChannelNetwork, ChannelNetworkOptions, PostRequestOptions };
|
|
28
26
|
//# sourceMappingURL=ChannelNetwork.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelNetwork.d.cts","names":[],"sources":["../../src/channel/ChannelNetwork.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChannelNetwork.d.cts","names":[],"sources":["../../src/channel/ChannelNetwork.ts"],"mappings":";;YAwBY;EACX;;YAGW;EACX;EACA;EACA;EACA;;8BAUqB,eACrB,6BAA6B,eAAe,sBAAsB,uBAClE,iBAAiB,0BAA0B;EAEpC,iBAAiB,qBAAqB;EACtC,SAAS,wBAAwB;UAEhC;gBACM,QAAQ;gBAOR,KAAK,MAAM;UAajB;EAER,YACC,iBAAiB,qBAAqB,uBACtC,SAAS,QAAQ,yBAAyB;EAMpC,qBAAqB,+BAA+B,mBAC1D,MAAM,OACN,MAAM,QACJ,eAAe,OAAO;YAIT,UAAU,OAAO,wBAAwB;YAiD/C,YACT,iBAAiB,uBACjB,kBAAkB,wBAElB,SAAS,UACT,eAAW,SAAa,mBACxB,UAAS,qBACP,QAAQ,8BAA8B;YAgC/B,aAAa,kBAAkB,wBACxC,UAAU,WACV,eAAW,UAAc,qBACvB"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { ExtractSuccessResponseMessage, RequestMessage, TransactionsHandlers, UnknownRequestMessage, UnknownResponseMessage, UnknownTransaction } from "./types.js";
|
|
2
|
-
|
|
3
2
|
//#region src/channel/ChannelNetwork.d.ts
|
|
4
|
-
type PostRequestOptions = {
|
|
3
|
+
export type PostRequestOptions = {
|
|
5
4
|
timeout?: number;
|
|
6
5
|
};
|
|
7
|
-
type ChannelNetworkOptions = {
|
|
6
|
+
export type ChannelNetworkOptions = {
|
|
8
7
|
debug: boolean;
|
|
9
8
|
maximumRequestConcurrency: number;
|
|
10
9
|
defaultTimeout: number;
|
|
11
10
|
requestIDPrefix: string;
|
|
12
11
|
};
|
|
13
|
-
declare abstract class ChannelNetwork<TPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> {
|
|
12
|
+
export declare abstract class ChannelNetwork<TPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> {
|
|
14
13
|
requestHandlers: TransactionsHandlers<TPartnerTransactions>;
|
|
15
14
|
options: ChannelNetworkOptions & TOptions;
|
|
16
15
|
private _port;
|
|
@@ -24,5 +23,4 @@ declare abstract class ChannelNetwork<TPartnerTransactions extends Record<string
|
|
|
24
23
|
protected postResponse<TResponse extends UnknownResponseMessage>(response: TResponse, postMessage?: (response: TResponse) => void): TResponse;
|
|
25
24
|
}
|
|
26
25
|
//#endregion
|
|
27
|
-
export { ChannelNetwork, ChannelNetworkOptions, PostRequestOptions };
|
|
28
26
|
//# sourceMappingURL=ChannelNetwork.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelNetwork.d.ts","names":[],"sources":["../../src/channel/ChannelNetwork.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChannelNetwork.d.ts","names":[],"sources":["../../src/channel/ChannelNetwork.ts"],"mappings":";;YAwBY;EACX;;YAGW;EACX;EACA;EACA;EACA;;8BAUqB,eACrB,6BAA6B,eAAe,sBAAsB,uBAClE,iBAAiB,0BAA0B;EAEpC,iBAAiB,qBAAqB;EACtC,SAAS,wBAAwB;UAEhC;gBACM,QAAQ;gBAOR,KAAK,MAAM;UAajB;EAER,YACC,iBAAiB,qBAAqB,uBACtC,SAAS,QAAQ,yBAAyB;EAMpC,qBAAqB,+BAA+B,mBAC1D,MAAM,OACN,MAAM,QACJ,eAAe,OAAO;YAIT,UAAU,OAAO,wBAAwB;YAiD/C,YACT,iBAAiB,uBACjB,kBAAkB,wBAElB,SAAS,UACT,eAAW,SAAa,mBACxB,UAAS,qBACP,QAAQ,8BAA8B;YAgC/B,aAAa,kBAAkB,wBACxC,UAAU,WACV,eAAW,UAAc,qBACvB"}
|
|
@@ -35,17 +35,18 @@ var ChannelNetwork = class {
|
|
|
35
35
|
if (this.options.debug) console.debug(event.data);
|
|
36
36
|
try {
|
|
37
37
|
const message = validateMessage(event.data);
|
|
38
|
-
if (isRequestMessage(message))
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
if (isRequestMessage(message)) {
|
|
39
|
+
if (!this.requestHandlers[message.type]) this.postResponse(createErrorResponseMessage(message.requestID, void 0, 501));
|
|
40
|
+
else try {
|
|
41
|
+
const response = await this.requestHandlers[message.type](message, {
|
|
42
|
+
success: createSuccessResponseMessage.bind(this, message.requestID),
|
|
43
|
+
error: createErrorResponseMessage.bind(this, message.requestID)
|
|
44
|
+
});
|
|
45
|
+
this.postResponse(response);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
this.postResponse(createErrorResponseMessage(message.requestID, error, 500));
|
|
48
|
+
}
|
|
49
|
+
} else if (!this._pendingRequests.has(message.requestID)) console.error(`Unknown request ID received in response: ${JSON.stringify(message)}`);
|
|
49
50
|
else {
|
|
50
51
|
this._pendingRequests.get(message.requestID)(message);
|
|
51
52
|
this._pendingRequests.delete(message.requestID);
|
|
@@ -78,6 +79,6 @@ var ChannelNetwork = class {
|
|
|
78
79
|
}
|
|
79
80
|
};
|
|
80
81
|
//#endregion
|
|
81
|
-
export { ChannelNetwork };
|
|
82
|
+
export { ChannelNetwork, channelNetworkDefaultOptions };
|
|
82
83
|
|
|
83
84
|
//# sourceMappingURL=ChannelNetwork.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelNetwork.js","names":[],"sources":["../../src/channel/ChannelNetwork.ts"],"sourcesContent":["import {\n\tPortNotSetError,\n\tRequestTimeoutError,\n\tResponseError,\n\tTooManyConcurrentRequestsError,\n} from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateRequestMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tisSuccessResponseMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractErrorResponseMessage,\n\tExtractSuccessResponseMessage,\n\tRequestMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\n\nexport type PostRequestOptions = {\n\ttimeout?: number\n}\n\nexport type ChannelNetworkOptions = {\n\tdebug: boolean\n\tmaximumRequestConcurrency: number\n\tdefaultTimeout: number\n\trequestIDPrefix: string\n}\n\nexport const channelNetworkDefaultOptions: ChannelNetworkOptions = {\n\tdebug: false,\n\tmaximumRequestConcurrency: 20,\n\tdefaultTimeout: 5000,\n\trequestIDPrefix: \"channel-\",\n}\n\nexport abstract class ChannelNetwork<\n\tTPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> {\n\tpublic requestHandlers: TransactionsHandlers<TPartnerTransactions>\n\tpublic options: ChannelNetworkOptions & TOptions\n\n\tprivate _port: MessagePort | null = null\n\tprotected get port(): MessagePort {\n\t\tif (!this._port) {\n\t\t\tthrow new PortNotSetError()\n\t\t}\n\n\t\treturn this._port\n\t}\n\tprotected set port(port: MessagePort | null) {\n\t\t// Destroy old port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = null\n\t\t}\n\n\t\tthis._port = port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = this.onMessage.bind(this)\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tprivate _pendingRequests: Map<string, (response: any) => void> = new Map()\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TPartnerTransactions>,\n\t\toptions: Partial<ChannelNetworkOptions> & TOptions,\n\t) {\n\t\tthis.requestHandlers = requestHandlers\n\t\tthis.options = { ...channelNetworkDefaultOptions, ...options }\n\t}\n\n\tpublic createRequestMessage<TType extends string = string, TData = undefined>(\n\t\ttype: TType,\n\t\tdata: TData,\n\t): RequestMessage<TType, TData> {\n\t\treturn createRequestMessage(type, data, this.options.requestIDPrefix)\n\t}\n\n\tprotected async onMessage(event: MessageEvent<unknown>): Promise<void> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(event.data)\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (!this.requestHandlers[message.type]) {\n\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, undefined, 501))\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// TODO: Figure out why type cannot be inferred on its own anymore\n\t\t\t\t\t\tconst response = await this.requestHandlers[message.type](message, {\n\t\t\t\t\t\t\tsuccess: createSuccessResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"success\"],\n\t\t\t\t\t\t\terror: createErrorResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"error\"],\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, error, 500))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!this._pendingRequests.has(message.requestID)) {\n\t\t\t\t\tconsole.error(`Unknown request ID received in response: ${JSON.stringify(message)}`)\n\t\t\t\t} else {\n\t\t\t\t\t// Pending requests are checked in previous statement\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tthis._pendingRequests.get(message.requestID)!(message)\n\t\t\t\t\tthis._pendingRequests.delete(message.requestID)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\tconsole.warn(error.message)\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\trequest: TRequest,\n\t\tpostMessage = (request: TRequest): void => this.port.postMessage(request),\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(request)\n\t\t}\n\n\t\tif (this._pendingRequests.size >= this.options.maximumRequestConcurrency) {\n\t\t\tthrow new TooManyConcurrentRequestsError(request)\n\t\t}\n\n\t\treturn new Promise<ExtractSuccessResponseMessage<TResponse>>((resolve, reject) => {\n\t\t\tconst requestTimeout = setTimeout(() => {\n\t\t\t\tif (this._pendingRequests.has(request.requestID)) {\n\t\t\t\t\tthis._pendingRequests.delete(request.requestID)\n\t\t\t\t}\n\t\t\t\treject(new RequestTimeoutError(request))\n\t\t\t}, options.timeout || this.options.defaultTimeout)\n\n\t\t\tthis._pendingRequests.set(request.requestID, (response: TResponse): void => {\n\t\t\t\tclearTimeout(requestTimeout)\n\n\t\t\t\tif (isSuccessResponseMessage(response)) {\n\t\t\t\t\tresolve(response as ExtractSuccessResponseMessage<TResponse>)\n\t\t\t\t} else {\n\t\t\t\t\treject(new ResponseError(response as ExtractErrorResponseMessage<TResponse>))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tpostMessage(request)\n\t\t})\n\t}\n\n\tprotected postResponse<TResponse extends UnknownResponseMessage>(\n\t\tresponse: TResponse,\n\t\tpostMessage = (response: TResponse): void => this.port.postMessage(response),\n\t): TResponse {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(response)\n\t\t}\n\n\t\tpostMessage(response)\n\n\t\treturn response\n\t}\n}\n"],"mappings":";;;AAmCA,MAAa,+BAAsD;CAClE,OAAO;CACP,2BAA2B;CAC3B,gBAAgB;CAChB,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ChannelNetwork.js","names":[],"sources":["../../src/channel/ChannelNetwork.ts"],"sourcesContent":["import {\n\tPortNotSetError,\n\tRequestTimeoutError,\n\tResponseError,\n\tTooManyConcurrentRequestsError,\n} from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateRequestMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tisSuccessResponseMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractErrorResponseMessage,\n\tExtractSuccessResponseMessage,\n\tRequestMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\n\nexport type PostRequestOptions = {\n\ttimeout?: number\n}\n\nexport type ChannelNetworkOptions = {\n\tdebug: boolean\n\tmaximumRequestConcurrency: number\n\tdefaultTimeout: number\n\trequestIDPrefix: string\n}\n\nexport const channelNetworkDefaultOptions: ChannelNetworkOptions = {\n\tdebug: false,\n\tmaximumRequestConcurrency: 20,\n\tdefaultTimeout: 5000,\n\trequestIDPrefix: \"channel-\",\n}\n\nexport abstract class ChannelNetwork<\n\tTPartnerTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> {\n\tpublic requestHandlers: TransactionsHandlers<TPartnerTransactions>\n\tpublic options: ChannelNetworkOptions & TOptions\n\n\tprivate _port: MessagePort | null = null\n\tprotected get port(): MessagePort {\n\t\tif (!this._port) {\n\t\t\tthrow new PortNotSetError()\n\t\t}\n\n\t\treturn this._port\n\t}\n\tprotected set port(port: MessagePort | null) {\n\t\t// Destroy old port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = null\n\t\t}\n\n\t\tthis._port = port\n\t\tif (this._port) {\n\t\t\tthis._port.onmessage = this.onMessage.bind(this)\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tprivate _pendingRequests: Map<string, (response: any) => void> = new Map()\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TPartnerTransactions>,\n\t\toptions: Partial<ChannelNetworkOptions> & TOptions,\n\t) {\n\t\tthis.requestHandlers = requestHandlers\n\t\tthis.options = { ...channelNetworkDefaultOptions, ...options }\n\t}\n\n\tpublic createRequestMessage<TType extends string = string, TData = undefined>(\n\t\ttype: TType,\n\t\tdata: TData,\n\t): RequestMessage<TType, TData> {\n\t\treturn createRequestMessage(type, data, this.options.requestIDPrefix)\n\t}\n\n\tprotected async onMessage(event: MessageEvent<unknown>): Promise<void> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(event.data)\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (!this.requestHandlers[message.type]) {\n\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, undefined, 501))\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// TODO: Figure out why type cannot be inferred on its own anymore\n\t\t\t\t\t\tconst response = await this.requestHandlers[message.type](message, {\n\t\t\t\t\t\t\tsuccess: createSuccessResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"success\"],\n\t\t\t\t\t\t\terror: createErrorResponseMessage.bind(this, message.requestID) as Parameters<\n\t\t\t\t\t\t\t\t(typeof this.requestHandlers)[string]\n\t\t\t\t\t\t\t>[1][\"error\"],\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.postResponse(createErrorResponseMessage(message.requestID, error, 500))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!this._pendingRequests.has(message.requestID)) {\n\t\t\t\t\tconsole.error(`Unknown request ID received in response: ${JSON.stringify(message)}`)\n\t\t\t\t} else {\n\t\t\t\t\t// Pending requests are checked in previous statement\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tthis._pendingRequests.get(message.requestID)!(message)\n\t\t\t\t\tthis._pendingRequests.delete(message.requestID)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\tconsole.warn(error.message)\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\trequest: TRequest,\n\t\tpostMessage = (request: TRequest): void => this.port.postMessage(request),\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(request)\n\t\t}\n\n\t\tif (this._pendingRequests.size >= this.options.maximumRequestConcurrency) {\n\t\t\tthrow new TooManyConcurrentRequestsError(request)\n\t\t}\n\n\t\treturn new Promise<ExtractSuccessResponseMessage<TResponse>>((resolve, reject) => {\n\t\t\tconst requestTimeout = setTimeout(() => {\n\t\t\t\tif (this._pendingRequests.has(request.requestID)) {\n\t\t\t\t\tthis._pendingRequests.delete(request.requestID)\n\t\t\t\t}\n\t\t\t\treject(new RequestTimeoutError(request))\n\t\t\t}, options.timeout || this.options.defaultTimeout)\n\n\t\t\tthis._pendingRequests.set(request.requestID, (response: TResponse): void => {\n\t\t\t\tclearTimeout(requestTimeout)\n\n\t\t\t\tif (isSuccessResponseMessage(response)) {\n\t\t\t\t\tresolve(response as ExtractSuccessResponseMessage<TResponse>)\n\t\t\t\t} else {\n\t\t\t\t\treject(new ResponseError(response as ExtractErrorResponseMessage<TResponse>))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tpostMessage(request)\n\t\t})\n\t}\n\n\tprotected postResponse<TResponse extends UnknownResponseMessage>(\n\t\tresponse: TResponse,\n\t\tpostMessage = (response: TResponse): void => this.port.postMessage(response),\n\t): TResponse {\n\t\tif (this.options.debug) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug(response)\n\t\t}\n\n\t\tpostMessage(response)\n\n\t\treturn response\n\t}\n}\n"],"mappings":";;;AAmCA,MAAa,+BAAsD;CAClE,OAAO;CACP,2BAA2B;CAC3B,gBAAgB;CAChB,iBAAiB;AAClB;AAEA,IAAsB,iBAAtB,MAGE;CACD;CACA;CAEA,QAAoC;CACpC,IAAc,OAAoB;EACjC,IAAI,CAAC,KAAK,OACT,MAAM,IAAI,gBAAgB;EAG3B,OAAO,KAAK;CACb;CACA,IAAc,KAAK,MAA0B;EAE5C,IAAI,KAAK,OACR,KAAK,MAAM,YAAY;EAGxB,KAAK,QAAQ;EACb,IAAI,KAAK,OACR,KAAK,MAAM,YAAY,KAAK,UAAU,KAAK,IAAI;CAEjD;CAGA,mCAAiE,IAAI,IAAI;CAEzE,YACC,iBACA,SACC;EACD,KAAK,kBAAkB;EACvB,KAAK,UAAU;GAAE,GAAG;GAA8B,GAAG;EAAQ;CAC9D;CAEA,qBACC,MACA,MAC+B;EAC/B,OAAO,qBAAqB,MAAM,MAAM,KAAK,QAAQ,eAAe;CACrE;CAEA,MAAgB,UAAU,OAA6C;EACtE,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,MAAM,IAAI;EAGzB,IAAI;GACH,MAAM,UAAU,gBAAgB,MAAM,IAAI;GAE1C,IAAI,iBAAiB,OAAO,GAAG;IAC9B,IAAI,CAAC,KAAK,gBAAgB,QAAQ,OACjC,KAAK,aAAa,2BAA2B,QAAQ,WAAW,KAAA,GAAW,GAAG,CAAC;SAE/E,IAAI;KAEH,MAAM,WAAW,MAAM,KAAK,gBAAgB,QAAQ,KAAK,CAAC,SAAS;MAClE,SAAS,6BAA6B,KAAK,MAAM,QAAQ,SAAS;MAGlE,OAAO,2BAA2B,KAAK,MAAM,QAAQ,SAAS;KAG/D,CAAC;KAED,KAAK,aAAa,QAAQ;IAC3B,SAAS,OAAO;KACf,KAAK,aAAa,2BAA2B,QAAQ,WAAW,OAAO,GAAG,CAAC;IAC5E;GAEF,OACC,IAAI,CAAC,KAAK,iBAAiB,IAAI,QAAQ,SAAS,GAC/C,QAAQ,MAAM,4CAA4C,KAAK,UAAU,OAAO,GAAG;QAC7E;IAGN,KAAK,iBAAiB,IAAI,QAAQ,SAAS,CAAC,CAAE,OAAO;IACrD,KAAK,iBAAiB,OAAO,QAAQ,SAAS;GAC/C;EAEF,SAAS,OAAO;GACf,IAAI,iBAAiB,WACpB,QAAQ,KAAK,MAAM,OAAO;QAG1B,MAAM;EAER;CACD;CAEA,YAIC,SACA,eAAe,YAA4B,KAAK,KAAK,YAAY,OAAO,GACxE,UAA8B,CAAC,GACqB;EACpD,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,OAAO;EAGtB,IAAI,KAAK,iBAAiB,QAAQ,KAAK,QAAQ,2BAC9C,MAAM,IAAI,+BAA+B,OAAO;EAGjD,OAAO,IAAI,SAAmD,SAAS,WAAW;GACjF,MAAM,iBAAiB,iBAAiB;IACvC,IAAI,KAAK,iBAAiB,IAAI,QAAQ,SAAS,GAC9C,KAAK,iBAAiB,OAAO,QAAQ,SAAS;IAE/C,OAAO,IAAI,oBAAoB,OAAO,CAAC;GACxC,GAAG,QAAQ,WAAW,KAAK,QAAQ,cAAc;GAEjD,KAAK,iBAAiB,IAAI,QAAQ,YAAY,aAA8B;IAC3E,aAAa,cAAc;IAE3B,IAAI,yBAAyB,QAAQ,GACpC,QAAQ,QAAoD;SAE5D,OAAO,IAAI,cAAc,QAAkD,CAAC;GAE9E,CAAC;GAED,YAAY,OAAO;EACpB,CAAC;CACF;CAEA,aACC,UACA,eAAe,aAA8B,KAAK,KAAK,YAAY,QAAQ,GAC/D;EACZ,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,QAAQ;EAGvB,YAAY,QAAQ;EAEpB,OAAO;CACR;AACD"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
const require_errors = require("./errors.cjs");
|
|
2
2
|
const require_messages = require("./messages.cjs");
|
|
3
3
|
const require_ChannelNetwork = require("./ChannelNetwork.cjs");
|
|
4
|
-
const require_types = require("./types.cjs");
|
|
5
4
|
//#region src/channel/ChannelReceiver.ts
|
|
6
5
|
const channelReceiverDefaultOptions = {
|
|
7
6
|
readyTimeout: 2e4,
|
|
@@ -22,7 +21,7 @@ var ChannelReceiver = class extends require_ChannelNetwork.ChannelNetwork {
|
|
|
22
21
|
async ready() {
|
|
23
22
|
if (window.parent === window) throw new Error("Receiver is currently not embedded as an iframe");
|
|
24
23
|
this._ready = false;
|
|
25
|
-
const request = this.createRequestMessage(
|
|
24
|
+
const request = this.createRequestMessage("ready", void 0);
|
|
26
25
|
const response = await this.postRequest(request, (request) => {
|
|
27
26
|
window.parent.postMessage(request, "*");
|
|
28
27
|
}, { timeout: this.options.readyTimeout });
|
|
@@ -39,7 +38,7 @@ var ChannelReceiver = class extends require_ChannelNetwork.ChannelNetwork {
|
|
|
39
38
|
if (require_messages.isRequestMessage(message)) {
|
|
40
39
|
if (this.options.debug) console.debug(event.data);
|
|
41
40
|
switch (message.type) {
|
|
42
|
-
case
|
|
41
|
+
case "connect":
|
|
43
42
|
this.port = event.ports[0];
|
|
44
43
|
const { data } = message;
|
|
45
44
|
this.options = {
|
|
@@ -52,11 +51,9 @@ var ChannelReceiver = class extends require_ChannelNetwork.ChannelNetwork {
|
|
|
52
51
|
const response = require_messages.createSuccessResponseMessage(message.requestID, void 0);
|
|
53
52
|
this.postResponse(response);
|
|
54
53
|
break;
|
|
55
|
-
default:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
break;
|
|
54
|
+
default: this.postResponse(require_messages.createErrorResponseMessage(message.requestID, void 0), (response) => {
|
|
55
|
+
event.source.postMessage(response, event.origin);
|
|
56
|
+
});
|
|
60
57
|
}
|
|
61
58
|
} else if (!this._ready) this.onMessage(event);
|
|
62
59
|
} catch (error) {
|
|
@@ -70,5 +67,6 @@ var ChannelReceiver = class extends require_ChannelNetwork.ChannelNetwork {
|
|
|
70
67
|
};
|
|
71
68
|
//#endregion
|
|
72
69
|
exports.ChannelReceiver = ChannelReceiver;
|
|
70
|
+
exports.channelReceiverDefaultOptions = channelReceiverDefaultOptions;
|
|
73
71
|
|
|
74
72
|
//# sourceMappingURL=ChannelReceiver.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelReceiver.cjs","names":["ChannelNetwork","
|
|
1
|
+
{"version":3,"file":"ChannelReceiver.cjs","names":["ChannelNetwork","validateMessage","isRequestMessage","createSuccessResponseMessage","createErrorResponseMessage","NotReadyError"],"sources":["../../src/channel/ChannelReceiver.ts"],"sourcesContent":["import type { ChannelNetworkOptions, PostRequestOptions } from \"./ChannelNetwork\"\nimport { ChannelNetwork } from \"./ChannelNetwork\"\nimport { NotReadyError } from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterTransactions,\n\tRequestMessage,\n\tResponseMessage,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\nimport { InternalEmitterRequestType, InternalReceiverRequestType } from \"./types\"\n\nexport type ChannelReceiverOptions = {\n\treadyTimeout: number\n}\n\nexport const channelReceiverDefaultOptions: ChannelReceiverOptions &\n\tPartial<ChannelNetworkOptions> = {\n\treadyTimeout: 20000,\n\trequestIDPrefix: \"receiver-\",\n}\n\nexport type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions\n\nexport abstract class ChannelReceiver<\n\tTEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {\n\tprivate _ready = false\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TEmitterTransactions>,\n\t\toptions: Partial<AllChannelReceiverOptions> & TOptions,\n\t) {\n\t\tsuper(requestHandlers, { ...channelReceiverDefaultOptions, ...options })\n\n\t\twindow.addEventListener(\"message\", (event) => {\n\t\t\tthis._onPublicMessage(event)\n\t\t})\n\t}\n\n\t/** Tells the emitter that receiver is ready */\n\tpublic async ready(): Promise<SuccessResponseMessage> {\n\t\tif (window.parent === window) {\n\t\t\tthrow new Error(\"Receiver is currently not embedded as an iframe\")\n\t\t}\n\n\t\tthis._ready = false\n\n\t\tconst request = this.createRequestMessage(InternalReceiverRequestType.Ready, undefined)\n\n\t\tconst response = await this.postRequest<\n\t\t\tRequestMessage<InternalReceiverRequestType.Ready>,\n\t\t\tResponseMessage\n\t\t>(\n\t\t\trequest,\n\t\t\t(request) => {\n\t\t\t\twindow.parent.postMessage(request, \"*\")\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: this.options.readyTimeout,\n\t\t\t},\n\t\t)\n\n\t\tthis._ready = true\n\n\t\treturn response\n\t}\n\n\t/** Handles public messages */\n\tprivate _onPublicMessage(event: MessageEvent<unknown>): void {\n\t\tif (process.env.NODE_ENV !== \"development\") {\n\t\t\tif (\n\t\t\t\t!event.origin.startsWith(\"https://\") ||\n\t\t\t\t!(\n\t\t\t\t\tevent.origin.endsWith(\".prismic.io\") ||\n\t\t\t\t\tevent.origin.endsWith(\".wroom.io\") ||\n\t\t\t\t\tevent.origin.endsWith(\".marketing-tools-wroom.com\") ||\n\t\t\t\t\tevent.origin.endsWith(\".dev-tools-wroom.com\") ||\n\t\t\t\t\tevent.origin.endsWith(\".platform-wroom.com\")\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// Ignore messages from non-allowed origins in non-development environment\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (this.options.debug) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.debug(event.data)\n\t\t\t\t}\n\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase InternalEmitterRequestType.Connect:\n\t\t\t\t\t\t// Set port\n\t\t\t\t\t\tthis.port = event.ports[0]\n\n\t\t\t\t\t\t// Update options\n\t\t\t\t\t\tconst { data } = message as InternalEmitterTransactions[\"connect\"][\"request\"]\n\t\t\t\t\t\tthis.options = {\n\t\t\t\t\t\t\t...this.options,\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t// Ensure core options remain the same\n\t\t\t\t\t\t\tdebug: this.options.debug,\n\t\t\t\t\t\t\trequestIDPrefix: this.options.requestIDPrefix,\n\t\t\t\t\t\t\treadyTimeout: this.options.readyTimeout,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst response = createSuccessResponseMessage(message.requestID, undefined)\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t;(event.source as WindowProxy).postMessage(response, event.origin)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Forward response messages to default message handler if necessary\n\t\t\t\tif (!this._ready) {\n\t\t\t\t\tthis.onMessage(event)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\t// Ignore unknown messages\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postFormattedRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\ttype: TRequest[\"type\"],\n\t\tdata?: TRequest[\"data\"],\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (!this._ready) {\n\t\t\tthrow new NotReadyError(\"Receiver is not ready, use `ChannelReceiver.ready()` first\")\n\t\t}\n\n\t\treturn this.postRequest(this.createRequestMessage(type, data), undefined, options)\n\t}\n}\n"],"mappings":";;;;AA0BA,MAAa,gCACqB;CACjC,cAAc;CACd,iBAAiB;AAClB;AAIA,IAAsB,kBAAtB,cAGUA,uBAAAA,eAAwE;CACjF,SAAiB;CAEjB,YACC,iBACA,SACC;EACD,MAAM,iBAAiB;GAAE,GAAG;GAA+B,GAAG;EAAQ,CAAC;EAEvE,OAAO,iBAAiB,YAAY,UAAU;GAC7C,KAAK,iBAAiB,KAAK;EAC5B,CAAC;CACF;;CAGA,MAAa,QAAyC;EACrD,IAAI,OAAO,WAAW,QACrB,MAAM,IAAI,MAAM,iDAAiD;EAGlE,KAAK,SAAS;EAEd,MAAM,UAAU,KAAK,qBAAA,SAAwD,KAAA,CAAS;EAEtF,MAAM,WAAW,MAAM,KAAK,YAI3B,UACC,YAAY;GACZ,OAAO,OAAO,YAAY,SAAS,GAAG;EACvC,GACA,EACC,SAAS,KAAK,QAAQ,aACvB,CACD;EAEA,KAAK,SAAS;EAEd,OAAO;CACR;;CAGA,iBAAyB,OAAoC;EAC5D,IAAI,QAAQ,IAAI,aAAa,eAE3B;OAAA,CAAC,MAAM,OAAO,WAAW,UAAU,KACnC,EACC,MAAM,OAAO,SAAS,aAAa,KACnC,MAAM,OAAO,SAAS,WAAW,KACjC,MAAM,OAAO,SAAS,4BAA4B,KAClD,MAAM,OAAO,SAAS,sBAAsB,KAC5C,MAAM,OAAO,SAAS,qBAAqB,IAI5C;EAAA;EAIF,IAAI;GACH,MAAM,UAAUC,iBAAAA,gBAAgB,MAAM,IAAI;GAE1C,IAAIC,iBAAAA,iBAAiB,OAAO,GAAG;IAC9B,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,MAAM,IAAI;IAGzB,QAAQ,QAAQ,MAAhB;KACC,KAAA;MAEC,KAAK,OAAO,MAAM,MAAM;MAGxB,MAAM,EAAE,SAAS;MACjB,KAAK,UAAU;OACd,GAAG,KAAK;OACR,GAAG;OAEH,OAAO,KAAK,QAAQ;OACpB,iBAAiB,KAAK,QAAQ;OAC9B,cAAc,KAAK,QAAQ;MAC5B;MAEA,MAAM,WAAWC,iBAAAA,6BAA6B,QAAQ,WAAW,KAAA,CAAS;MAE1E,KAAK,aAAa,QAAQ;MAC1B;KAED,SACC,KAAK,aACJC,iBAAAA,2BAA2B,QAAQ,WAAW,KAAA,CAAS,IACtD,aAAa;MACZ,MAAO,OAAuB,YAAY,UAAU,MAAM,MAAM;KAClE,CACD;IAEF;GACD,OAEC,IAAI,CAAC,KAAK,QACT,KAAK,UAAU,KAAK;EAGvB,SAAS,OAAO;GACf,IAAI,iBAAiB,WAAW,CAEhC,OAEC,MAAM;EAER;CACD;CAEA,qBAIC,MACA,MACA,UAA8B,CAAC,GACqB;EACpD,IAAI,CAAC,KAAK,QACT,MAAM,IAAIC,eAAAA,cAAc,4DAA4D;EAGrF,OAAO,KAAK,YAAY,KAAK,qBAAqB,MAAM,IAAI,GAAG,KAAA,GAAW,OAAO;CAClF;AACD"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { ExtractSuccessResponseMessage, SuccessResponseMessage, TransactionsHandlers, UnknownRequestMessage, UnknownResponseMessage, UnknownTransaction } from "./types.cjs";
|
|
2
2
|
import { ChannelNetwork, ChannelNetworkOptions, PostRequestOptions } from "./ChannelNetwork.cjs";
|
|
3
|
-
|
|
4
3
|
//#region src/channel/ChannelReceiver.d.ts
|
|
5
|
-
type ChannelReceiverOptions = {
|
|
4
|
+
export type ChannelReceiverOptions = {
|
|
6
5
|
readyTimeout: number;
|
|
7
6
|
};
|
|
8
|
-
type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions;
|
|
9
|
-
declare abstract class ChannelReceiver<TEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {
|
|
7
|
+
export type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions;
|
|
8
|
+
export declare abstract class ChannelReceiver<TEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {
|
|
10
9
|
private _ready;
|
|
11
10
|
constructor(requestHandlers: TransactionsHandlers<TEmitterTransactions>, options: Partial<AllChannelReceiverOptions> & TOptions);
|
|
12
11
|
/** Tells the emitter that receiver is ready */
|
|
@@ -16,5 +15,4 @@ declare abstract class ChannelReceiver<TEmitterTransactions extends Record<strin
|
|
|
16
15
|
protected postFormattedRequest<TRequest extends UnknownRequestMessage, TResponse extends UnknownResponseMessage>(type: TRequest["type"], data?: TRequest["data"], options?: PostRequestOptions): Promise<ExtractSuccessResponseMessage<TResponse>>;
|
|
17
16
|
}
|
|
18
17
|
//#endregion
|
|
19
|
-
export { AllChannelReceiverOptions, ChannelReceiver };
|
|
20
18
|
//# sourceMappingURL=ChannelReceiver.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelReceiver.d.cts","names":[],"sources":["../../src/channel/ChannelReceiver.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChannelReceiver.d.cts","names":[],"sources":["../../src/channel/ChannelReceiver.ts"],"mappings":";;;YAsBY;EACX;;YASW,4BAA4B,yBAAyB;8BAE3C,gBACrB,6BAA6B,eAAe,sBAAsB,uBAClE,iBAAiB,0BAA0B,iCAClC,eAAe,sBAAsB,yBAAyB;UAC/D;EAER,YACC,iBAAiB,qBAAqB,uBACtC,SAAS,QAAQ,6BAA6B;;EAUlC,SAAS,QAAQ;;UA4BtB;YAwEE,qBACT,iBAAiB,uBACjB,kBAAkB,wBAElB,MAAM,kBACN,OAAO,kBACP,UAAS,qBACP,QAAQ,8BAA8B"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { ExtractSuccessResponseMessage, SuccessResponseMessage, TransactionsHandlers, UnknownRequestMessage, UnknownResponseMessage, UnknownTransaction } from "./types.js";
|
|
2
2
|
import { ChannelNetwork, ChannelNetworkOptions, PostRequestOptions } from "./ChannelNetwork.js";
|
|
3
|
-
|
|
4
3
|
//#region src/channel/ChannelReceiver.d.ts
|
|
5
|
-
type ChannelReceiverOptions = {
|
|
4
|
+
export type ChannelReceiverOptions = {
|
|
6
5
|
readyTimeout: number;
|
|
7
6
|
};
|
|
8
|
-
type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions;
|
|
9
|
-
declare abstract class ChannelReceiver<TEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {
|
|
7
|
+
export type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions;
|
|
8
|
+
export declare abstract class ChannelReceiver<TEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>, TOptions extends Record<string, unknown> = Record<string, unknown>> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {
|
|
10
9
|
private _ready;
|
|
11
10
|
constructor(requestHandlers: TransactionsHandlers<TEmitterTransactions>, options: Partial<AllChannelReceiverOptions> & TOptions);
|
|
12
11
|
/** Tells the emitter that receiver is ready */
|
|
@@ -16,5 +15,4 @@ declare abstract class ChannelReceiver<TEmitterTransactions extends Record<strin
|
|
|
16
15
|
protected postFormattedRequest<TRequest extends UnknownRequestMessage, TResponse extends UnknownResponseMessage>(type: TRequest["type"], data?: TRequest["data"], options?: PostRequestOptions): Promise<ExtractSuccessResponseMessage<TResponse>>;
|
|
17
16
|
}
|
|
18
17
|
//#endregion
|
|
19
|
-
export { AllChannelReceiverOptions, ChannelReceiver };
|
|
20
18
|
//# sourceMappingURL=ChannelReceiver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelReceiver.d.ts","names":[],"sources":["../../src/channel/ChannelReceiver.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChannelReceiver.d.ts","names":[],"sources":["../../src/channel/ChannelReceiver.ts"],"mappings":";;;YAsBY;EACX;;YASW,4BAA4B,yBAAyB;8BAE3C,gBACrB,6BAA6B,eAAe,sBAAsB,uBAClE,iBAAiB,0BAA0B,iCAClC,eAAe,sBAAsB,yBAAyB;UAC/D;EAER,YACC,iBAAiB,qBAAqB,uBACtC,SAAS,QAAQ,6BAA6B;;EAUlC,SAAS,QAAQ;;UA4BtB;YAwEE,qBACT,iBAAiB,uBACjB,kBAAkB,wBAElB,MAAM,kBACN,OAAO,kBACP,UAAS,qBACP,QAAQ,8BAA8B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { NotReadyError } from "./errors.js";
|
|
2
2
|
import { createErrorResponseMessage, createSuccessResponseMessage, isRequestMessage, validateMessage } from "./messages.js";
|
|
3
3
|
import { ChannelNetwork } from "./ChannelNetwork.js";
|
|
4
|
-
import { InternalEmitterRequestType, InternalReceiverRequestType } from "./types.js";
|
|
5
4
|
//#region src/channel/ChannelReceiver.ts
|
|
6
5
|
const channelReceiverDefaultOptions = {
|
|
7
6
|
readyTimeout: 2e4,
|
|
@@ -22,7 +21,7 @@ var ChannelReceiver = class extends ChannelNetwork {
|
|
|
22
21
|
async ready() {
|
|
23
22
|
if (window.parent === window) throw new Error("Receiver is currently not embedded as an iframe");
|
|
24
23
|
this._ready = false;
|
|
25
|
-
const request = this.createRequestMessage(
|
|
24
|
+
const request = this.createRequestMessage("ready", void 0);
|
|
26
25
|
const response = await this.postRequest(request, (request) => {
|
|
27
26
|
window.parent.postMessage(request, "*");
|
|
28
27
|
}, { timeout: this.options.readyTimeout });
|
|
@@ -39,7 +38,7 @@ var ChannelReceiver = class extends ChannelNetwork {
|
|
|
39
38
|
if (isRequestMessage(message)) {
|
|
40
39
|
if (this.options.debug) console.debug(event.data);
|
|
41
40
|
switch (message.type) {
|
|
42
|
-
case
|
|
41
|
+
case "connect":
|
|
43
42
|
this.port = event.ports[0];
|
|
44
43
|
const { data } = message;
|
|
45
44
|
this.options = {
|
|
@@ -52,11 +51,9 @@ var ChannelReceiver = class extends ChannelNetwork {
|
|
|
52
51
|
const response = createSuccessResponseMessage(message.requestID, void 0);
|
|
53
52
|
this.postResponse(response);
|
|
54
53
|
break;
|
|
55
|
-
default:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
break;
|
|
54
|
+
default: this.postResponse(createErrorResponseMessage(message.requestID, void 0), (response) => {
|
|
55
|
+
event.source.postMessage(response, event.origin);
|
|
56
|
+
});
|
|
60
57
|
}
|
|
61
58
|
} else if (!this._ready) this.onMessage(event);
|
|
62
59
|
} catch (error) {
|
|
@@ -69,6 +66,6 @@ var ChannelReceiver = class extends ChannelNetwork {
|
|
|
69
66
|
}
|
|
70
67
|
};
|
|
71
68
|
//#endregion
|
|
72
|
-
export { ChannelReceiver };
|
|
69
|
+
export { ChannelReceiver, channelReceiverDefaultOptions };
|
|
73
70
|
|
|
74
71
|
//# sourceMappingURL=ChannelReceiver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelReceiver.js","names":[],"sources":["../../src/channel/ChannelReceiver.ts"],"sourcesContent":["import type { ChannelNetworkOptions, PostRequestOptions } from \"./ChannelNetwork\"\nimport { ChannelNetwork } from \"./ChannelNetwork\"\nimport { NotReadyError } from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterTransactions,\n\tRequestMessage,\n\tResponseMessage,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\nimport { InternalEmitterRequestType, InternalReceiverRequestType } from \"./types\"\n\nexport type ChannelReceiverOptions = {\n\treadyTimeout: number\n}\n\nexport const channelReceiverDefaultOptions: ChannelReceiverOptions &\n\tPartial<ChannelNetworkOptions> = {\n\treadyTimeout: 20000,\n\trequestIDPrefix: \"receiver-\",\n}\n\nexport type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions\n\nexport abstract class ChannelReceiver<\n\tTEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {\n\tprivate _ready = false\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TEmitterTransactions>,\n\t\toptions: Partial<AllChannelReceiverOptions> & TOptions,\n\t) {\n\t\tsuper(requestHandlers, { ...channelReceiverDefaultOptions, ...options })\n\n\t\twindow.addEventListener(\"message\", (event) => {\n\t\t\tthis._onPublicMessage(event)\n\t\t})\n\t}\n\n\t/** Tells the emitter that receiver is ready */\n\tpublic async ready(): Promise<SuccessResponseMessage> {\n\t\tif (window.parent === window) {\n\t\t\tthrow new Error(\"Receiver is currently not embedded as an iframe\")\n\t\t}\n\n\t\tthis._ready = false\n\n\t\tconst request = this.createRequestMessage(InternalReceiverRequestType.Ready, undefined)\n\n\t\tconst response = await this.postRequest<\n\t\t\tRequestMessage<InternalReceiverRequestType.Ready>,\n\t\t\tResponseMessage\n\t\t>(\n\t\t\trequest,\n\t\t\t(request) => {\n\t\t\t\twindow.parent.postMessage(request, \"*\")\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: this.options.readyTimeout,\n\t\t\t},\n\t\t)\n\n\t\tthis._ready = true\n\n\t\treturn response\n\t}\n\n\t/** Handles public messages */\n\tprivate _onPublicMessage(event: MessageEvent<unknown>): void {\n\t\tif (process.env.NODE_ENV !== \"development\") {\n\t\t\tif (\n\t\t\t\t!event.origin.startsWith(\"https://\") ||\n\t\t\t\t!(\n\t\t\t\t\tevent.origin.endsWith(\".prismic.io\") ||\n\t\t\t\t\tevent.origin.endsWith(\".wroom.io\") ||\n\t\t\t\t\tevent.origin.endsWith(\".marketing-tools-wroom.com\") ||\n\t\t\t\t\tevent.origin.endsWith(\".dev-tools-wroom.com\") ||\n\t\t\t\t\tevent.origin.endsWith(\".platform-wroom.com\")\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// Ignore messages from non-allowed origins in non-development environment\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (this.options.debug) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.debug(event.data)\n\t\t\t\t}\n\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase InternalEmitterRequestType.Connect:\n\t\t\t\t\t\t// Set port\n\t\t\t\t\t\tthis.port = event.ports[0]\n\n\t\t\t\t\t\t// Update options\n\t\t\t\t\t\tconst { data } = message as InternalEmitterTransactions[\"connect\"][\"request\"]\n\t\t\t\t\t\tthis.options = {\n\t\t\t\t\t\t\t...this.options,\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t// Ensure core options remain the same\n\t\t\t\t\t\t\tdebug: this.options.debug,\n\t\t\t\t\t\t\trequestIDPrefix: this.options.requestIDPrefix,\n\t\t\t\t\t\t\treadyTimeout: this.options.readyTimeout,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst response = createSuccessResponseMessage(message.requestID, undefined)\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t;(event.source as WindowProxy).postMessage(response, event.origin)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Forward response messages to default message handler if necessary\n\t\t\t\tif (!this._ready) {\n\t\t\t\t\tthis.onMessage(event)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\t// Ignore unknown messages\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postFormattedRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\ttype: TRequest[\"type\"],\n\t\tdata?: TRequest[\"data\"],\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (!this._ready) {\n\t\t\tthrow new NotReadyError(\"Receiver is not ready, use `ChannelReceiver.ready()` first\")\n\t\t}\n\n\t\treturn this.postRequest(this.createRequestMessage(type, data), undefined, options)\n\t}\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChannelReceiver.js","names":[],"sources":["../../src/channel/ChannelReceiver.ts"],"sourcesContent":["import type { ChannelNetworkOptions, PostRequestOptions } from \"./ChannelNetwork\"\nimport { ChannelNetwork } from \"./ChannelNetwork\"\nimport { NotReadyError } from \"./errors\"\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\"\nimport type {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterTransactions,\n\tRequestMessage,\n\tResponseMessage,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\"\nimport { InternalEmitterRequestType, InternalReceiverRequestType } from \"./types\"\n\nexport type ChannelReceiverOptions = {\n\treadyTimeout: number\n}\n\nexport const channelReceiverDefaultOptions: ChannelReceiverOptions &\n\tPartial<ChannelNetworkOptions> = {\n\treadyTimeout: 20000,\n\trequestIDPrefix: \"receiver-\",\n}\n\nexport type AllChannelReceiverOptions = ChannelReceiverOptions & ChannelNetworkOptions\n\nexport abstract class ChannelReceiver<\n\tTEmitterTransactions extends Record<string, UnknownTransaction> = Record<string, never>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<TEmitterTransactions, ChannelReceiverOptions & TOptions> {\n\tprivate _ready = false\n\n\tconstructor(\n\t\trequestHandlers: TransactionsHandlers<TEmitterTransactions>,\n\t\toptions: Partial<AllChannelReceiverOptions> & TOptions,\n\t) {\n\t\tsuper(requestHandlers, { ...channelReceiverDefaultOptions, ...options })\n\n\t\twindow.addEventListener(\"message\", (event) => {\n\t\t\tthis._onPublicMessage(event)\n\t\t})\n\t}\n\n\t/** Tells the emitter that receiver is ready */\n\tpublic async ready(): Promise<SuccessResponseMessage> {\n\t\tif (window.parent === window) {\n\t\t\tthrow new Error(\"Receiver is currently not embedded as an iframe\")\n\t\t}\n\n\t\tthis._ready = false\n\n\t\tconst request = this.createRequestMessage(InternalReceiverRequestType.Ready, undefined)\n\n\t\tconst response = await this.postRequest<\n\t\t\tRequestMessage<InternalReceiverRequestType.Ready>,\n\t\t\tResponseMessage\n\t\t>(\n\t\t\trequest,\n\t\t\t(request) => {\n\t\t\t\twindow.parent.postMessage(request, \"*\")\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: this.options.readyTimeout,\n\t\t\t},\n\t\t)\n\n\t\tthis._ready = true\n\n\t\treturn response\n\t}\n\n\t/** Handles public messages */\n\tprivate _onPublicMessage(event: MessageEvent<unknown>): void {\n\t\tif (process.env.NODE_ENV !== \"development\") {\n\t\t\tif (\n\t\t\t\t!event.origin.startsWith(\"https://\") ||\n\t\t\t\t!(\n\t\t\t\t\tevent.origin.endsWith(\".prismic.io\") ||\n\t\t\t\t\tevent.origin.endsWith(\".wroom.io\") ||\n\t\t\t\t\tevent.origin.endsWith(\".marketing-tools-wroom.com\") ||\n\t\t\t\t\tevent.origin.endsWith(\".dev-tools-wroom.com\") ||\n\t\t\t\t\tevent.origin.endsWith(\".platform-wroom.com\")\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// Ignore messages from non-allowed origins in non-development environment\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst message = validateMessage(event.data)\n\n\t\t\tif (isRequestMessage(message)) {\n\t\t\t\tif (this.options.debug) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.debug(event.data)\n\t\t\t\t}\n\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase InternalEmitterRequestType.Connect:\n\t\t\t\t\t\t// Set port\n\t\t\t\t\t\tthis.port = event.ports[0]\n\n\t\t\t\t\t\t// Update options\n\t\t\t\t\t\tconst { data } = message as InternalEmitterTransactions[\"connect\"][\"request\"]\n\t\t\t\t\t\tthis.options = {\n\t\t\t\t\t\t\t...this.options,\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t// Ensure core options remain the same\n\t\t\t\t\t\t\tdebug: this.options.debug,\n\t\t\t\t\t\t\trequestIDPrefix: this.options.requestIDPrefix,\n\t\t\t\t\t\t\treadyTimeout: this.options.readyTimeout,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst response = createSuccessResponseMessage(message.requestID, undefined)\n\n\t\t\t\t\t\tthis.postResponse(response)\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.postResponse(\n\t\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, undefined),\n\t\t\t\t\t\t\t(response) => {\n\t\t\t\t\t\t\t\t;(event.source as WindowProxy).postMessage(response, event.origin)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Forward response messages to default message handler if necessary\n\t\t\t\tif (!this._ready) {\n\t\t\t\t\tthis.onMessage(event)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof TypeError) {\n\t\t\t\t// Ignore unknown messages\n\t\t\t} else {\n\t\t\t\t// Should not be possible, but who knows :shrug:\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected postFormattedRequest<\n\t\tTRequest extends UnknownRequestMessage,\n\t\tTResponse extends UnknownResponseMessage,\n\t>(\n\t\ttype: TRequest[\"type\"],\n\t\tdata?: TRequest[\"data\"],\n\t\toptions: PostRequestOptions = {},\n\t): Promise<ExtractSuccessResponseMessage<TResponse>> {\n\t\tif (!this._ready) {\n\t\t\tthrow new NotReadyError(\"Receiver is not ready, use `ChannelReceiver.ready()` first\")\n\t\t}\n\n\t\treturn this.postRequest(this.createRequestMessage(type, data), undefined, options)\n\t}\n}\n"],"mappings":";;;;AA0BA,MAAa,gCACqB;CACjC,cAAc;CACd,iBAAiB;AAClB;AAIA,IAAsB,kBAAtB,cAGU,eAAwE;CACjF,SAAiB;CAEjB,YACC,iBACA,SACC;EACD,MAAM,iBAAiB;GAAE,GAAG;GAA+B,GAAG;EAAQ,CAAC;EAEvE,OAAO,iBAAiB,YAAY,UAAU;GAC7C,KAAK,iBAAiB,KAAK;EAC5B,CAAC;CACF;;CAGA,MAAa,QAAyC;EACrD,IAAI,OAAO,WAAW,QACrB,MAAM,IAAI,MAAM,iDAAiD;EAGlE,KAAK,SAAS;EAEd,MAAM,UAAU,KAAK,qBAAA,SAAwD,KAAA,CAAS;EAEtF,MAAM,WAAW,MAAM,KAAK,YAI3B,UACC,YAAY;GACZ,OAAO,OAAO,YAAY,SAAS,GAAG;EACvC,GACA,EACC,SAAS,KAAK,QAAQ,aACvB,CACD;EAEA,KAAK,SAAS;EAEd,OAAO;CACR;;CAGA,iBAAyB,OAAoC;EAC5D,IAAI,QAAQ,IAAI,aAAa,eAE3B;OAAA,CAAC,MAAM,OAAO,WAAW,UAAU,KACnC,EACC,MAAM,OAAO,SAAS,aAAa,KACnC,MAAM,OAAO,SAAS,WAAW,KACjC,MAAM,OAAO,SAAS,4BAA4B,KAClD,MAAM,OAAO,SAAS,sBAAsB,KAC5C,MAAM,OAAO,SAAS,qBAAqB,IAI5C;EAAA;EAIF,IAAI;GACH,MAAM,UAAU,gBAAgB,MAAM,IAAI;GAE1C,IAAI,iBAAiB,OAAO,GAAG;IAC9B,IAAI,KAAK,QAAQ,OAEhB,QAAQ,MAAM,MAAM,IAAI;IAGzB,QAAQ,QAAQ,MAAhB;KACC,KAAA;MAEC,KAAK,OAAO,MAAM,MAAM;MAGxB,MAAM,EAAE,SAAS;MACjB,KAAK,UAAU;OACd,GAAG,KAAK;OACR,GAAG;OAEH,OAAO,KAAK,QAAQ;OACpB,iBAAiB,KAAK,QAAQ;OAC9B,cAAc,KAAK,QAAQ;MAC5B;MAEA,MAAM,WAAW,6BAA6B,QAAQ,WAAW,KAAA,CAAS;MAE1E,KAAK,aAAa,QAAQ;MAC1B;KAED,SACC,KAAK,aACJ,2BAA2B,QAAQ,WAAW,KAAA,CAAS,IACtD,aAAa;MACZ,MAAO,OAAuB,YAAY,UAAU,MAAM,MAAM;KAClE,CACD;IAEF;GACD,OAEC,IAAI,CAAC,KAAK,QACT,KAAK,UAAU,KAAK;EAGvB,SAAS,OAAO;GACf,IAAI,iBAAiB,WAAW,CAEhC,OAEC,MAAM;EAER;CACD;CAEA,qBAIC,MACA,MACA,UAA8B,CAAC,GACqB;EACpD,IAAI,CAAC,KAAK,QACT,MAAM,IAAI,cAAc,4DAA4D;EAGrF,OAAO,KAAK,YAAY,KAAK,qBAAqB,MAAM,IAAI,GAAG,KAAA,GAAW,OAAO;CAClF;AACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","names":[],"sources":["../../src/channel/errors.ts"],"sourcesContent":["import type { UnknownErrorResponseMessage } from \".\"\nimport type { UnknownRequestMessage } from \"./types\"\n\nexport class ResponseError<TErrorResponse extends UnknownErrorResponseMessage> extends Error {\n\tpublic response: TErrorResponse\n\n\tconstructor(errorResponse: TErrorResponse) {\n\t\tsuper(errorResponse.msg)\n\n\t\tthis.response = errorResponse\n\t}\n}\n\nexport class ConnectionTimeoutError extends Error {\n\tconstructor() {\n\t\tsuper(\"Connection timed out\")\n\t}\n}\nexport class TooManyConcurrentRequestsError extends Error {\n\tpublic request: UnknownRequestMessage\n\n\tconstructor(request: UnknownRequestMessage) {\n\t\tsuper(`Too many concurrent requests`)\n\n\t\tthis.request = request\n\t}\n}\nexport class RequestTimeoutError<TRequest extends UnknownRequestMessage> extends Error {\n\tpublic request: UnknownRequestMessage\n\n\tconstructor(request: TRequest) {\n\t\tsuper(`Request \\`${request.requestID}\\` timed out`)\n\n\t\tthis.request = request\n\t}\n}\n\nexport class NotReadyError extends Error {}\nexport class PortNotSetError extends Error {\n\tconstructor() {\n\t\tsuper(\"Port is not set\")\n\t}\n}\nexport class ChannelNotSetError extends Error {\n\tconstructor() {\n\t\tsuper(\"Channel is not set\")\n\t}\n}\n"],"mappings":";AAGA,IAAa,gBAAb,cAAuF,MAAM;CAC5F;CAEA,YAAY,eAA+B;
|
|
1
|
+
{"version":3,"file":"errors.cjs","names":[],"sources":["../../src/channel/errors.ts"],"sourcesContent":["import type { UnknownErrorResponseMessage } from \".\"\nimport type { UnknownRequestMessage } from \"./types\"\n\nexport class ResponseError<TErrorResponse extends UnknownErrorResponseMessage> extends Error {\n\tpublic response: TErrorResponse\n\n\tconstructor(errorResponse: TErrorResponse) {\n\t\tsuper(errorResponse.msg)\n\n\t\tthis.response = errorResponse\n\t}\n}\n\nexport class ConnectionTimeoutError extends Error {\n\tconstructor() {\n\t\tsuper(\"Connection timed out\")\n\t}\n}\nexport class TooManyConcurrentRequestsError extends Error {\n\tpublic request: UnknownRequestMessage\n\n\tconstructor(request: UnknownRequestMessage) {\n\t\tsuper(`Too many concurrent requests`)\n\n\t\tthis.request = request\n\t}\n}\nexport class RequestTimeoutError<TRequest extends UnknownRequestMessage> extends Error {\n\tpublic request: UnknownRequestMessage\n\n\tconstructor(request: TRequest) {\n\t\tsuper(`Request \\`${request.requestID}\\` timed out`)\n\n\t\tthis.request = request\n\t}\n}\n\nexport class NotReadyError extends Error {}\nexport class PortNotSetError extends Error {\n\tconstructor() {\n\t\tsuper(\"Port is not set\")\n\t}\n}\nexport class ChannelNotSetError extends Error {\n\tconstructor() {\n\t\tsuper(\"Channel is not set\")\n\t}\n}\n"],"mappings":";AAGA,IAAa,gBAAb,cAAuF,MAAM;CAC5F;CAEA,YAAY,eAA+B;EAC1C,MAAM,cAAc,GAAG;EAEvB,KAAK,WAAW;CACjB;AACD;AAEA,IAAa,yBAAb,cAA4C,MAAM;CACjD,cAAc;EACb,MAAM,sBAAsB;CAC7B;AACD;AACA,IAAa,iCAAb,cAAoD,MAAM;CACzD;CAEA,YAAY,SAAgC;EAC3C,MAAM,8BAA8B;EAEpC,KAAK,UAAU;CAChB;AACD;AACA,IAAa,sBAAb,cAAiF,MAAM;CACtF;CAEA,YAAY,SAAmB;EAC9B,MAAM,aAAa,QAAQ,UAAU,aAAa;EAElD,KAAK,UAAU;CAChB;AACD;AAEA,IAAa,gBAAb,cAAmC,MAAM,CAAC;AAC1C,IAAa,kBAAb,cAAqC,MAAM;CAC1C,cAAc;EACb,MAAM,iBAAiB;CACxB;AACD;AACA,IAAa,qBAAb,cAAwC,MAAM;CAC7C,cAAc;EACb,MAAM,oBAAoB;CAC3B;AACD"}
|
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
import { UnknownErrorResponseMessage, UnknownRequestMessage } from "./types.cjs";
|
|
2
|
-
|
|
3
2
|
//#region src/channel/errors.d.ts
|
|
4
|
-
declare class ResponseError<TErrorResponse extends UnknownErrorResponseMessage> extends Error {
|
|
3
|
+
export declare class ResponseError<TErrorResponse extends UnknownErrorResponseMessage> extends Error {
|
|
5
4
|
response: TErrorResponse;
|
|
6
5
|
constructor(errorResponse: TErrorResponse);
|
|
7
6
|
}
|
|
8
|
-
declare class ConnectionTimeoutError extends Error {
|
|
7
|
+
export declare class ConnectionTimeoutError extends Error {
|
|
9
8
|
constructor();
|
|
10
9
|
}
|
|
11
|
-
declare class TooManyConcurrentRequestsError extends Error {
|
|
10
|
+
export declare class TooManyConcurrentRequestsError extends Error {
|
|
12
11
|
request: UnknownRequestMessage;
|
|
13
12
|
constructor(request: UnknownRequestMessage);
|
|
14
13
|
}
|
|
15
|
-
declare class RequestTimeoutError<TRequest extends UnknownRequestMessage> extends Error {
|
|
14
|
+
export declare class RequestTimeoutError<TRequest extends UnknownRequestMessage> extends Error {
|
|
16
15
|
request: UnknownRequestMessage;
|
|
17
16
|
constructor(request: TRequest);
|
|
18
17
|
}
|
|
19
|
-
declare class NotReadyError extends Error {}
|
|
20
|
-
declare class PortNotSetError extends Error {
|
|
18
|
+
export declare class NotReadyError extends Error {}
|
|
19
|
+
export declare class PortNotSetError extends Error {
|
|
21
20
|
constructor();
|
|
22
21
|
}
|
|
23
|
-
declare class ChannelNotSetError extends Error {
|
|
22
|
+
export declare class ChannelNotSetError extends Error {
|
|
24
23
|
constructor();
|
|
25
24
|
}
|
|
26
25
|
//#endregion
|
|
27
|
-
export { ChannelNotSetError, ConnectionTimeoutError, NotReadyError, PortNotSetError, RequestTimeoutError, ResponseError, TooManyConcurrentRequestsError };
|
|
28
26
|
//# sourceMappingURL=errors.d.cts.map
|