@prismicio/simulator 0.1.0

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.
Files changed (127) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +98 -0
  3. package/dist/SimulatorAPI.cjs +50 -0
  4. package/dist/SimulatorAPI.cjs.map +1 -0
  5. package/dist/SimulatorAPI.d.ts +12 -0
  6. package/dist/SimulatorAPI.js +50 -0
  7. package/dist/SimulatorAPI.js.map +1 -0
  8. package/dist/SimulatorClient.cjs +54 -0
  9. package/dist/SimulatorClient.cjs.map +1 -0
  10. package/dist/SimulatorClient.d.ts +10 -0
  11. package/dist/SimulatorClient.js +54 -0
  12. package/dist/SimulatorClient.js.map +1 -0
  13. package/dist/channel/ChannelEmitter.cjs +146 -0
  14. package/dist/channel/ChannelEmitter.cjs.map +1 -0
  15. package/dist/channel/ChannelEmitter.d.ts +38 -0
  16. package/dist/channel/ChannelEmitter.js +146 -0
  17. package/dist/channel/ChannelEmitter.js.map +1 -0
  18. package/dist/channel/ChannelNetwork.cjs +112 -0
  19. package/dist/channel/ChannelNetwork.cjs.map +1 -0
  20. package/dist/channel/ChannelNetwork.d.ts +24 -0
  21. package/dist/channel/ChannelNetwork.js +112 -0
  22. package/dist/channel/ChannelNetwork.js.map +1 -0
  23. package/dist/channel/ChannelReceiver.cjs +95 -0
  24. package/dist/channel/ChannelReceiver.cjs.map +1 -0
  25. package/dist/channel/ChannelReceiver.d.ts +20 -0
  26. package/dist/channel/ChannelReceiver.js +95 -0
  27. package/dist/channel/ChannelReceiver.js.map +1 -0
  28. package/dist/channel/errors.cjs +54 -0
  29. package/dist/channel/errors.cjs.map +1 -0
  30. package/dist/channel/errors.d.ts +25 -0
  31. package/dist/channel/errors.js +54 -0
  32. package/dist/channel/errors.js.map +1 -0
  33. package/dist/channel/index.d.ts +10 -0
  34. package/dist/channel/messages.cjs +66 -0
  35. package/dist/channel/messages.cjs.map +1 -0
  36. package/dist/channel/messages.d.ts +10 -0
  37. package/dist/channel/messages.js +66 -0
  38. package/dist/channel/messages.js.map +1 -0
  39. package/dist/channel/types.cjs +11 -0
  40. package/dist/channel/types.cjs.map +1 -0
  41. package/dist/channel/types.d.ts +61 -0
  42. package/dist/channel/types.js +13 -0
  43. package/dist/channel/types.js.map +1 -0
  44. package/dist/index.cjs +33 -0
  45. package/dist/index.cjs.map +1 -0
  46. package/dist/index.d.ts +7 -0
  47. package/dist/index.js +27 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/kit/SimulatorManager.cjs +140 -0
  50. package/dist/kit/SimulatorManager.cjs.map +1 -0
  51. package/dist/kit/SimulatorManager.d.ts +15 -0
  52. package/dist/kit/SimulatorManager.js +140 -0
  53. package/dist/kit/SimulatorManager.js.map +1 -0
  54. package/dist/kit/State.cjs +82 -0
  55. package/dist/kit/State.cjs.map +1 -0
  56. package/dist/kit/State.d.ts +25 -0
  57. package/dist/kit/State.js +82 -0
  58. package/dist/kit/State.js.map +1 -0
  59. package/dist/kit/domHelpers.cjs +53 -0
  60. package/dist/kit/domHelpers.cjs.map +1 -0
  61. package/dist/kit/domHelpers.d.ts +9 -0
  62. package/dist/kit/domHelpers.js +53 -0
  63. package/dist/kit/domHelpers.js.map +1 -0
  64. package/dist/kit/eventHandlers.cjs +15 -0
  65. package/dist/kit/eventHandlers.cjs.map +1 -0
  66. package/dist/kit/eventHandlers.d.ts +4 -0
  67. package/dist/kit/eventHandlers.js +15 -0
  68. package/dist/kit/eventHandlers.js.map +1 -0
  69. package/dist/kit/getDefault.cjs +16 -0
  70. package/dist/kit/getDefault.cjs.map +1 -0
  71. package/dist/kit/getDefault.d.ts +8 -0
  72. package/dist/kit/getDefault.js +16 -0
  73. package/dist/kit/getDefault.js.map +1 -0
  74. package/dist/kit/index.cjs +26 -0
  75. package/dist/kit/index.cjs.map +1 -0
  76. package/dist/kit/index.d.ts +8 -0
  77. package/dist/kit/index.js +23 -0
  78. package/dist/kit/index.js.map +1 -0
  79. package/dist/kit/messages.cjs +29 -0
  80. package/dist/kit/messages.cjs.map +1 -0
  81. package/dist/kit/messages.d.ts +1 -0
  82. package/dist/kit/messages.js +29 -0
  83. package/dist/kit/messages.js.map +1 -0
  84. package/dist/kit/types.cjs +9 -0
  85. package/dist/kit/types.cjs.map +1 -0
  86. package/dist/kit/types.d.ts +23 -0
  87. package/dist/kit/types.js +10 -0
  88. package/dist/kit/types.js.map +1 -0
  89. package/dist/lib/EventEmitter.cjs +27 -0
  90. package/dist/lib/EventEmitter.cjs.map +1 -0
  91. package/dist/lib/EventEmitter.d.ts +10 -0
  92. package/dist/lib/EventEmitter.js +27 -0
  93. package/dist/lib/EventEmitter.js.map +1 -0
  94. package/dist/lib/__PRODUCTION__.d.ts +7 -0
  95. package/dist/lib/throttle.cjs +24 -0
  96. package/dist/lib/throttle.cjs.map +1 -0
  97. package/dist/lib/throttle.d.ts +1 -0
  98. package/dist/lib/throttle.js +24 -0
  99. package/dist/lib/throttle.js.map +1 -0
  100. package/dist/types.cjs +14 -0
  101. package/dist/types.cjs.map +1 -0
  102. package/dist/types.d.ts +34 -0
  103. package/dist/types.js +16 -0
  104. package/dist/types.js.map +1 -0
  105. package/package.json +99 -0
  106. package/src/SimulatorAPI.ts +90 -0
  107. package/src/SimulatorClient.ts +96 -0
  108. package/src/channel/ChannelEmitter.ts +278 -0
  109. package/src/channel/ChannelNetwork.ts +216 -0
  110. package/src/channel/ChannelReceiver.ts +184 -0
  111. package/src/channel/errors.ts +53 -0
  112. package/src/channel/index.ts +75 -0
  113. package/src/channel/messages.ts +115 -0
  114. package/src/channel/types.ts +138 -0
  115. package/src/index.ts +42 -0
  116. package/src/kit/SimulatorManager.ts +199 -0
  117. package/src/kit/State.ts +113 -0
  118. package/src/kit/domHelpers.ts +75 -0
  119. package/src/kit/eventHandlers.ts +16 -0
  120. package/src/kit/getDefault.ts +18 -0
  121. package/src/kit/index.ts +33 -0
  122. package/src/kit/messages.ts +25 -0
  123. package/src/kit/types.ts +30 -0
  124. package/src/lib/EventEmitter.ts +41 -0
  125. package/src/lib/__PRODUCTION__.ts +12 -0
  126. package/src/lib/throttle.ts +26 -0
  127. package/src/types.ts +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelNetwork.js","sources":["../../../src/channel/ChannelNetwork.ts"],"sourcesContent":["import {\n\tExtractErrorResponseMessage,\n\tExtractSuccessResponseMessage,\n\tRequestMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\";\n\nimport {\n\tPortNotSetError,\n\tRequestTimeoutError,\n\tResponseError,\n\tTooManyConcurrentRequestsError,\n} from \"./errors\";\n\nimport {\n\tcreateErrorResponseMessage,\n\tcreateRequestMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tisSuccessResponseMessage,\n\tvalidateMessage,\n} from \"./messages\";\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<\n\t\tstring,\n\t\tnever\n\t>,\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(\n\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, undefined, 501),\n\t\t\t\t\t);\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(\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\tmessage.requestID,\n\t\t\t\t\t\t\t) 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(\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\tmessage.requestID,\n\t\t\t\t\t\t\t) 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(\n\t\t\t\t\t\t\tcreateErrorResponseMessage(message.requestID, error, 500),\n\t\t\t\t\t\t);\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(\n\t\t\t\t\t\t`Unknown request ID received in response: ${JSON.stringify(\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\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>>(\n\t\t\t(resolve, reject) => {\n\t\t\t\tconst requestTimeout = setTimeout(() => {\n\t\t\t\t\tif (this._pendingRequests.has(request.requestID)) {\n\t\t\t\t\t\tthis._pendingRequests.delete(request.requestID);\n\t\t\t\t\t}\n\t\t\t\t\treject(new RequestTimeoutError(request));\n\t\t\t\t}, options.timeout || this.options.defaultTimeout);\n\n\t\t\t\tthis._pendingRequests.set(\n\t\t\t\t\trequest.requestID,\n\t\t\t\t\t(response: TResponse): void => {\n\t\t\t\t\t\tclearTimeout(requestTimeout);\n\n\t\t\t\t\t\tisSuccessResponseMessage(response)\n\t\t\t\t\t\t\t? resolve(response as ExtractSuccessResponseMessage<TResponse>)\n\t\t\t\t\t\t\t: reject(\n\t\t\t\t\t\t\t\t\tnew ResponseError(\n\t\t\t\t\t\t\t\t\t\tresponse as ExtractErrorResponseMessage<TResponse>,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t );\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tpostMessage(request);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected postResponse<TResponse extends UnknownResponseMessage>(\n\t\tresponse: TResponse,\n\t\tpostMessage = (response: TResponse): void =>\n\t\t\tthis.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"],"names":["request","response"],"mappings":";;;;;;;;AAqCO,MAAM,+BAAsD;AAAA,EAClE,OAAO;AAAA,EACP,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,iBAAiB;;MAGI,eAAc;AAAA,EAiCnC,YACC,iBACA,SAAkD;AA5B5C;AACA;AAEC,iCAA4B;AAqB5B;AAAA,gEAA6D;AAMpE,SAAK,kBAAkB;AACvB,SAAK,UAAU,EAAE,GAAG,8BAA8B,GAAG,QAAO;AAAA,EAC7D;AAAA,EA5BA,IAAc,OAAI;AACb,QAAA,CAAC,KAAK,OAAO;AAChB,YAAM,IAAI,gBAAe;AAAA,IACzB;AAED,WAAO,KAAK;AAAA,EACb;AAAA,EACA,IAAc,KAAK,MAAwB;AAE1C,QAAI,KAAK,OAAO;AACf,WAAK,MAAM,YAAY;AAAA,IACvB;AAED,SAAK,QAAQ;AACb,QAAI,KAAK,OAAO;AACf,WAAK,MAAM,YAAY,KAAK,UAAU,KAAK,IAAI;AAAA,IAC/C;AAAA,EACF;AAAA,EAaO,qBACN,MACA,MAAW;AAEX,WAAO,qBAAqB,MAAM,MAAM,KAAK,QAAQ,eAAe;AAAA,EACrE;AAAA,EAEU,MAAM,UAAU,OAA4B;AACjD,QAAA,KAAK,QAAQ,OAAO;AAEf,cAAA,MAAM,MAAM,IAAI;AAAA,IACxB;AAEG,QAAA;AACG,YAAA,UAAU,gBAAgB,MAAM,IAAI;AAEtC,UAAA,iBAAiB,OAAO,GAAG;AAC9B,YAAI,CAAC,KAAK,gBAAgB,QAAQ,IAAI,GAAG;AACxC,eAAK,aACJ,2BAA2B,QAAQ,WAAW,QAAW,GAAG,CAAC;AAAA,QAAA,OAExD;AACF,cAAA;AAEH,kBAAM,WAAW,MAAM,KAAK,gBAAgB,QAAQ,IAAI,EAAE,SAAS;AAAA,cAClE,SAAS,6BAA6B,KACrC,MACA,QAAQ,SAAS;AAAA,cAIlB,OAAO,2BAA2B,KACjC,MACA,QAAQ,SAAS;AAAA,YAAA,CAIlB;AAED,iBAAK,aAAa,QAAQ;AAAA,mBAClB;AACR,iBAAK,aACJ,2BAA2B,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,UAE1D;AAAA,QACD;AAAA,MAAA,OACK;AACN,YAAI,CAAC,KAAK,iBAAiB,IAAI,QAAQ,SAAS,GAAG;AAClD,kBAAQ,MACP,4CAA4C,KAAK,UAChD,OAAO,GACL;AAAA,QAAA,OAEE;AAGN,eAAK,iBAAiB,IAAI,QAAQ,SAAS,EAAG,OAAO;AAChD,eAAA,iBAAiB,OAAO,QAAQ,SAAS;AAAA,QAC9C;AAAA,MACD;AAAA,aACO;AACR,UAAI,iBAAiB,WAAW;AACvB,gBAAA,KAAK,MAAM,OAAO;AAAA,MAAA,OACpB;AAEA,cAAA;AAAA,MACN;AAAA,IACD;AAAA,EACF;AAAA,EAEU,YAIT,SACA,cAAc,CAACA,aAA4B,KAAK,KAAK,YAAYA,QAAO,GACxE,UAA8B,CAAA,GAAE;AAE5B,QAAA,KAAK,QAAQ,OAAO;AAEvB,cAAQ,MAAM,OAAO;AAAA,IACrB;AAED,QAAI,KAAK,iBAAiB,QAAQ,KAAK,QAAQ,2BAA2B;AACnE,YAAA,IAAI,+BAA+B,OAAO;AAAA,IAChD;AAED,WAAO,IAAI,QACV,CAAC,SAAS,WAAU;AACb,YAAA,iBAAiB,WAAW,MAAK;AACtC,YAAI,KAAK,iBAAiB,IAAI,QAAQ,SAAS,GAAG;AAC5C,eAAA,iBAAiB,OAAO,QAAQ,SAAS;AAAA,QAC9C;AACM,eAAA,IAAI,oBAAoB,OAAO,CAAC;AAAA,MACrC,GAAA,QAAQ,WAAW,KAAK,QAAQ,cAAc;AAEjD,WAAK,iBAAiB,IACrB,QAAQ,WACR,CAAC,aAA6B;AAC7B,qBAAa,cAAc;AAEF,iCAAA,QAAQ,IAC9B,QAAQ,QAAoD,IAC5D,OACA,IAAI,cACH,QAAkD,CAClD;AAAA,MAAA,CAEJ;AAGF,kBAAY,OAAO;AAAA,IAAA,CACnB;AAAA,EAEH;AAAA,EAEU,aACT,UACA,cAAc,CAACC,cACd,KAAK,KAAK,YAAYA,SAAQ,GAAC;AAE5B,QAAA,KAAK,QAAQ,OAAO;AAEvB,cAAQ,MAAM,QAAQ;AAAA,IACtB;AAED,gBAAY,QAAQ;AAEb,WAAA;AAAA,EACR;AACA;"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => {
5
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ return value;
7
+ };
8
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
+ const types = require("./types.cjs");
10
+ const errors = require("./errors.cjs");
11
+ const ChannelNetwork = require("./ChannelNetwork.cjs");
12
+ const messages = require("./messages.cjs");
13
+ const channelReceiverDefaultOptions = {
14
+ readyTimeout: 2e4,
15
+ requestIDPrefix: "receiver-"
16
+ };
17
+ class ChannelReceiver extends ChannelNetwork.ChannelNetwork {
18
+ constructor(requestHandlers, options) {
19
+ super(requestHandlers, { ...channelReceiverDefaultOptions, ...options });
20
+ __publicField(this, "_ready", false);
21
+ window.addEventListener("message", (event) => {
22
+ this._onPublicMessage(event);
23
+ });
24
+ }
25
+ /**
26
+ * Tells the emitter that receiver is ready
27
+ */
28
+ async ready() {
29
+ if (window.parent === window) {
30
+ throw new Error("Receiver is currently not embedded as an iframe");
31
+ }
32
+ this._ready = false;
33
+ const request = this.createRequestMessage(types.InternalReceiverRequestType.Ready, void 0);
34
+ const response = await this.postRequest(request, (request2) => {
35
+ window.parent.postMessage(request2, "*");
36
+ }, {
37
+ timeout: this.options.readyTimeout
38
+ });
39
+ this._ready = true;
40
+ return response;
41
+ }
42
+ /**
43
+ * Handles public messages
44
+ */
45
+ _onPublicMessage(event) {
46
+ try {
47
+ const message = messages.validateMessage(event.data);
48
+ if (messages.isRequestMessage(message)) {
49
+ if (this.options.debug) {
50
+ console.debug(event.data);
51
+ }
52
+ switch (message.type) {
53
+ case types.InternalEmitterRequestType.Connect:
54
+ this.port = event.ports[0];
55
+ const { data } = message;
56
+ this.options = {
57
+ ...this.options,
58
+ ...data,
59
+ // Ensure core options remain the same
60
+ debug: this.options.debug,
61
+ requestIDPrefix: this.options.requestIDPrefix,
62
+ readyTimeout: this.options.readyTimeout
63
+ };
64
+ const response = messages.createSuccessResponseMessage(message.requestID, void 0);
65
+ this.postResponse(response);
66
+ break;
67
+ default:
68
+ this.postResponse(messages.createErrorResponseMessage(message.requestID, void 0), (response2) => {
69
+ event.source.postMessage(response2, event.origin);
70
+ });
71
+ break;
72
+ }
73
+ } else {
74
+ if (!this._ready) {
75
+ this.onMessage(event);
76
+ }
77
+ }
78
+ } catch (error) {
79
+ if (error instanceof TypeError)
80
+ ;
81
+ else {
82
+ throw error;
83
+ }
84
+ }
85
+ }
86
+ postFormattedRequest(type, data, options = {}) {
87
+ if (!this._ready) {
88
+ throw new errors.NotReadyError("Receiver is not ready, use `ChannelReceiver.ready()` first");
89
+ }
90
+ return this.postRequest(this.createRequestMessage(type, data), void 0, options);
91
+ }
92
+ }
93
+ exports.ChannelReceiver = ChannelReceiver;
94
+ exports.channelReceiverDefaultOptions = channelReceiverDefaultOptions;
95
+ //# sourceMappingURL=ChannelReceiver.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelReceiver.cjs","sources":["../../../src/channel/ChannelReceiver.ts"],"sourcesContent":["import {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterRequestType,\n\tInternalEmitterTransactions,\n\tInternalReceiverRequestType,\n\tRequestMessage,\n\tResponseMessage,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\";\n\nimport { NotReadyError } from \"./errors\";\n\nimport {\n\tChannelNetwork,\n\tChannelNetworkOptions,\n\tPostRequestOptions,\n} from \"./ChannelNetwork\";\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\";\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 &\n\tChannelNetworkOptions;\n\nexport abstract class ChannelReceiver<\n\tTEmitterTransactions extends Record<string, UnknownTransaction> = Record<\n\t\tstring,\n\t\tnever\n\t>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<\n\tTEmitterTransactions,\n\tChannelReceiverOptions & TOptions\n> {\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/**\n\t * Tells the emitter that receiver is ready\n\t */\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(\n\t\t\tInternalReceiverRequestType.Ready,\n\t\t\tundefined,\n\t\t);\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/**\n\t * Handles public messages\n\t */\n\tprivate _onPublicMessage(event: MessageEvent<unknown>): void {\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 } =\n\t\t\t\t\t\t\tmessage 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(\n\t\t\t\t\t\t\tmessage.requestID,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t);\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(\n\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t\tevent.origin,\n\t\t\t\t\t\t\t\t);\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(\n\t\t\t\t\"Receiver is not ready, use `ChannelReceiver.ready()` first\",\n\t\t\t);\n\t\t}\n\n\t\treturn this.postRequest(\n\t\t\tthis.createRequestMessage(type, data),\n\t\t\tundefined,\n\t\t\toptions,\n\t\t);\n\t}\n}\n"],"names":["ChannelNetwork","InternalReceiverRequestType","request","validateMessage","isRequestMessage","InternalEmitterRequestType","createSuccessResponseMessage","createErrorResponseMessage","response","NotReadyError"],"mappings":";;;;;;;;;;;;AAgCO,MAAM,gCACqB;AAAA,EACjC,cAAc;AAAA,EACd,iBAAiB;;AAMZ,MAAgB,wBAMZA,eAAAA,eAGT;AAAA,EAGA,YACC,iBACA,SAAsD;AAEtD,UAAM,iBAAiB,EAAE,GAAG,+BAA+B,GAAG,QAAS,CAAA;AANhE,kCAAS;AAQT,WAAA,iBAAiB,WAAW,CAAC,UAAS;AAC5C,WAAK,iBAAiB,KAAK;AAAA,IAAA,CAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM,QAAK;AACb,QAAA,OAAO,WAAW,QAAQ;AACvB,YAAA,IAAI,MAAM,iDAAiD;AAAA,IACjE;AAED,SAAK,SAAS;AAEd,UAAM,UAAU,KAAK,qBACpBC,MAAA,4BAA4B,OAC5B,MAAS;AAGV,UAAM,WAAW,MAAM,KAAK,YAI3B,SACA,CAACC,aAAW;AACJ,aAAA,OAAO,YAAYA,UAAS,GAAG;AAAA,IAAA,GAEvC;AAAA,MACC,SAAS,KAAK,QAAQ;AAAA,IAAA,CACtB;AAGF,SAAK,SAAS;AAEP,WAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAA4B;AAChD,QAAA;AACG,YAAA,UAAUC,SAAAA,gBAAgB,MAAM,IAAI;AAEtC,UAAAC,SAAAA,iBAAiB,OAAO,GAAG;AAC1B,YAAA,KAAK,QAAQ,OAAO;AAEf,kBAAA,MAAM,MAAM,IAAI;AAAA,QACxB;AAED,gBAAQ,QAAQ,MAAM;AAAA,UACrB,KAAKC,MAA2B,2BAAA;AAE1B,iBAAA,OAAO,MAAM,MAAM,CAAC;AAGnB,kBAAA,EAAE,KACP,IAAA;AACD,iBAAK,UAAU;AAAA,cACd,GAAG,KAAK;AAAA,cACR,GAAG;AAAA;AAAA,cAEH,OAAO,KAAK,QAAQ;AAAA,cACpB,iBAAiB,KAAK,QAAQ;AAAA,cAC9B,cAAc,KAAK,QAAQ;AAAA,YAAA;AAG5B,kBAAM,WAAWC,SAAAA,6BAChB,QAAQ,WACR,MAAS;AAGV,iBAAK,aAAa,QAAQ;AAC1B;AAAA,UAED;AACC,iBAAK,aACJC,SAAAA,2BAA2B,QAAQ,WAAW,MAAS,GACvD,CAACC,cAAY;AACX,oBAAM,OAAuB,YAC7BA,WACA,MAAM,MAAM;AAAA,YAAA,CAEb;AAEF;AAAA,QACD;AAAA,MAAA,OACK;AAEF,YAAA,CAAC,KAAK,QAAQ;AACjB,eAAK,UAAU,KAAK;AAAA,QACpB;AAAA,MACD;AAAA,aACO;AACR,UAAI,iBAAiB;AAAW;AAAA,WAEzB;AAEA,cAAA;AAAA,MACN;AAAA,IACD;AAAA,EACF;AAAA,EAEU,qBAIT,MACA,MACA,UAA8B,CAAA,GAAE;AAE5B,QAAA,CAAC,KAAK,QAAQ;AACX,YAAA,IAAIC,OAAAA,cACT,4DAA4D;AAAA,IAE7D;AAEM,WAAA,KAAK,YACX,KAAK,qBAAqB,MAAM,IAAI,GACpC,QACA,OAAO;AAAA,EAET;AACA;;;"}
@@ -0,0 +1,20 @@
1
+ import { ExtractSuccessResponseMessage, SuccessResponseMessage, TransactionsHandlers, UnknownRequestMessage, UnknownResponseMessage, UnknownTransaction } from "./types";
2
+ import { ChannelNetwork, ChannelNetworkOptions, PostRequestOptions } from "./ChannelNetwork";
3
+ export type ChannelReceiverOptions = {
4
+ readyTimeout: number;
5
+ };
6
+ export declare const channelReceiverDefaultOptions: ChannelReceiverOptions & Partial<ChannelNetworkOptions>;
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> {
9
+ private _ready;
10
+ constructor(requestHandlers: TransactionsHandlers<TEmitterTransactions>, options: Partial<AllChannelReceiverOptions> & TOptions);
11
+ /**
12
+ * Tells the emitter that receiver is ready
13
+ */
14
+ ready(): Promise<SuccessResponseMessage>;
15
+ /**
16
+ * Handles public messages
17
+ */
18
+ private _onPublicMessage;
19
+ protected postFormattedRequest<TRequest extends UnknownRequestMessage, TResponse extends UnknownResponseMessage>(type: TRequest["type"], data?: TRequest["data"], options?: PostRequestOptions): Promise<ExtractSuccessResponseMessage<TResponse>>;
20
+ }
@@ -0,0 +1,95 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+ import { InternalReceiverRequestType, InternalEmitterRequestType } from "./types.js";
8
+ import { NotReadyError } from "./errors.js";
9
+ import { ChannelNetwork } from "./ChannelNetwork.js";
10
+ import { validateMessage, isRequestMessage, createErrorResponseMessage, createSuccessResponseMessage } from "./messages.js";
11
+ const channelReceiverDefaultOptions = {
12
+ readyTimeout: 2e4,
13
+ requestIDPrefix: "receiver-"
14
+ };
15
+ class ChannelReceiver extends ChannelNetwork {
16
+ constructor(requestHandlers, options) {
17
+ super(requestHandlers, { ...channelReceiverDefaultOptions, ...options });
18
+ __publicField(this, "_ready", false);
19
+ window.addEventListener("message", (event) => {
20
+ this._onPublicMessage(event);
21
+ });
22
+ }
23
+ /**
24
+ * Tells the emitter that receiver is ready
25
+ */
26
+ async ready() {
27
+ if (window.parent === window) {
28
+ throw new Error("Receiver is currently not embedded as an iframe");
29
+ }
30
+ this._ready = false;
31
+ const request = this.createRequestMessage(InternalReceiverRequestType.Ready, void 0);
32
+ const response = await this.postRequest(request, (request2) => {
33
+ window.parent.postMessage(request2, "*");
34
+ }, {
35
+ timeout: this.options.readyTimeout
36
+ });
37
+ this._ready = true;
38
+ return response;
39
+ }
40
+ /**
41
+ * Handles public messages
42
+ */
43
+ _onPublicMessage(event) {
44
+ try {
45
+ const message = validateMessage(event.data);
46
+ if (isRequestMessage(message)) {
47
+ if (this.options.debug) {
48
+ console.debug(event.data);
49
+ }
50
+ switch (message.type) {
51
+ case InternalEmitterRequestType.Connect:
52
+ this.port = event.ports[0];
53
+ const { data } = message;
54
+ this.options = {
55
+ ...this.options,
56
+ ...data,
57
+ // Ensure core options remain the same
58
+ debug: this.options.debug,
59
+ requestIDPrefix: this.options.requestIDPrefix,
60
+ readyTimeout: this.options.readyTimeout
61
+ };
62
+ const response = createSuccessResponseMessage(message.requestID, void 0);
63
+ this.postResponse(response);
64
+ break;
65
+ default:
66
+ this.postResponse(createErrorResponseMessage(message.requestID, void 0), (response2) => {
67
+ event.source.postMessage(response2, event.origin);
68
+ });
69
+ break;
70
+ }
71
+ } else {
72
+ if (!this._ready) {
73
+ this.onMessage(event);
74
+ }
75
+ }
76
+ } catch (error) {
77
+ if (error instanceof TypeError)
78
+ ;
79
+ else {
80
+ throw error;
81
+ }
82
+ }
83
+ }
84
+ postFormattedRequest(type, data, options = {}) {
85
+ if (!this._ready) {
86
+ throw new NotReadyError("Receiver is not ready, use `ChannelReceiver.ready()` first");
87
+ }
88
+ return this.postRequest(this.createRequestMessage(type, data), void 0, options);
89
+ }
90
+ }
91
+ export {
92
+ ChannelReceiver,
93
+ channelReceiverDefaultOptions
94
+ };
95
+ //# sourceMappingURL=ChannelReceiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelReceiver.js","sources":["../../../src/channel/ChannelReceiver.ts"],"sourcesContent":["import {\n\tExtractSuccessResponseMessage,\n\tInternalEmitterRequestType,\n\tInternalEmitterTransactions,\n\tInternalReceiverRequestType,\n\tRequestMessage,\n\tResponseMessage,\n\tSuccessResponseMessage,\n\tTransactionsHandlers,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownTransaction,\n} from \"./types\";\n\nimport { NotReadyError } from \"./errors\";\n\nimport {\n\tChannelNetwork,\n\tChannelNetworkOptions,\n\tPostRequestOptions,\n} from \"./ChannelNetwork\";\nimport {\n\tcreateErrorResponseMessage,\n\tcreateSuccessResponseMessage,\n\tisRequestMessage,\n\tvalidateMessage,\n} from \"./messages\";\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 &\n\tChannelNetworkOptions;\n\nexport abstract class ChannelReceiver<\n\tTEmitterTransactions extends Record<string, UnknownTransaction> = Record<\n\t\tstring,\n\t\tnever\n\t>,\n\tTOptions extends Record<string, unknown> = Record<string, unknown>,\n> extends ChannelNetwork<\n\tTEmitterTransactions,\n\tChannelReceiverOptions & TOptions\n> {\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/**\n\t * Tells the emitter that receiver is ready\n\t */\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(\n\t\t\tInternalReceiverRequestType.Ready,\n\t\t\tundefined,\n\t\t);\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/**\n\t * Handles public messages\n\t */\n\tprivate _onPublicMessage(event: MessageEvent<unknown>): void {\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 } =\n\t\t\t\t\t\t\tmessage 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(\n\t\t\t\t\t\t\tmessage.requestID,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t);\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(\n\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t\tevent.origin,\n\t\t\t\t\t\t\t\t);\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(\n\t\t\t\t\"Receiver is not ready, use `ChannelReceiver.ready()` first\",\n\t\t\t);\n\t\t}\n\n\t\treturn this.postRequest(\n\t\t\tthis.createRequestMessage(type, data),\n\t\t\tundefined,\n\t\t\toptions,\n\t\t);\n\t}\n}\n"],"names":["request","response"],"mappings":";;;;;;;;;;AAgCO,MAAM,gCACqB;AAAA,EACjC,cAAc;AAAA,EACd,iBAAiB;;AAMZ,MAAgB,wBAMZ,eAGT;AAAA,EAGA,YACC,iBACA,SAAsD;AAEtD,UAAM,iBAAiB,EAAE,GAAG,+BAA+B,GAAG,QAAS,CAAA;AANhE,kCAAS;AAQT,WAAA,iBAAiB,WAAW,CAAC,UAAS;AAC5C,WAAK,iBAAiB,KAAK;AAAA,IAAA,CAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM,QAAK;AACb,QAAA,OAAO,WAAW,QAAQ;AACvB,YAAA,IAAI,MAAM,iDAAiD;AAAA,IACjE;AAED,SAAK,SAAS;AAEd,UAAM,UAAU,KAAK,qBACpB,4BAA4B,OAC5B,MAAS;AAGV,UAAM,WAAW,MAAM,KAAK,YAI3B,SACA,CAACA,aAAW;AACJ,aAAA,OAAO,YAAYA,UAAS,GAAG;AAAA,IAAA,GAEvC;AAAA,MACC,SAAS,KAAK,QAAQ;AAAA,IAAA,CACtB;AAGF,SAAK,SAAS;AAEP,WAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAA4B;AAChD,QAAA;AACG,YAAA,UAAU,gBAAgB,MAAM,IAAI;AAEtC,UAAA,iBAAiB,OAAO,GAAG;AAC1B,YAAA,KAAK,QAAQ,OAAO;AAEf,kBAAA,MAAM,MAAM,IAAI;AAAA,QACxB;AAED,gBAAQ,QAAQ,MAAM;AAAA,UACrB,KAAK,2BAA2B;AAE1B,iBAAA,OAAO,MAAM,MAAM,CAAC;AAGnB,kBAAA,EAAE,KACP,IAAA;AACD,iBAAK,UAAU;AAAA,cACd,GAAG,KAAK;AAAA,cACR,GAAG;AAAA;AAAA,cAEH,OAAO,KAAK,QAAQ;AAAA,cACpB,iBAAiB,KAAK,QAAQ;AAAA,cAC9B,cAAc,KAAK,QAAQ;AAAA,YAAA;AAG5B,kBAAM,WAAW,6BAChB,QAAQ,WACR,MAAS;AAGV,iBAAK,aAAa,QAAQ;AAC1B;AAAA,UAED;AACC,iBAAK,aACJ,2BAA2B,QAAQ,WAAW,MAAS,GACvD,CAACC,cAAY;AACX,oBAAM,OAAuB,YAC7BA,WACA,MAAM,MAAM;AAAA,YAAA,CAEb;AAEF;AAAA,QACD;AAAA,MAAA,OACK;AAEF,YAAA,CAAC,KAAK,QAAQ;AACjB,eAAK,UAAU,KAAK;AAAA,QACpB;AAAA,MACD;AAAA,aACO;AACR,UAAI,iBAAiB;AAAW;AAAA,WAEzB;AAEA,cAAA;AAAA,MACN;AAAA,IACD;AAAA,EACF;AAAA,EAEU,qBAIT,MACA,MACA,UAA8B,CAAA,GAAE;AAE5B,QAAA,CAAC,KAAK,QAAQ;AACX,YAAA,IAAI,cACT,4DAA4D;AAAA,IAE7D;AAEM,WAAA,KAAK,YACX,KAAK,qBAAqB,MAAM,IAAI,GACpC,QACA,OAAO;AAAA,EAET;AACA;"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => {
5
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ return value;
7
+ };
8
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
+ class ResponseError extends Error {
10
+ constructor(errorResponse) {
11
+ super(errorResponse.msg);
12
+ __publicField(this, "response");
13
+ this.response = errorResponse;
14
+ }
15
+ }
16
+ class ConnectionTimeoutError extends Error {
17
+ constructor() {
18
+ super("Connection timed out");
19
+ }
20
+ }
21
+ class TooManyConcurrentRequestsError extends Error {
22
+ constructor(request) {
23
+ super(`Too many concurrent requests`);
24
+ __publicField(this, "request");
25
+ this.request = request;
26
+ }
27
+ }
28
+ class RequestTimeoutError extends Error {
29
+ constructor(request) {
30
+ super(`Request \`${request.requestID}\` timed out`);
31
+ __publicField(this, "request");
32
+ this.request = request;
33
+ }
34
+ }
35
+ class NotReadyError extends Error {
36
+ }
37
+ class PortNotSetError extends Error {
38
+ constructor() {
39
+ super("Port is not set");
40
+ }
41
+ }
42
+ class ChannelNotSetError extends Error {
43
+ constructor() {
44
+ super("Channel is not set");
45
+ }
46
+ }
47
+ exports.ChannelNotSetError = ChannelNotSetError;
48
+ exports.ConnectionTimeoutError = ConnectionTimeoutError;
49
+ exports.NotReadyError = NotReadyError;
50
+ exports.PortNotSetError = PortNotSetError;
51
+ exports.RequestTimeoutError = RequestTimeoutError;
52
+ exports.ResponseError = ResponseError;
53
+ exports.TooManyConcurrentRequestsError = TooManyConcurrentRequestsError;
54
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","sources":["../../../src/channel/errors.ts"],"sourcesContent":["import { UnknownErrorResponseMessage } from \".\";\n\nimport { UnknownRequestMessage } from \"./types\";\n\nexport class ResponseError<\n\tTErrorResponse extends UnknownErrorResponseMessage,\n> 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<\n\tTRequest extends UnknownRequestMessage,\n> 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"],"names":[],"mappings":";;;;;;;;AAIM,MAAO,sBAEH,MAAK;AAAA,EAGd,YAAY,eAA6B;AACxC,UAAM,cAAc,GAAG;AAHjB;AAKN,SAAK,WAAW;AAAA,EACjB;AACA;AAEK,MAAO,+BAA+B,MAAK;AAAA,EAChD,cAAA;AACC,UAAM,sBAAsB;AAAA,EAC7B;AACA;AACK,MAAO,uCAAuC,MAAK;AAAA,EAGxD,YAAY,SAA8B;AACzC,UAAM,8BAA8B;AAH9B;AAKN,SAAK,UAAU;AAAA,EAChB;AACA;AACK,MAAO,4BAEH,MAAK;AAAA,EAGd,YAAY,SAAiB;AACtB,UAAA,aAAa,QAAQ,uBAAuB;AAH5C;AAKN,SAAK,UAAU;AAAA,EAChB;AACA;AAEK,MAAO,sBAAsB,MAAK;AAAG;AACrC,MAAO,wBAAwB,MAAK;AAAA,EACzC,cAAA;AACC,UAAM,iBAAiB;AAAA,EACxB;AACA;AACK,MAAO,2BAA2B,MAAK;AAAA,EAC5C,cAAA;AACC,UAAM,oBAAoB;AAAA,EAC3B;AACA;;;;;;;;"}
@@ -0,0 +1,25 @@
1
+ import { UnknownErrorResponseMessage } from ".";
2
+ import { UnknownRequestMessage } from "./types";
3
+ export declare class ResponseError<TErrorResponse extends UnknownErrorResponseMessage> extends Error {
4
+ response: TErrorResponse;
5
+ constructor(errorResponse: TErrorResponse);
6
+ }
7
+ export declare class ConnectionTimeoutError extends Error {
8
+ constructor();
9
+ }
10
+ export declare class TooManyConcurrentRequestsError extends Error {
11
+ request: UnknownRequestMessage;
12
+ constructor(request: UnknownRequestMessage);
13
+ }
14
+ export declare class RequestTimeoutError<TRequest extends UnknownRequestMessage> extends Error {
15
+ request: UnknownRequestMessage;
16
+ constructor(request: TRequest);
17
+ }
18
+ export declare class NotReadyError extends Error {
19
+ }
20
+ export declare class PortNotSetError extends Error {
21
+ constructor();
22
+ }
23
+ export declare class ChannelNotSetError extends Error {
24
+ constructor();
25
+ }
@@ -0,0 +1,54 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+ class ResponseError extends Error {
8
+ constructor(errorResponse) {
9
+ super(errorResponse.msg);
10
+ __publicField(this, "response");
11
+ this.response = errorResponse;
12
+ }
13
+ }
14
+ class ConnectionTimeoutError extends Error {
15
+ constructor() {
16
+ super("Connection timed out");
17
+ }
18
+ }
19
+ class TooManyConcurrentRequestsError extends Error {
20
+ constructor(request) {
21
+ super(`Too many concurrent requests`);
22
+ __publicField(this, "request");
23
+ this.request = request;
24
+ }
25
+ }
26
+ class RequestTimeoutError extends Error {
27
+ constructor(request) {
28
+ super(`Request \`${request.requestID}\` timed out`);
29
+ __publicField(this, "request");
30
+ this.request = request;
31
+ }
32
+ }
33
+ class NotReadyError extends Error {
34
+ }
35
+ class PortNotSetError extends Error {
36
+ constructor() {
37
+ super("Port is not set");
38
+ }
39
+ }
40
+ class ChannelNotSetError extends Error {
41
+ constructor() {
42
+ super("Channel is not set");
43
+ }
44
+ }
45
+ export {
46
+ ChannelNotSetError,
47
+ ConnectionTimeoutError,
48
+ NotReadyError,
49
+ PortNotSetError,
50
+ RequestTimeoutError,
51
+ ResponseError,
52
+ TooManyConcurrentRequestsError
53
+ };
54
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sources":["../../../src/channel/errors.ts"],"sourcesContent":["import { UnknownErrorResponseMessage } from \".\";\n\nimport { UnknownRequestMessage } from \"./types\";\n\nexport class ResponseError<\n\tTErrorResponse extends UnknownErrorResponseMessage,\n> 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<\n\tTRequest extends UnknownRequestMessage,\n> 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"],"names":[],"mappings":";;;;;;AAIM,MAAO,sBAEH,MAAK;AAAA,EAGd,YAAY,eAA6B;AACxC,UAAM,cAAc,GAAG;AAHjB;AAKN,SAAK,WAAW;AAAA,EACjB;AACA;AAEK,MAAO,+BAA+B,MAAK;AAAA,EAChD,cAAA;AACC,UAAM,sBAAsB;AAAA,EAC7B;AACA;AACK,MAAO,uCAAuC,MAAK;AAAA,EAGxD,YAAY,SAA8B;AACzC,UAAM,8BAA8B;AAH9B;AAKN,SAAK,UAAU;AAAA,EAChB;AACA;AACK,MAAO,4BAEH,MAAK;AAAA,EAGd,YAAY,SAAiB;AACtB,UAAA,aAAa,QAAQ,uBAAuB;AAH5C;AAKN,SAAK,UAAU;AAAA,EAChB;AACA;AAEK,MAAO,sBAAsB,MAAK;AAAG;AACrC,MAAO,wBAAwB,MAAK;AAAA,EACzC,cAAA;AACC,UAAM,iBAAiB;AAAA,EACxB;AACA;AACK,MAAO,2BAA2B,MAAK;AAAA,EAC5C,cAAA;AACC,UAAM,oBAAoB;AAAA,EAC3B;AACA;"}
@@ -0,0 +1,10 @@
1
+ export { ChannelNetwork, channelNetworkDefaultOptions } from "./ChannelNetwork";
2
+ export type { PostRequestOptions, ChannelNetworkOptions, } from "./ChannelNetwork";
3
+ export { ChannelEmitter, channelEmitterDefaultOptions } from "./ChannelEmitter";
4
+ export type { ChannelEmitterOptions, AllChannelEmitterOptions, } from "./ChannelEmitter";
5
+ export { ChannelReceiver, channelReceiverDefaultOptions, } from "./ChannelReceiver";
6
+ export type { ChannelReceiverOptions, AllChannelReceiverOptions, } from "./ChannelReceiver";
7
+ export { createRequestMessage, createSuccessResponseMessage, createErrorResponseMessage, validateMessage, isRequestMessage, isResponseMessage, isSuccessResponseMessage, isErrorResponseMessage, } from "./messages";
8
+ export { ResponseError, ConnectionTimeoutError, TooManyConcurrentRequestsError, RequestTimeoutError, NotReadyError, PortNotSetError, ChannelNotSetError, } from "./errors";
9
+ export { InternalEmitterRequestType, InternalReceiverRequestType, } from "./types";
10
+ export type { RequestMessage, ResponseMessage, ErrorResponseMessage, SuccessResponseMessage, ExtractSuccessResponseMessage, ExtractErrorResponseMessage, UnknownRequestMessage, UnknownSuccessResponseMessage, UnknownErrorResponseMessage, UnknownResponseMessage, UnknownMessage, Transaction, TransactionMethod, TransactionHandler, TransactionsMethods, TransactionsHandlers, UnknownTransaction, UnknownTransactionMethod, UnknownTransactionHandler, InternalEmitterTransactions, InternalReceiverTransactions, } from "./types";
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const statuses = require("statuses");
4
+ let requestID = 0;
5
+ const createRequestMessage = (type, data, prefix = "") => {
6
+ return {
7
+ requestID: `${prefix}${requestID++}`,
8
+ type,
9
+ data
10
+ };
11
+ };
12
+ const createSuccessResponseMessage = (requestID2, data, status = 200) => {
13
+ var _a;
14
+ if (status >= 400) {
15
+ throw new TypeError(`Invalid success status code, expected status to be within \`[100;400[\`, got \`${status}\``);
16
+ }
17
+ return {
18
+ requestID: requestID2,
19
+ status,
20
+ msg: ((_a = statuses.message[status]) == null ? void 0 : _a.replace(/\.$/, "").toLowerCase()) ?? "",
21
+ data
22
+ };
23
+ };
24
+ const createErrorResponseMessage = (requestID2, error, status = 400) => {
25
+ var _a;
26
+ if (status < 400) {
27
+ throw new TypeError(`Invalid error status code, expected status to be within \`[500;600[\`, got \`${status}\``);
28
+ }
29
+ return {
30
+ requestID: requestID2,
31
+ status,
32
+ msg: ((_a = statuses.message[status]) == null ? void 0 : _a.replace(/\.$/, "").toLowerCase()) ?? "",
33
+ error
34
+ };
35
+ };
36
+ const validateMessage = (message) => {
37
+ if (typeof message !== "object" || message === null) {
38
+ throw new TypeError(`Invalid message received, expected message to be of type \`object\`, got \`${typeof message}\``);
39
+ } else if (!Object.keys(message).every((key) => ["requestID", "type", "data", "status", "msg", "error"].includes(key))) {
40
+ throw new TypeError(`Invalid message received: ${JSON.stringify(message)}`);
41
+ } else if (typeof message.requestID !== "string") {
42
+ throw new TypeError(`Invalid message received, expected \`message.requestID\` to be of type \`string\`, got \`${typeof message.id}\``);
43
+ }
44
+ return message;
45
+ };
46
+ const isRequestMessage = (message) => {
47
+ return "type" in message;
48
+ };
49
+ const isResponseMessage = (message) => {
50
+ return !("type" in message);
51
+ };
52
+ const isSuccessResponseMessage = (message) => {
53
+ return isResponseMessage(message) && !("error" in message);
54
+ };
55
+ const isErrorResponseMessage = (message) => {
56
+ return isResponseMessage(message) && !("data" in message);
57
+ };
58
+ exports.createErrorResponseMessage = createErrorResponseMessage;
59
+ exports.createRequestMessage = createRequestMessage;
60
+ exports.createSuccessResponseMessage = createSuccessResponseMessage;
61
+ exports.isErrorResponseMessage = isErrorResponseMessage;
62
+ exports.isRequestMessage = isRequestMessage;
63
+ exports.isResponseMessage = isResponseMessage;
64
+ exports.isSuccessResponseMessage = isSuccessResponseMessage;
65
+ exports.validateMessage = validateMessage;
66
+ //# sourceMappingURL=messages.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.cjs","sources":["../../../src/channel/messages.ts"],"sourcesContent":["import statuses from \"statuses\";\n\nimport {\n\tErrorResponseMessage,\n\tRequestMessage,\n\tSuccessResponseMessage,\n\tUnknownErrorResponseMessage,\n\tUnknownMessage,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownSuccessResponseMessage,\n} from \"./types\";\n\nlet requestID = 0;\n\nexport const createRequestMessage = <\n\tTType extends string = string,\n\tTData = undefined,\n>(\n\ttype: TType,\n\tdata: TData,\n\tprefix = \"\",\n): RequestMessage<TType, TData> => {\n\treturn {\n\t\trequestID: `${prefix}${requestID++}`,\n\t\ttype,\n\t\tdata,\n\t};\n};\n\nexport const createSuccessResponseMessage = <TData = undefined>(\n\trequestID: string,\n\tdata: TData,\n\tstatus: keyof typeof statuses.message = 200,\n): SuccessResponseMessage<TData> => {\n\tif (status >= 400) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid success status code, expected status to be within \\`[100;400[\\`, got \\`${status}\\``,\n\t\t);\n\t}\n\n\treturn {\n\t\trequestID,\n\t\tstatus,\n\t\tmsg: statuses.message[status]?.replace(/\\.$/, \"\").toLowerCase() ?? \"\",\n\t\tdata,\n\t};\n};\n\nexport const createErrorResponseMessage = <TError = undefined>(\n\trequestID: string,\n\terror: TError,\n\tstatus: keyof typeof statuses.message = 400,\n): ErrorResponseMessage<TError> => {\n\tif (status < 400) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid error status code, expected status to be within \\`[500;600[\\`, got \\`${status}\\``,\n\t\t);\n\t}\n\n\treturn {\n\t\trequestID,\n\t\tstatus,\n\t\tmsg: statuses.message[status]?.replace(/\\.$/, \"\").toLowerCase() ?? \"\",\n\t\terror,\n\t};\n};\n\nexport const validateMessage = (message: unknown): UnknownMessage => {\n\tif (typeof message !== \"object\" || message === null) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid message received, expected message to be of type \\`object\\`, got \\`${typeof message}\\``,\n\t\t);\n\t} else if (\n\t\t!Object.keys(message).every((key) =>\n\t\t\t[\"requestID\", \"type\", \"data\", \"status\", \"msg\", \"error\"].includes(key),\n\t\t)\n\t) {\n\t\tthrow new TypeError(`Invalid message received: ${JSON.stringify(message)}`);\n\t} else if (\n\t\ttypeof (message as Record<string, unknown>).requestID !== \"string\"\n\t) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid message received, expected \\`message.requestID\\` to be of type \\`string\\`, got \\`${typeof (\n\t\t\t\tmessage as Record<string, unknown>\n\t\t\t).id}\\``,\n\t\t);\n\t}\n\n\treturn message as UnknownMessage;\n};\n\nexport const isRequestMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownRequestMessage => {\n\treturn \"type\" in message;\n};\n\nexport const isResponseMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownResponseMessage => {\n\treturn !(\"type\" in message);\n};\n\nexport const isSuccessResponseMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownSuccessResponseMessage => {\n\treturn isResponseMessage(message) && !(\"error\" in message);\n};\n\nexport const isErrorResponseMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownErrorResponseMessage => {\n\treturn isResponseMessage(message) && !(\"data\" in message);\n};\n"],"names":["requestID"],"mappings":";;;AAaA,IAAI,YAAY;AAET,MAAM,uBAAuB,CAInC,MACA,MACA,SAAS,OACwB;AAC1B,SAAA;AAAA,IACN,WAAW,GAAG,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAEF;AAEO,MAAM,+BAA+B,CAC3CA,YACA,MACA,SAAwC,QACN;;AAClC,MAAI,UAAU,KAAK;AACZ,UAAA,IAAI,UACT,kFAAkF,UAAU;AAAA,EAE7F;AAEM,SAAA;AAAA,IACN,WAAAA;AAAAA,IACA;AAAA,IACA,OAAK,cAAS,QAAQ,MAAM,MAAvB,mBAA0B,QAAQ,OAAO,IAAI,kBAAiB;AAAA,IACnE;AAAA,EAAA;AAEF;AAEO,MAAM,6BAA6B,CACzCA,YACA,OACA,SAAwC,QACP;;AACjC,MAAI,SAAS,KAAK;AACX,UAAA,IAAI,UACT,gFAAgF,UAAU;AAAA,EAE3F;AAEM,SAAA;AAAA,IACN,WAAAA;AAAAA,IACA;AAAA,IACA,OAAK,cAAS,QAAQ,MAAM,MAAvB,mBAA0B,QAAQ,OAAO,IAAI,kBAAiB;AAAA,IACnE;AAAA,EAAA;AAEF;AAEa,MAAA,kBAAkB,CAAC,YAAoC;AACnE,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACpD,UAAM,IAAI,UACT,8EAA8E,OAAO,WAAW;AAAA,EAAA,WAGjG,CAAC,OAAO,KAAK,OAAO,EAAE,MAAM,CAAC,QAC5B,CAAC,aAAa,QAAQ,QAAQ,UAAU,OAAO,OAAO,EAAE,SAAS,GAAG,CAAC,GAErE;AACD,UAAM,IAAI,UAAU,6BAA6B,KAAK,UAAU,OAAO,GAAG;AAAA,EAE1E,WAAA,OAAQ,QAAoC,cAAc,UACzD;AACD,UAAM,IAAI,UACT,4FAA4F,OAC3F,QACC,MAAM;AAAA,EAET;AAEM,SAAA;AACR;AAEa,MAAA,mBAAmB,CAC/B,YACqC;AACrC,SAAO,UAAU;AAClB;AAEa,MAAA,oBAAoB,CAChC,YACsC;AACtC,SAAO,EAAE,UAAU;AACpB;AAEa,MAAA,2BAA2B,CACvC,YAC6C;AAC7C,SAAO,kBAAkB,OAAO,KAAK,EAAE,WAAW;AACnD;AAEa,MAAA,yBAAyB,CACrC,YAC2C;AAC3C,SAAO,kBAAkB,OAAO,KAAK,EAAE,UAAU;AAClD;;;;;;;;;"}
@@ -0,0 +1,10 @@
1
+ import statuses from "statuses";
2
+ import { ErrorResponseMessage, RequestMessage, SuccessResponseMessage, UnknownErrorResponseMessage, UnknownMessage, UnknownRequestMessage, UnknownResponseMessage, UnknownSuccessResponseMessage } from "./types";
3
+ export declare const createRequestMessage: <TType extends string = string, TData = undefined>(type: TType, data: TData, prefix?: string) => RequestMessage<TType, TData>;
4
+ export declare const createSuccessResponseMessage: <TData = undefined>(requestID: string, data: TData, status?: keyof typeof statuses.message) => SuccessResponseMessage<TData>;
5
+ export declare const createErrorResponseMessage: <TError = undefined>(requestID: string, error: TError, status?: keyof typeof statuses.message) => ErrorResponseMessage<TError>;
6
+ export declare const validateMessage: (message: unknown) => UnknownMessage;
7
+ export declare const isRequestMessage: (message: UnknownMessage) => message is UnknownRequestMessage;
8
+ export declare const isResponseMessage: (message: UnknownMessage) => message is UnknownResponseMessage;
9
+ export declare const isSuccessResponseMessage: (message: UnknownMessage) => message is UnknownSuccessResponseMessage;
10
+ export declare const isErrorResponseMessage: (message: UnknownMessage) => message is UnknownErrorResponseMessage;
@@ -0,0 +1,66 @@
1
+ import statuses from "statuses";
2
+ let requestID = 0;
3
+ const createRequestMessage = (type, data, prefix = "") => {
4
+ return {
5
+ requestID: `${prefix}${requestID++}`,
6
+ type,
7
+ data
8
+ };
9
+ };
10
+ const createSuccessResponseMessage = (requestID2, data, status = 200) => {
11
+ var _a;
12
+ if (status >= 400) {
13
+ throw new TypeError(`Invalid success status code, expected status to be within \`[100;400[\`, got \`${status}\``);
14
+ }
15
+ return {
16
+ requestID: requestID2,
17
+ status,
18
+ msg: ((_a = statuses.message[status]) == null ? void 0 : _a.replace(/\.$/, "").toLowerCase()) ?? "",
19
+ data
20
+ };
21
+ };
22
+ const createErrorResponseMessage = (requestID2, error, status = 400) => {
23
+ var _a;
24
+ if (status < 400) {
25
+ throw new TypeError(`Invalid error status code, expected status to be within \`[500;600[\`, got \`${status}\``);
26
+ }
27
+ return {
28
+ requestID: requestID2,
29
+ status,
30
+ msg: ((_a = statuses.message[status]) == null ? void 0 : _a.replace(/\.$/, "").toLowerCase()) ?? "",
31
+ error
32
+ };
33
+ };
34
+ const validateMessage = (message) => {
35
+ if (typeof message !== "object" || message === null) {
36
+ throw new TypeError(`Invalid message received, expected message to be of type \`object\`, got \`${typeof message}\``);
37
+ } else if (!Object.keys(message).every((key) => ["requestID", "type", "data", "status", "msg", "error"].includes(key))) {
38
+ throw new TypeError(`Invalid message received: ${JSON.stringify(message)}`);
39
+ } else if (typeof message.requestID !== "string") {
40
+ throw new TypeError(`Invalid message received, expected \`message.requestID\` to be of type \`string\`, got \`${typeof message.id}\``);
41
+ }
42
+ return message;
43
+ };
44
+ const isRequestMessage = (message) => {
45
+ return "type" in message;
46
+ };
47
+ const isResponseMessage = (message) => {
48
+ return !("type" in message);
49
+ };
50
+ const isSuccessResponseMessage = (message) => {
51
+ return isResponseMessage(message) && !("error" in message);
52
+ };
53
+ const isErrorResponseMessage = (message) => {
54
+ return isResponseMessage(message) && !("data" in message);
55
+ };
56
+ export {
57
+ createErrorResponseMessage,
58
+ createRequestMessage,
59
+ createSuccessResponseMessage,
60
+ isErrorResponseMessage,
61
+ isRequestMessage,
62
+ isResponseMessage,
63
+ isSuccessResponseMessage,
64
+ validateMessage
65
+ };
66
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sources":["../../../src/channel/messages.ts"],"sourcesContent":["import statuses from \"statuses\";\n\nimport {\n\tErrorResponseMessage,\n\tRequestMessage,\n\tSuccessResponseMessage,\n\tUnknownErrorResponseMessage,\n\tUnknownMessage,\n\tUnknownRequestMessage,\n\tUnknownResponseMessage,\n\tUnknownSuccessResponseMessage,\n} from \"./types\";\n\nlet requestID = 0;\n\nexport const createRequestMessage = <\n\tTType extends string = string,\n\tTData = undefined,\n>(\n\ttype: TType,\n\tdata: TData,\n\tprefix = \"\",\n): RequestMessage<TType, TData> => {\n\treturn {\n\t\trequestID: `${prefix}${requestID++}`,\n\t\ttype,\n\t\tdata,\n\t};\n};\n\nexport const createSuccessResponseMessage = <TData = undefined>(\n\trequestID: string,\n\tdata: TData,\n\tstatus: keyof typeof statuses.message = 200,\n): SuccessResponseMessage<TData> => {\n\tif (status >= 400) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid success status code, expected status to be within \\`[100;400[\\`, got \\`${status}\\``,\n\t\t);\n\t}\n\n\treturn {\n\t\trequestID,\n\t\tstatus,\n\t\tmsg: statuses.message[status]?.replace(/\\.$/, \"\").toLowerCase() ?? \"\",\n\t\tdata,\n\t};\n};\n\nexport const createErrorResponseMessage = <TError = undefined>(\n\trequestID: string,\n\terror: TError,\n\tstatus: keyof typeof statuses.message = 400,\n): ErrorResponseMessage<TError> => {\n\tif (status < 400) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid error status code, expected status to be within \\`[500;600[\\`, got \\`${status}\\``,\n\t\t);\n\t}\n\n\treturn {\n\t\trequestID,\n\t\tstatus,\n\t\tmsg: statuses.message[status]?.replace(/\\.$/, \"\").toLowerCase() ?? \"\",\n\t\terror,\n\t};\n};\n\nexport const validateMessage = (message: unknown): UnknownMessage => {\n\tif (typeof message !== \"object\" || message === null) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid message received, expected message to be of type \\`object\\`, got \\`${typeof message}\\``,\n\t\t);\n\t} else if (\n\t\t!Object.keys(message).every((key) =>\n\t\t\t[\"requestID\", \"type\", \"data\", \"status\", \"msg\", \"error\"].includes(key),\n\t\t)\n\t) {\n\t\tthrow new TypeError(`Invalid message received: ${JSON.stringify(message)}`);\n\t} else if (\n\t\ttypeof (message as Record<string, unknown>).requestID !== \"string\"\n\t) {\n\t\tthrow new TypeError(\n\t\t\t`Invalid message received, expected \\`message.requestID\\` to be of type \\`string\\`, got \\`${typeof (\n\t\t\t\tmessage as Record<string, unknown>\n\t\t\t).id}\\``,\n\t\t);\n\t}\n\n\treturn message as UnknownMessage;\n};\n\nexport const isRequestMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownRequestMessage => {\n\treturn \"type\" in message;\n};\n\nexport const isResponseMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownResponseMessage => {\n\treturn !(\"type\" in message);\n};\n\nexport const isSuccessResponseMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownSuccessResponseMessage => {\n\treturn isResponseMessage(message) && !(\"error\" in message);\n};\n\nexport const isErrorResponseMessage = (\n\tmessage: UnknownMessage,\n): message is UnknownErrorResponseMessage => {\n\treturn isResponseMessage(message) && !(\"data\" in message);\n};\n"],"names":["requestID"],"mappings":";AAaA,IAAI,YAAY;AAET,MAAM,uBAAuB,CAInC,MACA,MACA,SAAS,OACwB;AAC1B,SAAA;AAAA,IACN,WAAW,GAAG,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAEF;AAEO,MAAM,+BAA+B,CAC3CA,YACA,MACA,SAAwC,QACN;;AAClC,MAAI,UAAU,KAAK;AACZ,UAAA,IAAI,UACT,kFAAkF,UAAU;AAAA,EAE7F;AAEM,SAAA;AAAA,IACN,WAAAA;AAAAA,IACA;AAAA,IACA,OAAK,cAAS,QAAQ,MAAM,MAAvB,mBAA0B,QAAQ,OAAO,IAAI,kBAAiB;AAAA,IACnE;AAAA,EAAA;AAEF;AAEO,MAAM,6BAA6B,CACzCA,YACA,OACA,SAAwC,QACP;;AACjC,MAAI,SAAS,KAAK;AACX,UAAA,IAAI,UACT,gFAAgF,UAAU;AAAA,EAE3F;AAEM,SAAA;AAAA,IACN,WAAAA;AAAAA,IACA;AAAA,IACA,OAAK,cAAS,QAAQ,MAAM,MAAvB,mBAA0B,QAAQ,OAAO,IAAI,kBAAiB;AAAA,IACnE;AAAA,EAAA;AAEF;AAEa,MAAA,kBAAkB,CAAC,YAAoC;AACnE,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACpD,UAAM,IAAI,UACT,8EAA8E,OAAO,WAAW;AAAA,EAAA,WAGjG,CAAC,OAAO,KAAK,OAAO,EAAE,MAAM,CAAC,QAC5B,CAAC,aAAa,QAAQ,QAAQ,UAAU,OAAO,OAAO,EAAE,SAAS,GAAG,CAAC,GAErE;AACD,UAAM,IAAI,UAAU,6BAA6B,KAAK,UAAU,OAAO,GAAG;AAAA,EAE1E,WAAA,OAAQ,QAAoC,cAAc,UACzD;AACD,UAAM,IAAI,UACT,4FAA4F,OAC3F,QACC,MAAM;AAAA,EAET;AAEM,SAAA;AACR;AAEa,MAAA,mBAAmB,CAC/B,YACqC;AACrC,SAAO,UAAU;AAClB;AAEa,MAAA,oBAAoB,CAChC,YACsC;AACtC,SAAO,EAAE,UAAU;AACpB;AAEa,MAAA,2BAA2B,CACvC,YAC6C;AAC7C,SAAO,kBAAkB,OAAO,KAAK,EAAE,WAAW;AACnD;AAEa,MAAA,yBAAyB,CACrC,YAC2C;AAC3C,SAAO,kBAAkB,OAAO,KAAK,EAAE,UAAU;AAClD;"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ exports.InternalEmitterRequestType = void 0;
4
+ (function(InternalEmitterRequestType2) {
5
+ InternalEmitterRequestType2["Connect"] = "connect";
6
+ })(exports.InternalEmitterRequestType || (exports.InternalEmitterRequestType = {}));
7
+ exports.InternalReceiverRequestType = void 0;
8
+ (function(InternalReceiverRequestType2) {
9
+ InternalReceiverRequestType2["Ready"] = "ready";
10
+ })(exports.InternalReceiverRequestType || (exports.InternalReceiverRequestType = {}));
11
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","sources":["../../../src/channel/types.ts"],"sourcesContent":["// Messages\nexport type MessageBase = {\n\trequestID: string;\n};\n\nexport type RequestMessage<TType extends string = string, TData = void> = {\n\ttype: TType;\n\tdata: TData;\n} & MessageBase;\n\nexport type ResponseMessageBase = {\n\tstatus: number;\n\tmsg: string;\n} & MessageBase;\n\nexport type SuccessResponseMessage<TData = void> = {\n\tdata: TData;\n\terror?: never;\n} & ResponseMessageBase;\n\nexport type ErrorResponseMessage<TError = unknown> = {\n\tdata?: never;\n\terror: unknown | TError;\n} & ResponseMessageBase;\n\nexport type ResponseMessage<TData = void, TError = unknown> =\n\t| SuccessResponseMessage<TData>\n\t| ErrorResponseMessage<TError>;\n\nexport type ExtractSuccessResponseMessage<\n\tTResponse extends UnknownResponseMessage,\n> = Extract<TResponse, { error?: never }>;\n\nexport type ExtractErrorResponseMessage<\n\tTResponse extends UnknownResponseMessage,\n> = Extract<TResponse, { data?: never }>;\n\n// Unknown messages\nexport type UnknownRequestMessage = RequestMessage<string, unknown>;\n\nexport type UnknownSuccessResponseMessage = SuccessResponseMessage<unknown>;\n\nexport type UnknownErrorResponseMessage = ErrorResponseMessage<unknown>;\n\nexport type UnknownResponseMessage =\n\t| UnknownSuccessResponseMessage\n\t| UnknownErrorResponseMessage;\n\nexport type UnknownMessage = UnknownRequestMessage | UnknownResponseMessage;\n\n// Transactions\nexport type Transaction<\n\tTRequest extends UnknownRequestMessage,\n\tTResponse extends UnknownResponseMessage = ResponseMessage<void>,\n> = {\n\trequest: TRequest;\n\tresponse: TResponse;\n};\n\nexport type TransactionMethod<\n\tTTransaction extends Transaction<\n\t\tUnknownRequestMessage,\n\t\tUnknownResponseMessage\n\t>,\n> = (\n\tdata: TTransaction[\"request\"][\"data\"],\n) => Promise<ExtractSuccessResponseMessage<TTransaction[\"response\"]>>;\n\nexport type TransactionHandler<\n\tTTransaction extends Transaction<\n\t\tUnknownRequestMessage,\n\t\tUnknownResponseMessage\n\t>,\n> = (\n\trequest: TTransaction[\"request\"],\n\tresponse: {\n\t\tsuccess: (\n\t\t\tdata: ExtractSuccessResponseMessage<TTransaction[\"response\"]>[\"data\"],\n\t\t\tstatus?: number,\n\t\t) => ExtractSuccessResponseMessage<TTransaction[\"response\"]>;\n\t\terror: (\n\t\t\terror: ExtractErrorResponseMessage<TTransaction[\"response\"]>[\"error\"],\n\t\t\tstatus?: number,\n\t\t) => ExtractErrorResponseMessage<TTransaction[\"response\"]>;\n\t},\n) => Promise<TTransaction[\"response\"]> | TTransaction[\"response\"];\n\nexport type TransactionsMethods<\n\tTTransactions extends Record<string, UnknownTransaction>,\n> = {\n\t[Key in keyof TTransactions]: TransactionMethod<TTransactions[Key]>;\n};\n\nexport type TransactionsHandlers<\n\tTTransactions extends Record<string, UnknownTransaction>,\n> = {\n\t[Key in keyof TTransactions]: TransactionHandler<TTransactions[Key]>;\n};\n\n// Unknown transactions\nexport type UnknownTransaction = Transaction<\n\tUnknownRequestMessage,\n\tUnknownResponseMessage\n>;\n\nexport type UnknownTransactionMethod = TransactionMethod<UnknownTransaction>;\n\nexport type UnknownTransactionHandler = TransactionHandler<UnknownTransaction>;\n\n// Emitter\nexport enum InternalEmitterRequestType {\n\tConnect = \"connect\",\n}\n\nexport type InternalEmitterTransactions<\n\tTReceiverOptions extends Record<string, unknown> = Record<string, unknown>,\n> = {\n\t[InternalEmitterRequestType.Connect]: Transaction<\n\t\tRequestMessage<\n\t\t\tInternalEmitterRequestType.Connect,\n\t\t\t| Partial<\n\t\t\t\t\tOmit<TReceiverOptions, \"debug\" | \"requestIDPrefix\" | \"readyTimeout\">\n\t\t\t >\n\t\t\t| undefined\n\t\t>\n\t>;\n};\n\n// Receiver\nexport enum InternalReceiverRequestType {\n\tReady = \"ready\",\n}\n\nexport type InternalReceiverTransactions = {\n\t[InternalReceiverRequestType.Ready]: Transaction<\n\t\tRequestMessage<InternalReceiverRequestType.Ready>\n\t>;\n};\n"],"names":["InternalEmitterRequestType","InternalReceiverRequestType"],"mappings":";;AA8GYA,QAAA,6BAAA;AAAA,CAAZ,SAAYA,6BAA0B;AACrCA,8BAAA,SAAA,IAAA;AACD,GAFYA,uCAAAA,QAAAA,6BAEX,CAAA,EAAA;AAiBWC,QAAA,8BAAA;AAAA,CAAZ,SAAYA,8BAA2B;AACtCA,+BAAA,OAAA,IAAA;AACD,GAFYA,QAAA,gCAAAA,sCAEX,CAAA,EAAA;"}