adnbn 0.6.0 → 0.7.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 (230) hide show
  1. package/dist/cli/builders/csp/AbstractCsp.d.ts +9 -0
  2. package/dist/cli/builders/csp/AbstractCsp.js +26 -0
  3. package/dist/cli/builders/csp/AbstractCsp.js.map +1 -0
  4. package/dist/cli/builders/csp/Csp.d.ts +8 -0
  5. package/dist/cli/builders/csp/Csp.js +39 -0
  6. package/dist/cli/builders/csp/Csp.js.map +1 -0
  7. package/dist/cli/builders/csp/SandboxCsp.d.ts +11 -0
  8. package/dist/cli/builders/csp/SandboxCsp.js +62 -0
  9. package/dist/cli/builders/csp/SandboxCsp.js.map +1 -0
  10. package/dist/cli/builders/csp/index.d.ts +3 -0
  11. package/dist/cli/builders/csp/index.js +7 -0
  12. package/dist/cli/builders/csp/index.js.map +1 -0
  13. package/dist/cli/builders/csp/types.d.ts +4 -0
  14. package/dist/cli/builders/csp/types.js +1 -0
  15. package/dist/cli/builders/csp/types.js.map +1 -0
  16. package/dist/cli/builders/manifest/ManifestBase.d.ts +16 -1
  17. package/dist/cli/builders/manifest/ManifestBase.js +49 -0
  18. package/dist/cli/builders/manifest/ManifestBase.js.map +1 -1
  19. package/dist/cli/builders/manifest/ManifestV2.d.ts +2 -0
  20. package/dist/cli/builders/manifest/ManifestV2.js +31 -1
  21. package/dist/cli/builders/manifest/ManifestV2.js.map +1 -1
  22. package/dist/cli/builders/manifest/ManifestV3.d.ts +2 -0
  23. package/dist/cli/builders/manifest/ManifestV3.js +67 -0
  24. package/dist/cli/builders/manifest/ManifestV3.js.map +1 -1
  25. package/dist/cli/entrypoint/file/injectors/core.js +26 -0
  26. package/dist/cli/entrypoint/file/injectors/core.js.map +1 -1
  27. package/dist/cli/entrypoint/file/parsers/TypeResolver.d.ts +4 -0
  28. package/dist/cli/entrypoint/file/parsers/TypeResolver.js +7 -1
  29. package/dist/cli/entrypoint/file/parsers/TypeResolver.js.map +1 -1
  30. package/dist/cli/entrypoint/file/resolvers/ImportResolver.js +1 -1
  31. package/dist/cli/entrypoint/file/resolvers/ImportResolver.js.map +1 -1
  32. package/dist/cli/entrypoint/finder/OffscreenViewFinder.d.ts +2 -2
  33. package/dist/cli/entrypoint/finder/OffscreenViewFinder.js +2 -2
  34. package/dist/cli/entrypoint/finder/OffscreenViewFinder.js.map +1 -1
  35. package/dist/cli/entrypoint/finder/PageFinder.d.ts +2 -2
  36. package/dist/cli/entrypoint/finder/PageFinder.js +3 -3
  37. package/dist/cli/entrypoint/finder/PageFinder.js.map +1 -1
  38. package/dist/cli/entrypoint/finder/PopupFinder.d.ts +2 -2
  39. package/dist/cli/entrypoint/finder/PopupFinder.js +2 -2
  40. package/dist/cli/entrypoint/finder/PopupFinder.js.map +1 -1
  41. package/dist/cli/entrypoint/finder/SandboxFinder.d.ts +11 -0
  42. package/dist/cli/entrypoint/finder/SandboxFinder.js +25 -0
  43. package/dist/cli/entrypoint/finder/SandboxFinder.js.map +1 -0
  44. package/dist/cli/entrypoint/finder/SandboxViewFinder.d.ts +15 -0
  45. package/dist/cli/entrypoint/finder/SandboxViewFinder.js +33 -0
  46. package/dist/cli/entrypoint/finder/SandboxViewFinder.js.map +1 -0
  47. package/dist/cli/entrypoint/finder/SidebarFinder.d.ts +2 -2
  48. package/dist/cli/entrypoint/finder/SidebarFinder.js +2 -2
  49. package/dist/cli/entrypoint/finder/SidebarFinder.js.map +1 -1
  50. package/dist/cli/entrypoint/finder/ViewCspFinder.d.ts +11 -0
  51. package/dist/cli/entrypoint/finder/ViewCspFinder.js +24 -0
  52. package/dist/cli/entrypoint/finder/ViewCspFinder.js.map +1 -0
  53. package/dist/cli/entrypoint/finder/index.d.ts +3 -0
  54. package/dist/cli/entrypoint/finder/index.js +34 -28
  55. package/dist/cli/entrypoint/finder/index.js.map +1 -1
  56. package/dist/cli/entrypoint/parser/OffscreenParser.d.ts +2 -2
  57. package/dist/cli/entrypoint/parser/OffscreenParser.js +2 -2
  58. package/dist/cli/entrypoint/parser/OffscreenParser.js.map +1 -1
  59. package/dist/cli/entrypoint/parser/PageParser.d.ts +2 -2
  60. package/dist/cli/entrypoint/parser/PageParser.js +2 -2
  61. package/dist/cli/entrypoint/parser/PageParser.js.map +1 -1
  62. package/dist/cli/entrypoint/parser/PopupParser.d.ts +2 -2
  63. package/dist/cli/entrypoint/parser/PopupParser.js +2 -2
  64. package/dist/cli/entrypoint/parser/PopupParser.js.map +1 -1
  65. package/dist/cli/entrypoint/parser/SandboxParser.d.ts +7 -0
  66. package/dist/cli/entrypoint/parser/SandboxParser.js +42 -0
  67. package/dist/cli/entrypoint/parser/SandboxParser.js.map +1 -0
  68. package/dist/cli/entrypoint/parser/SidebarParser.d.ts +2 -2
  69. package/dist/cli/entrypoint/parser/SidebarParser.js +2 -2
  70. package/dist/cli/entrypoint/parser/SidebarParser.js.map +1 -1
  71. package/dist/cli/entrypoint/parser/ViewCspParser.d.ts +9 -0
  72. package/dist/cli/entrypoint/parser/ViewCspParser.js +26 -0
  73. package/dist/cli/entrypoint/parser/ViewCspParser.js.map +1 -0
  74. package/dist/cli/entrypoint/parser/ViewParser.d.ts +80 -80
  75. package/dist/cli/entrypoint/parser/index.d.ts +1 -0
  76. package/dist/cli/entrypoint/parser/index.js +8 -6
  77. package/dist/cli/entrypoint/parser/index.js.map +1 -1
  78. package/dist/cli/plugins/index.d.ts +2 -1
  79. package/dist/cli/plugins/index.js +14 -12
  80. package/dist/cli/plugins/index.js.map +1 -1
  81. package/dist/cli/plugins/offscreen/index.js +1 -0
  82. package/dist/cli/plugins/offscreen/index.js.map +1 -1
  83. package/dist/cli/plugins/page/index.js +1 -1
  84. package/dist/cli/plugins/page/index.js.map +1 -1
  85. package/dist/cli/plugins/popup/index.js +1 -1
  86. package/dist/cli/plugins/popup/index.js.map +1 -1
  87. package/dist/cli/plugins/sandbox/Sandbox.d.ts +15 -0
  88. package/dist/cli/plugins/sandbox/Sandbox.js +52 -0
  89. package/dist/cli/plugins/sandbox/Sandbox.js.map +1 -0
  90. package/dist/cli/plugins/sandbox/SandboxDeclaration.d.ts +5 -0
  91. package/dist/cli/plugins/sandbox/SandboxDeclaration.js +10 -0
  92. package/dist/cli/plugins/sandbox/SandboxDeclaration.js.map +1 -0
  93. package/dist/cli/plugins/sandbox/index.d.ts +2 -0
  94. package/dist/cli/plugins/sandbox/index.js +63 -0
  95. package/dist/cli/plugins/sandbox/index.js.map +1 -0
  96. package/dist/cli/plugins/sidebar/index.js +1 -0
  97. package/dist/cli/plugins/sidebar/index.js.map +1 -1
  98. package/dist/cli/plugins/style/index.d.ts +2 -0
  99. package/dist/cli/plugins/{style.js → style/index.js} +18 -21
  100. package/dist/cli/plugins/style/index.js.map +1 -0
  101. package/dist/cli/plugins/style/utils.d.ts +1 -0
  102. package/dist/cli/plugins/style/utils.js +86 -0
  103. package/dist/cli/plugins/style/utils.js.map +1 -0
  104. package/dist/cli/plugins/typescript/declaration/transport/TransportDeclaration.d.ts +2 -1
  105. package/dist/cli/plugins/typescript/declaration/transport/TransportDeclaration.js +2 -3
  106. package/dist/cli/plugins/typescript/declaration/transport/TransportDeclaration.js.map +1 -1
  107. package/dist/cli/plugins/typescript/declaration/transport/transport.d.ts +5 -11
  108. package/dist/cli/resolvers/config.js +4 -0
  109. package/dist/cli/resolvers/config.js.map +1 -1
  110. package/dist/cli/virtual/index.d.ts +1 -0
  111. package/dist/cli/virtual/index.js +8 -1
  112. package/dist/cli/virtual/sandbox.d.ts +1 -0
  113. package/dist/cli/virtual/virtual.d.ts +27 -0
  114. package/dist/entry/sandbox/Builder.d.ts +15 -0
  115. package/dist/entry/sandbox/Builder.js +51 -0
  116. package/dist/entry/sandbox/Builder.js.map +1 -0
  117. package/dist/entry/sandbox/TransportBuilder.d.ts +8 -0
  118. package/dist/entry/sandbox/TransportBuilder.js +15 -0
  119. package/dist/entry/sandbox/TransportBuilder.js.map +1 -0
  120. package/dist/entry/sandbox/index.d.ts +2 -0
  121. package/dist/entry/sandbox/index.js +7 -0
  122. package/dist/entry/sandbox/index.js.map +1 -0
  123. package/dist/frame/ReadyFrame.d.ts +25 -0
  124. package/dist/frame/ReadyFrame.js +86 -0
  125. package/dist/frame/ReadyFrame.js.map +1 -0
  126. package/dist/frame/index.d.ts +2 -0
  127. package/dist/frame/index.js +5 -0
  128. package/dist/frame/index.js.map +1 -0
  129. package/dist/main/csp.d.ts +2 -0
  130. package/dist/main/csp.js +5 -0
  131. package/dist/main/csp.js.map +1 -0
  132. package/dist/main/index.d.ts +2 -0
  133. package/dist/main/index.js +2 -0
  134. package/dist/main/index.js.map +1 -1
  135. package/dist/main/offscreen.d.ts +3 -3
  136. package/dist/main/offscreen.js.map +1 -1
  137. package/dist/main/relay.d.ts +3 -3
  138. package/dist/main/relay.js.map +1 -1
  139. package/dist/main/sandbox.d.ts +9 -0
  140. package/dist/main/sandbox.js +29 -0
  141. package/dist/main/sandbox.js.map +1 -0
  142. package/dist/main/service.d.ts +3 -3
  143. package/dist/main/service.js.map +1 -1
  144. package/dist/message/MessageManager.d.ts +2 -0
  145. package/dist/message/MessageManager.js +21 -5
  146. package/dist/message/MessageManager.js.map +1 -1
  147. package/dist/message/error.d.ts +12 -0
  148. package/dist/message/error.js +55 -0
  149. package/dist/message/error.js.map +1 -0
  150. package/dist/message/providers/Message.d.ts +5 -0
  151. package/dist/message/providers/Message.js +44 -12
  152. package/dist/message/providers/Message.js.map +1 -1
  153. package/dist/offscreen/OffscreenBridge.d.ts +1 -3
  154. package/dist/offscreen/OffscreenBridge.js +12 -56
  155. package/dist/offscreen/OffscreenBridge.js.map +1 -1
  156. package/dist/offscreen/index.d.ts +8 -3
  157. package/dist/offscreen/index.js.map +1 -1
  158. package/dist/relay/index.d.ts +8 -3
  159. package/dist/relay/index.js.map +1 -1
  160. package/dist/sandbox/SandboxFrame.d.ts +6 -0
  161. package/dist/sandbox/SandboxFrame.js +31 -0
  162. package/dist/sandbox/SandboxFrame.js.map +1 -0
  163. package/dist/sandbox/SandboxManager.d.ts +5 -0
  164. package/dist/sandbox/SandboxManager.js +12 -0
  165. package/dist/sandbox/SandboxManager.js.map +1 -0
  166. package/dist/sandbox/SandboxMessage.d.ts +30 -0
  167. package/dist/sandbox/SandboxMessage.js +127 -0
  168. package/dist/sandbox/SandboxMessage.js.map +1 -0
  169. package/dist/sandbox/index.d.ts +7 -0
  170. package/dist/sandbox/index.js +6 -0
  171. package/dist/sandbox/index.js.map +1 -0
  172. package/dist/sandbox/ports/SandboxHost.d.ts +21 -0
  173. package/dist/sandbox/ports/SandboxHost.js +58 -0
  174. package/dist/sandbox/ports/SandboxHost.js.map +1 -0
  175. package/dist/sandbox/ports/SandboxInner.d.ts +17 -0
  176. package/dist/sandbox/ports/SandboxInner.js +45 -0
  177. package/dist/sandbox/ports/SandboxInner.js.map +1 -0
  178. package/dist/sandbox/ports/SandboxMemory.d.ts +4 -0
  179. package/dist/sandbox/ports/SandboxMemory.js +42 -0
  180. package/dist/sandbox/ports/SandboxMemory.js.map +1 -0
  181. package/dist/sandbox/ports/index.d.ts +3 -0
  182. package/dist/sandbox/ports/index.js +9 -0
  183. package/dist/sandbox/ports/index.js.map +1 -0
  184. package/dist/sandbox/providers/ProxySandbox.d.ts +10 -0
  185. package/dist/sandbox/providers/ProxySandbox.js +20 -0
  186. package/dist/sandbox/providers/ProxySandbox.js.map +1 -0
  187. package/dist/sandbox/providers/RegisterSandbox.d.ts +9 -0
  188. package/dist/sandbox/providers/RegisterSandbox.js +28 -0
  189. package/dist/sandbox/providers/RegisterSandbox.js.map +1 -0
  190. package/dist/sandbox/providers/index.d.ts +2 -0
  191. package/dist/sandbox/providers/index.js +7 -0
  192. package/dist/sandbox/providers/index.js.map +1 -0
  193. package/dist/sandbox/utils.d.ts +4 -0
  194. package/dist/sandbox/utils.js +10 -0
  195. package/dist/sandbox/utils.js.map +1 -0
  196. package/dist/service/index.d.ts +8 -3
  197. package/dist/service/index.js.map +1 -1
  198. package/dist/transport/RegisterTransport.d.ts +4 -2
  199. package/dist/transport/RegisterTransport.js +8 -1
  200. package/dist/transport/RegisterTransport.js.map +1 -1
  201. package/dist/transport/TransportMessage.d.ts +1 -1
  202. package/dist/transport/TransportMessage.js +1 -1
  203. package/dist/transport/TransportMessage.js.map +1 -1
  204. package/dist/transport/index.d.ts +4 -1
  205. package/dist/types/config.d.ts +7 -0
  206. package/dist/types/csp.d.ts +34 -0
  207. package/dist/types/csp.js +12 -0
  208. package/dist/types/csp.js.map +1 -0
  209. package/dist/types/entrypoint.d.ts +2 -1
  210. package/dist/types/entrypoint.js +1 -0
  211. package/dist/types/entrypoint.js.map +1 -1
  212. package/dist/types/manifest.d.ts +10 -0
  213. package/dist/types/manifest.js.map +1 -1
  214. package/dist/types/message.d.ts +15 -0
  215. package/dist/types/message.js +2 -0
  216. package/dist/types/message.js.map +1 -1
  217. package/dist/types/offscreen.d.ts +2 -1
  218. package/dist/types/offscreen.js.map +1 -1
  219. package/dist/types/page.d.ts +2 -1
  220. package/dist/types/plugin.d.ts +2 -1
  221. package/dist/types/popup.d.ts +2 -1
  222. package/dist/types/sandbox.d.ts +97 -0
  223. package/dist/types/sandbox.js +34 -0
  224. package/dist/types/sandbox.js.map +1 -0
  225. package/dist/types/sidebar.d.ts +2 -1
  226. package/dist/types/sidebar.js.map +1 -1
  227. package/dist/types/transport.d.ts +6 -2
  228. package/package.json +7 -1
  229. package/dist/cli/plugins/style.d.ts +0 -2
  230. package/dist/cli/plugins/style.js.map +0 -1
@@ -0,0 +1,55 @@
1
+ const build = (name, message, stack) => {
2
+ return stack ? { name, message, stack } : { name, message };
3
+ };
4
+ const stringify = (error) => {
5
+ try {
6
+ return JSON.stringify(error);
7
+ } catch {
8
+ return String(error);
9
+ }
10
+ };
11
+ const constructorFor = (name) => {
12
+ switch (name) {
13
+ case "EvalError":
14
+ return EvalError;
15
+ case "RangeError":
16
+ return RangeError;
17
+ case "ReferenceError":
18
+ return ReferenceError;
19
+ case "SyntaxError":
20
+ return SyntaxError;
21
+ case "TypeError":
22
+ return TypeError;
23
+ case "URIError":
24
+ return URIError;
25
+ default:
26
+ return Error;
27
+ }
28
+ };
29
+ const serializeError = (error) => {
30
+ if (error instanceof Error) {
31
+ return build(error.name, error.message, error.stack);
32
+ }
33
+ if (typeof error === "object" && error !== null) {
34
+ const record = error;
35
+ const name = typeof record.name === "string" ? record.name : "Error";
36
+ const message = typeof record.message === "string" ? record.message : stringify(error);
37
+ const stack = typeof record.stack === "string" ? record.stack : void 0;
38
+ return build(name, message, stack);
39
+ }
40
+ return build("Error", String(error));
41
+ };
42
+ const restoreError = (error) => {
43
+ const ErrorConstructor = constructorFor((error == null ? void 0 : error.name) ?? "Error");
44
+ const restored = new ErrorConstructor((error == null ? void 0 : error.message) ?? "Request failed.");
45
+ restored.name = (error == null ? void 0 : error.name) || "Error";
46
+ if (error == null ? void 0 : error.stack) {
47
+ restored.stack = error.stack;
48
+ }
49
+ return restored;
50
+ };
51
+ export {
52
+ restoreError,
53
+ serializeError
54
+ };
55
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/message/error.ts"],"sourcesContent":["import {MessageError} from \"@typing/message\";\n\nconst build = (name: string, message: string, stack?: string): MessageError => {\n return stack ? {name, message, stack} : {name, message};\n};\n\nconst stringify = (error: object): string => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst constructorFor = (name: string): new (message?: string) => Error => {\n switch (name) {\n case \"EvalError\":\n return EvalError;\n case \"RangeError\":\n return RangeError;\n case \"ReferenceError\":\n return ReferenceError;\n case \"SyntaxError\":\n return SyntaxError;\n case \"TypeError\":\n return TypeError;\n case \"URIError\":\n return URIError;\n default:\n return Error;\n }\n};\n\n/**\n * Convert any thrown value into a transferable {@link MessageError} envelope. Handles real\n * `Error` instances, error-like objects, and primitives (JSON-stringifying objects when no\n * `message` is present). The standard serialize step for every cross-context transport.\n */\nexport const serializeError = (error: unknown): MessageError => {\n if (error instanceof Error) {\n return build(error.name, error.message, error.stack);\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : \"Error\";\n const message = typeof record.message === \"string\" ? record.message : stringify(error);\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n\n return build(name, message, stack);\n }\n\n return build(\"Error\", String(error));\n};\n\n/**\n * Reconstruct an `Error` from a {@link MessageError} envelope, mapping the serialized `name`\n * back to its native constructor (so `instanceof TypeError` survives the boundary).\n */\nexport const restoreError = (error?: MessageError): Error => {\n const ErrorConstructor = constructorFor(error?.name ?? \"Error\");\n const restored = new ErrorConstructor(error?.message ?? \"Request failed.\");\n\n restored.name = error?.name || \"Error\";\n\n if (error?.stack) {\n restored.stack = error.stack;\n }\n\n return restored;\n};\n"],"mappings":"AAEA,MAAM,QAAQ,CAAC,MAAc,SAAiB,UAAiC;AAC3E,SAAO,QAAQ,EAAC,MAAM,SAAS,MAAK,IAAI,EAAC,MAAM,QAAO;AAC1D;AAEA,MAAM,YAAY,CAAC,UAA0B;AACzC,MAAI;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO,OAAO,KAAK;AAAA,EACvB;AACJ;AAEA,MAAM,iBAAiB,CAAC,SAAkD;AACtE,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;AAOO,MAAM,iBAAiB,CAAC,UAAiC;AAC5D,MAAI,iBAAiB,OAAO;AACxB,WAAO,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,KAAK;AAAA,EACvD;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,UAAM,SAAS;AACf,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,UAAU,KAAK;AACrF,UAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAEhE,WAAO,MAAM,MAAM,SAAS,KAAK;AAAA,EACrC;AAEA,SAAO,MAAM,SAAS,OAAO,KAAK,CAAC;AACvC;AAMO,MAAM,eAAe,CAAC,UAAgC;AACzD,QAAM,mBAAmB,gBAAe,+BAAO,SAAQ,OAAO;AAC9D,QAAM,WAAW,IAAI,kBAAiB,+BAAO,YAAW,iBAAiB;AAEzE,WAAS,QAAO,+BAAO,SAAQ;AAE/B,MAAI,+BAAO,OAAO;AACd,aAAS,QAAQ,MAAM;AAAA,EAC3B;AAEA,SAAO;AACX;","names":[]}
@@ -6,5 +6,10 @@ export default class Message<T extends MessageDictionary> extends AbstractMessag
6
6
  static getInstance<T extends MessageDictionary>(): Message<MessageDictionary>;
7
7
  protected get manager(): MessageManager<T>;
8
8
  send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: MessageSendOptions): Promise<MessageResponse<T, K>>;
9
+ private dispatch;
10
+ private unwrap;
11
+ private isMessageResult;
12
+ private isSerializedError;
13
+ private isRecord;
9
14
  watch<K extends MessageType<T>>(arg1: K | MessageMapHandler<T> | MessageGeneralHandler<T, K>, arg2?: MessageTargetHandler<T, K>): () => void;
10
15
  }
@@ -1,5 +1,9 @@
1
1
  import { sendMessage, sendTabMessage } from "@addon-core/browser";
2
+ import { restoreError } from "../error.js";
2
3
  import { isBrowser } from "./../../main/env.js";
4
+ import {
5
+ MessageResultEnvelopeProperty
6
+ } from "./../../types/message.js";
3
7
  import { Browser } from "./../../types/browser.js";
4
8
  import AbstractMessage from "./AbstractMessage.js";
5
9
  import MessageManager from "../MessageManager.js";
@@ -12,19 +16,47 @@ class Message extends AbstractMessage {
12
16
  get manager() {
13
17
  return MessageManager.getInstance();
14
18
  }
15
- send(type, data, options) {
19
+ async send(type, data, options) {
16
20
  const message = this.buildMessage(type, data);
17
- if (options) {
18
- if (typeof options === "number") {
19
- return sendTabMessage(options, message);
20
- }
21
- const { tabId, ...other } = options;
22
- if (isBrowser(Browser.Firefox)) {
23
- delete other.documentId;
24
- }
25
- return sendTabMessage(tabId, message, other);
26
- }
27
- return sendMessage(message);
21
+ const response = await this.dispatch(message, options);
22
+ return this.unwrap(response);
23
+ }
24
+ dispatch(message, options) {
25
+ if (options === void 0) {
26
+ return sendMessage(message);
27
+ }
28
+ if (typeof options === "number") {
29
+ return sendTabMessage(options, message);
30
+ }
31
+ const { tabId, ...other } = options;
32
+ if (isBrowser(Browser.Firefox)) {
33
+ delete other.documentId;
34
+ }
35
+ return sendTabMessage(tabId, message, other);
36
+ }
37
+ unwrap(response) {
38
+ if (!this.isMessageResult(response)) {
39
+ return response;
40
+ }
41
+ if (response.ok) {
42
+ return response.payload;
43
+ }
44
+ throw restoreError(response.error);
45
+ }
46
+ isMessageResult(response) {
47
+ if (!this.isRecord(response) || response[MessageResultEnvelopeProperty] !== true || typeof response.ok !== "boolean") {
48
+ return false;
49
+ }
50
+ if (response.ok) {
51
+ return "payload" in response;
52
+ }
53
+ return this.isSerializedError(response.error);
54
+ }
55
+ isSerializedError(error) {
56
+ return this.isRecord(error) && typeof error.name === "string" && typeof error.message === "string" && (error.stack === void 0 || typeof error.stack === "string");
57
+ }
58
+ isRecord(value) {
59
+ return typeof value === "object" && value !== null;
28
60
  }
29
61
  watch(arg1, arg2) {
30
62
  let handler;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/message/providers/Message.ts"],"sourcesContent":["import {sendMessage, sendTabMessage} from \"@addon-core/browser\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResponse,\n MessageSendOptions,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\nimport {Browser} from \"@typing/browser\";\n\nimport AbstractMessage from \"./AbstractMessage\";\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {\n private static instance: Message<MessageDictionary> | null = null;\n\n public static getInstance<T extends MessageDictionary>() {\n return (this.instance ??= new Message<T>());\n }\n\n protected get manager(): MessageManager<T> {\n return MessageManager.getInstance<T>();\n }\n\n public send<K extends MessageType<T>>(\n type: K,\n data: MessageData<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n\n if (options) {\n if (typeof options === \"number\") {\n return sendTabMessage(options, message);\n }\n\n const {tabId, ...other} = options;\n\n if (isBrowser(Browser.Firefox)) {\n delete other.documentId;\n }\n\n return sendTabMessage(tabId, message, other);\n }\n\n return sendMessage(message);\n }\n\n public watch<K extends MessageType<T>>(\n arg1: K | MessageMapHandler<T> | MessageGeneralHandler<T, K>,\n arg2?: MessageTargetHandler<T, K>\n ): () => void {\n let handler: MessageHandler<T>;\n\n if (typeof arg1 === \"function\") {\n handler = new GeneralHandler<T, K>(arg1);\n } else if (typeof arg1 === \"object\" && arg2 === undefined) {\n handler = new MapHandler<T>(arg1);\n } else if (typeof arg1 === \"string\" && arg2) {\n handler = new SingleHandler<T>(arg1, arg2);\n } else {\n throw new Error(\"Invalid arguments passed to watch()\");\n }\n\n this.manager.add(handler);\n\n return () => this.manager.remove(handler);\n }\n}\n"],"mappings":"AAAA,SAAQ,aAAa,sBAAqB;AAE1C,SAAQ,iBAAgB;AAaxB,SAAQ,eAAc;AAEtB,OAAO,qBAAqB;AAC5B,OAAO,oBAAoB;AAE3B,SAAQ,gBAAgB,YAAY,qBAAoB;AAExD,MAAO,gBAA2D,gBAAuC;AAAA,EACrG,OAAe,WAA8C;AAAA,EAE7D,OAAc,cAA2C;AACrD,WAAQ,KAAK,aAAL,KAAK,WAAa,IAAI,QAAW;AAAA,EAC7C;AAAA,EAEA,IAAc,UAA6B;AACvC,WAAO,eAAe,YAAe;AAAA,EACzC;AAAA,EAEO,KACH,MACA,MACA,SAC8B;AAC9B,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI;AAE5C,QAAI,SAAS;AACT,UAAI,OAAO,YAAY,UAAU;AAC7B,eAAO,eAAe,SAAS,OAAO;AAAA,MAC1C;AAEA,YAAM,EAAC,OAAO,GAAG,MAAK,IAAI;AAE1B,UAAI,UAAU,QAAQ,OAAO,GAAG;AAC5B,eAAO,MAAM;AAAA,MACjB;AAEA,aAAO,eAAe,OAAO,SAAS,KAAK;AAAA,IAC/C;AAEA,WAAO,YAAY,OAAO;AAAA,EAC9B;AAAA,EAEO,MACH,MACA,MACU;AACV,QAAI;AAEJ,QAAI,OAAO,SAAS,YAAY;AAC5B,gBAAU,IAAI,eAAqB,IAAI;AAAA,IAC3C,WAAW,OAAO,SAAS,YAAY,SAAS,QAAW;AACvD,gBAAU,IAAI,WAAc,IAAI;AAAA,IACpC,WAAW,OAAO,SAAS,YAAY,MAAM;AACzC,gBAAU,IAAI,cAAiB,MAAM,IAAI;AAAA,IAC7C,OAAO;AACH,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACzD;AAEA,SAAK,QAAQ,IAAI,OAAO;AAExB,WAAO,MAAM,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC5C;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/message/providers/Message.ts"],"sourcesContent":["import {sendMessage, sendTabMessage} from \"@addon-core/browser\";\n\nimport {restoreError} from \"../error\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport {\n MessageBody,\n MessageData,\n MessageDictionary,\n MessageError,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResult,\n MessageResultEnvelopeProperty,\n MessageResponse,\n MessageSendOptions,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\nimport {Browser} from \"@typing/browser\";\n\nimport AbstractMessage from \"./AbstractMessage\";\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {\n private static instance: Message<MessageDictionary> | null = null;\n\n public static getInstance<T extends MessageDictionary>() {\n return (this.instance ??= new Message<T>());\n }\n\n protected get manager(): MessageManager<T> {\n return MessageManager.getInstance<T>();\n }\n\n public async send<K extends MessageType<T>>(\n type: K,\n data: MessageData<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n const response = await this.dispatch(message, options);\n\n return this.unwrap(response);\n }\n\n private dispatch<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined> {\n if (options === undefined) {\n return sendMessage(message);\n }\n\n if (typeof options === \"number\") {\n return sendTabMessage(options, message);\n }\n\n const {tabId, ...other} = options;\n\n if (isBrowser(Browser.Firefox)) {\n delete other.documentId;\n }\n\n return sendTabMessage(tabId, message, other);\n }\n\n private unwrap<K extends MessageType<T>>(\n response: MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined\n ): MessageResponse<T, K> {\n if (!this.isMessageResult(response)) {\n return response as MessageResponse<T, K>;\n }\n\n if (response.ok) {\n return response.payload;\n }\n\n throw restoreError(response.error);\n }\n\n private isMessageResult(response: unknown): response is MessageResult {\n if (\n !this.isRecord(response) ||\n response[MessageResultEnvelopeProperty] !== true ||\n typeof response.ok !== \"boolean\"\n ) {\n return false;\n }\n\n if (response.ok) {\n return \"payload\" in response;\n }\n\n return this.isSerializedError(response.error);\n }\n\n private isSerializedError(error: unknown): error is MessageError {\n return (\n this.isRecord(error) &&\n typeof error.name === \"string\" &&\n typeof error.message === \"string\" &&\n (error.stack === undefined || typeof error.stack === \"string\")\n );\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n }\n\n public watch<K extends MessageType<T>>(\n arg1: K | MessageMapHandler<T> | MessageGeneralHandler<T, K>,\n arg2?: MessageTargetHandler<T, K>\n ): () => void {\n let handler: MessageHandler<T>;\n\n if (typeof arg1 === \"function\") {\n handler = new GeneralHandler<T, K>(arg1);\n } else if (typeof arg1 === \"object\" && arg2 === undefined) {\n handler = new MapHandler<T>(arg1);\n } else if (typeof arg1 === \"string\" && arg2) {\n handler = new SingleHandler<T>(arg1, arg2);\n } else {\n throw new Error(\"Invalid arguments passed to watch()\");\n }\n\n this.manager.add(handler);\n\n return () => this.manager.remove(handler);\n }\n}\n"],"mappings":"AAAA,SAAQ,aAAa,sBAAqB;AAE1C,SAAQ,oBAAmB;AAE3B,SAAQ,iBAAgB;AAExB;AAAA,EASI;AAAA,OAKG;AACP,SAAQ,eAAc;AAEtB,OAAO,qBAAqB;AAC5B,OAAO,oBAAoB;AAE3B,SAAQ,gBAAgB,YAAY,qBAAoB;AAExD,MAAO,gBAA2D,gBAAuC;AAAA,EACrG,OAAe,WAA8C;AAAA,EAE7D,OAAc,cAA2C;AACrD,WAAQ,KAAK,aAAL,KAAK,WAAa,IAAI,QAAW;AAAA,EAC7C;AAAA,EAEA,IAAc,UAA6B;AACvC,WAAO,eAAe,YAAe;AAAA,EACzC;AAAA,EAEA,MAAa,KACT,MACA,MACA,SAC8B;AAC9B,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI;AAC5C,UAAM,WAAW,MAAM,KAAK,SAAS,SAAS,OAAO;AAErD,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC/B;AAAA,EAEQ,SACJ,SACA,SACiF;AACjF,QAAI,YAAY,QAAW;AACvB,aAAO,YAAY,OAAO;AAAA,IAC9B;AAEA,QAAI,OAAO,YAAY,UAAU;AAC7B,aAAO,eAAe,SAAS,OAAO;AAAA,IAC1C;AAEA,UAAM,EAAC,OAAO,GAAG,MAAK,IAAI;AAE1B,QAAI,UAAU,QAAQ,OAAO,GAAG;AAC5B,aAAO,MAAM;AAAA,IACjB;AAEA,WAAO,eAAe,OAAO,SAAS,KAAK;AAAA,EAC/C;AAAA,EAEQ,OACJ,UACqB;AACrB,QAAI,CAAC,KAAK,gBAAgB,QAAQ,GAAG;AACjC,aAAO;AAAA,IACX;AAEA,QAAI,SAAS,IAAI;AACb,aAAO,SAAS;AAAA,IACpB;AAEA,UAAM,aAAa,SAAS,KAAK;AAAA,EACrC;AAAA,EAEQ,gBAAgB,UAA8C;AAClE,QACI,CAAC,KAAK,SAAS,QAAQ,KACvB,SAAS,6BAA6B,MAAM,QAC5C,OAAO,SAAS,OAAO,WACzB;AACE,aAAO;AAAA,IACX;AAEA,QAAI,SAAS,IAAI;AACb,aAAO,aAAa;AAAA,IACxB;AAEA,WAAO,KAAK,kBAAkB,SAAS,KAAK;AAAA,EAChD;AAAA,EAEQ,kBAAkB,OAAuC;AAC7D,WACI,KAAK,SAAS,KAAK,KACnB,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,YAAY,aACxB,MAAM,UAAU,UAAa,OAAO,MAAM,UAAU;AAAA,EAE7D;AAAA,EAEQ,SAAS,OAAkD;AAC/D,WAAO,OAAO,UAAU,YAAY,UAAU;AAAA,EAClD;AAAA,EAEO,MACH,MACA,MACU;AACV,QAAI;AAEJ,QAAI,OAAO,SAAS,YAAY;AAC5B,gBAAU,IAAI,eAAqB,IAAI;AAAA,IAC3C,WAAW,OAAO,SAAS,YAAY,SAAS,QAAW;AACvD,gBAAU,IAAI,WAAc,IAAI;AAAA,IACpC,WAAW,OAAO,SAAS,YAAY,MAAM;AACzC,gBAAU,IAAI,cAAiB,MAAM,IAAI;AAAA,IAC7C,OAAO;AACH,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACzD;AAEA,SAAK,QAAQ,IAAI,OAAO;AAExB,WAAO,MAAM,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC5C;AACJ;","names":[]}
@@ -4,13 +4,11 @@ export default class OffscreenBridge {
4
4
  protected readonly key: string;
5
5
  protected readonly message: Message<import("../message/index.js").MessageDictionary>;
6
6
  protected readonly readyTimeout = 10000;
7
- private readonly framesReady;
7
+ private readonly frames;
8
8
  private static instance?;
9
9
  static getInstance(): OffscreenBridge;
10
10
  static createOffscreen(parameters: CreateParameters): Promise<void>;
11
11
  create(parameters: CreateParameters): Promise<any>;
12
12
  protected apply({ url }: CreateParameters): Promise<void>;
13
- private createFrame;
14
- private getFrame;
15
13
  }
16
14
  export {};
@@ -1,11 +1,12 @@
1
1
  import { isBackground } from "@addon-core/browser";
2
2
  import { Message } from "./../message/providers/index.js";
3
+ import { ReadyFrame } from "./../frame/index.js";
3
4
  import { OffscreenBridgeReadyMessageType } from "./../types/offscreen.js";
4
5
  class OffscreenBridge {
5
6
  key = "offscreen-background";
6
7
  message = new Message();
7
8
  readyTimeout = 1e4;
8
- framesReady = /* @__PURE__ */ new Map();
9
+ frames = new ReadyFrame();
9
10
  static instance;
10
11
  static getInstance() {
11
12
  return OffscreenBridge.instance ?? (OffscreenBridge.instance = new OffscreenBridge());
@@ -20,64 +21,19 @@ class OffscreenBridge {
20
21
  }
21
22
  await this.message.send(this.key, parameters);
22
23
  }
23
- apply({ url }) {
24
- const ready = this.framesReady.get(url);
25
- if (ready) {
26
- return ready;
27
- }
28
- const existing = this.getFrame(url);
29
- if ((existing == null ? void 0 : existing.dataset.ready) === "true") {
30
- return Promise.resolve();
31
- }
32
- const creation = this.createFrame(url, existing).finally(() => {
33
- this.framesReady.delete(url);
34
- });
35
- this.framesReady.set(url, creation);
36
- return creation;
37
- }
38
- createFrame(url, existing) {
39
- return new Promise((resolve, reject) => {
40
- const iframe = existing ?? document.createElement("iframe");
41
- const cleanup = () => {
42
- clearTimeout(timeout);
43
- window.removeEventListener("message", listener);
44
- iframe.onerror = null;
45
- };
46
- const listener = (event) => {
24
+ async apply({ url }) {
25
+ await this.frames.make({
26
+ key: url,
27
+ url,
28
+ readyTimeout: this.readyTimeout,
29
+ isReady: (event, frame) => {
47
30
  var _a;
48
- if (event.source !== iframe.contentWindow) {
49
- return;
50
- }
51
- if (event.origin !== location.origin) {
52
- return;
53
- }
54
- if (((_a = event.data) == null ? void 0 : _a.type) !== OffscreenBridgeReadyMessageType) {
55
- return;
56
- }
57
- iframe.dataset.ready = "true";
58
- cleanup();
59
- resolve();
60
- };
61
- const timeout = setTimeout(() => {
62
- cleanup();
63
- iframe.remove();
64
- reject(new Error(`Offscreen iframe "${url}" was not ready in time.`));
65
- }, this.readyTimeout);
66
- iframe.onerror = () => {
67
- cleanup();
68
- iframe.remove();
69
- reject(new Error(`Offscreen iframe failed to load: ${url}`));
70
- };
71
- window.addEventListener("message", listener);
72
- if (!existing) {
73
- iframe.src = url;
74
- document.body.appendChild(iframe);
75
- }
31
+ return event.source === frame.contentWindow && event.origin === location.origin && ((_a = event.data) == null ? void 0 : _a.type) === OffscreenBridgeReadyMessageType;
32
+ },
33
+ readyTimeoutMessage: () => `Offscreen iframe "${url}" was not ready in time.`,
34
+ loadErrorMessage: () => `Offscreen iframe failed to load: ${url}`
76
35
  });
77
36
  }
78
- getFrame(url) {
79
- return Array.from(document.querySelectorAll("iframe")).find((iframe) => iframe.getAttribute("src") === url);
80
- }
81
37
  }
82
38
  export {
83
39
  OffscreenBridge as default
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/offscreen/OffscreenBridge.ts"],"sourcesContent":["import {isBackground} from \"@addon-core/browser\";\n\nimport {Message} from \"@message/providers\";\n\nimport {OffscreenBridgeReadyMessageType} from \"@typing/offscreen\";\n\ntype CreateParameters = chrome.offscreen.CreateParameters;\n\nexport default class OffscreenBridge {\n protected readonly key: string = \"offscreen-background\";\n\n protected readonly message = new Message();\n\n protected readonly readyTimeout = 10000;\n\n private readonly framesReady: Map<string, Promise<void>> = new Map();\n\n private static instance?: OffscreenBridge;\n\n public static getInstance(): OffscreenBridge {\n return (OffscreenBridge.instance ??= new OffscreenBridge());\n }\n\n public static async createOffscreen(parameters: CreateParameters): Promise<void> {\n return OffscreenBridge.getInstance().create(parameters);\n }\n\n public async create(parameters: CreateParameters): Promise<any> {\n if (isBackground()) {\n await this.apply(parameters);\n\n return;\n }\n\n await this.message.send(this.key, parameters);\n }\n\n protected apply({url}: CreateParameters): Promise<void> {\n const ready = this.framesReady.get(url);\n\n if (ready) {\n return ready;\n }\n\n const existing = this.getFrame(url);\n\n if (existing?.dataset.ready === \"true\") {\n return Promise.resolve();\n }\n\n const creation = this.createFrame(url, existing).finally(() => {\n this.framesReady.delete(url);\n });\n\n this.framesReady.set(url, creation);\n\n return creation;\n }\n\n private createFrame(url: string, existing?: HTMLIFrameElement): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const iframe = existing ?? document.createElement(\"iframe\");\n\n const cleanup = () => {\n clearTimeout(timeout);\n window.removeEventListener(\"message\", listener);\n iframe.onerror = null;\n };\n\n const listener = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n\n if (event.origin !== location.origin) {\n return;\n }\n\n if (event.data?.type !== OffscreenBridgeReadyMessageType) {\n return;\n }\n\n iframe.dataset.ready = \"true\";\n\n cleanup();\n resolve();\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n iframe.remove();\n\n reject(new Error(`Offscreen iframe \"${url}\" was not ready in time.`));\n }, this.readyTimeout);\n\n iframe.onerror = () => {\n cleanup();\n iframe.remove();\n reject(new Error(`Offscreen iframe failed to load: ${url}`));\n };\n\n window.addEventListener(\"message\", listener);\n\n if (!existing) {\n iframe.src = url;\n document.body.appendChild(iframe);\n }\n });\n }\n\n private getFrame(url: string): HTMLIFrameElement | undefined {\n return Array.from(document.querySelectorAll(\"iframe\")).find(iframe => iframe.getAttribute(\"src\") === url);\n }\n}\n"],"mappings":"AAAA,SAAQ,oBAAmB;AAE3B,SAAQ,eAAc;AAEtB,SAAQ,uCAAsC;AAI9C,MAAO,gBAA8B;AAAA,EACd,MAAc;AAAA,EAEd,UAAU,IAAI,QAAQ;AAAA,EAEtB,eAAe;AAAA,EAEjB,cAA0C,oBAAI,IAAI;AAAA,EAEnE,OAAe;AAAA,EAEf,OAAc,cAA+B;AACzC,WAAQ,gBAAgB,aAAhB,gBAAgB,WAAa,IAAI,gBAAgB;AAAA,EAC7D;AAAA,EAEA,aAAoB,gBAAgB,YAA6C;AAC7E,WAAO,gBAAgB,YAAY,EAAE,OAAO,UAAU;AAAA,EAC1D;AAAA,EAEA,MAAa,OAAO,YAA4C;AAC5D,QAAI,aAAa,GAAG;AAChB,YAAM,KAAK,MAAM,UAAU;AAE3B;AAAA,IACJ;AAEA,UAAM,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAU;AAAA,EAChD;AAAA,EAEU,MAAM,EAAC,IAAG,GAAoC;AACpD,UAAM,QAAQ,KAAK,YAAY,IAAI,GAAG;AAEtC,QAAI,OAAO;AACP,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,KAAK,SAAS,GAAG;AAElC,SAAI,qCAAU,QAAQ,WAAU,QAAQ;AACpC,aAAO,QAAQ,QAAQ;AAAA,IAC3B;AAEA,UAAM,WAAW,KAAK,YAAY,KAAK,QAAQ,EAAE,QAAQ,MAAM;AAC3D,WAAK,YAAY,OAAO,GAAG;AAAA,IAC/B,CAAC;AAED,SAAK,YAAY,IAAI,KAAK,QAAQ;AAElC,WAAO;AAAA,EACX;AAAA,EAEQ,YAAY,KAAa,UAA6C;AAC1E,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,YAAM,SAAS,YAAY,SAAS,cAAc,QAAQ;AAE1D,YAAM,UAAU,MAAM;AAClB,qBAAa,OAAO;AACpB,eAAO,oBAAoB,WAAW,QAAQ;AAC9C,eAAO,UAAU;AAAA,MACrB;AAEA,YAAM,WAAW,CAAC,UAAwB;AArEtD;AAsEgB,YAAI,MAAM,WAAW,OAAO,eAAe;AACvC;AAAA,QACJ;AAEA,YAAI,MAAM,WAAW,SAAS,QAAQ;AAClC;AAAA,QACJ;AAEA,cAAI,WAAM,SAAN,mBAAY,UAAS,iCAAiC;AACtD;AAAA,QACJ;AAEA,eAAO,QAAQ,QAAQ;AAEvB,gBAAQ;AACR,gBAAQ;AAAA,MACZ;AAEA,YAAM,UAAU,WAAW,MAAM;AAC7B,gBAAQ;AACR,eAAO,OAAO;AAEd,eAAO,IAAI,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAAA,MACxE,GAAG,KAAK,YAAY;AAEpB,aAAO,UAAU,MAAM;AACnB,gBAAQ;AACR,eAAO,OAAO;AACd,eAAO,IAAI,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAAA,MAC/D;AAEA,aAAO,iBAAiB,WAAW,QAAQ;AAE3C,UAAI,CAAC,UAAU;AACX,eAAO,MAAM;AACb,iBAAS,KAAK,YAAY,MAAM;AAAA,MACpC;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,SAAS,KAA4C;AACzD,WAAO,MAAM,KAAK,SAAS,iBAAiB,QAAQ,CAAC,EAAE,KAAK,YAAU,OAAO,aAAa,KAAK,MAAM,GAAG;AAAA,EAC5G;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../src/offscreen/OffscreenBridge.ts"],"sourcesContent":["import {isBackground} from \"@addon-core/browser\";\n\nimport {Message} from \"@message/providers\";\nimport {ReadyFrame} from \"@frame/index\";\n\nimport {OffscreenBridgeReadyMessageType} from \"@typing/offscreen\";\n\ntype CreateParameters = chrome.offscreen.CreateParameters;\n\nexport default class OffscreenBridge {\n protected readonly key: string = \"offscreen-background\";\n\n protected readonly message = new Message();\n\n protected readonly readyTimeout = 10000;\n\n private readonly frames = new ReadyFrame();\n\n private static instance?: OffscreenBridge;\n\n public static getInstance(): OffscreenBridge {\n return (OffscreenBridge.instance ??= new OffscreenBridge());\n }\n\n public static async createOffscreen(parameters: CreateParameters): Promise<void> {\n return OffscreenBridge.getInstance().create(parameters);\n }\n\n public async create(parameters: CreateParameters): Promise<any> {\n if (isBackground()) {\n await this.apply(parameters);\n\n return;\n }\n\n await this.message.send(this.key, parameters);\n }\n\n protected async apply({url}: CreateParameters): Promise<void> {\n await this.frames.make({\n key: url,\n url,\n readyTimeout: this.readyTimeout,\n isReady: (event, frame) =>\n event.source === frame.contentWindow &&\n event.origin === location.origin &&\n event.data?.type === OffscreenBridgeReadyMessageType,\n readyTimeoutMessage: () => `Offscreen iframe \"${url}\" was not ready in time.`,\n loadErrorMessage: () => `Offscreen iframe failed to load: ${url}`,\n });\n }\n}\n"],"mappings":"AAAA,SAAQ,oBAAmB;AAE3B,SAAQ,eAAc;AACtB,SAAQ,kBAAiB;AAEzB,SAAQ,uCAAsC;AAI9C,MAAO,gBAA8B;AAAA,EACd,MAAc;AAAA,EAEd,UAAU,IAAI,QAAQ;AAAA,EAEtB,eAAe;AAAA,EAEjB,SAAS,IAAI,WAAW;AAAA,EAEzC,OAAe;AAAA,EAEf,OAAc,cAA+B;AACzC,WAAQ,gBAAgB,aAAhB,gBAAgB,WAAa,IAAI,gBAAgB;AAAA,EAC7D;AAAA,EAEA,aAAoB,gBAAgB,YAA6C;AAC7E,WAAO,gBAAgB,YAAY,EAAE,OAAO,UAAU;AAAA,EAC1D;AAAA,EAEA,MAAa,OAAO,YAA4C;AAC5D,QAAI,aAAa,GAAG;AAChB,YAAM,KAAK,MAAM,UAAU;AAE3B;AAAA,IACJ;AAEA,UAAM,KAAK,QAAQ,KAAK,KAAK,KAAK,UAAU;AAAA,EAChD;AAAA,EAEA,MAAgB,MAAM,EAAC,IAAG,GAAoC;AAC1D,UAAM,KAAK,OAAO,KAAK;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,SAAS,CAAC,OAAO,UAAO;AA3CpC;AA4CgB,qBAAM,WAAW,MAAM,iBACvB,MAAM,WAAW,SAAS,YAC1B,WAAM,SAAN,mBAAY,UAAS;AAAA;AAAA,MACzB,qBAAqB,MAAM,qBAAqB,GAAG;AAAA,MACnD,kBAAkB,MAAM,oCAAoC,GAAG;AAAA,IACnE,CAAC;AAAA,EACL;AACJ;","names":[]}
@@ -1,5 +1,10 @@
1
1
  import { ProxyOffscreen, RegisterOffscreen } from "./providers/index.js";
2
2
  import OffscreenBackground from "./OffscreenBackground.js";
3
- import { TransportDictionary, TransportName, TransportProxyTarget as OffscreenProxyTarget, TransportTarget as OffscreenTarget } from "../types/transport.js";
4
- export { type OffscreenTarget, type OffscreenProxyTarget, ProxyOffscreen, RegisterOffscreen, OffscreenBackground };
5
- export declare const getOffscreen: <N extends TransportName>(name: N) => TransportDictionary[N];
3
+ import type { TransportProxyTarget, TransportTarget } from "../transport/index.js";
4
+ export { ProxyOffscreen, RegisterOffscreen, OffscreenBackground };
5
+ export interface OffscreenRegistry {
6
+ }
7
+ export type OffscreenName = Extract<keyof OffscreenRegistry, string>;
8
+ export type OffscreenTarget<N extends keyof OffscreenRegistry> = TransportTarget<OffscreenRegistry, N>;
9
+ export type OffscreenProxyTarget<N extends keyof OffscreenRegistry> = TransportProxyTarget<OffscreenRegistry, N>;
10
+ export declare const getOffscreen: <N extends OffscreenName>(name: N) => OffscreenTarget<N>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/offscreen/index.ts"],"sourcesContent":["import {Offscreen, ProxyOffscreen, RegisterOffscreen} from \"./providers\";\nimport OffscreenBackground from \"./OffscreenBackground\";\n\nimport {\n TransportDictionary,\n TransportName,\n TransportProxyTarget as OffscreenProxyTarget,\n TransportTarget as OffscreenTarget,\n} from \"@typing/transport\";\n\nexport {type OffscreenTarget, type OffscreenProxyTarget, ProxyOffscreen, RegisterOffscreen, OffscreenBackground};\n\nexport const getOffscreen = <N extends TransportName>(name: N): TransportDictionary[N] => {\n return new Offscreen<N>(name).get();\n};\n"],"mappings":"AAAA,SAAQ,WAAW,gBAAgB,yBAAwB;AAC3D,OAAO,yBAAyB;AAWzB,MAAM,eAAe,CAA0B,SAAoC;AACtF,SAAO,IAAI,UAAa,IAAI,EAAE,IAAI;AACtC;","names":[]}
1
+ {"version":3,"sources":["../../src/offscreen/index.ts"],"sourcesContent":["import {Offscreen, ProxyOffscreen, RegisterOffscreen} from \"./providers\";\nimport OffscreenBackground from \"./OffscreenBackground\";\n\nimport type {TransportProxyTarget, TransportTarget} from \"@transport/index\";\n\nexport {ProxyOffscreen, RegisterOffscreen, OffscreenBackground};\n\nexport interface OffscreenRegistry {}\n\nexport type OffscreenName = Extract<keyof OffscreenRegistry, string>;\n\nexport type OffscreenTarget<N extends keyof OffscreenRegistry> = TransportTarget<OffscreenRegistry, N>;\n\nexport type OffscreenProxyTarget<N extends keyof OffscreenRegistry> = TransportProxyTarget<OffscreenRegistry, N>;\n\nexport const getOffscreen = <N extends OffscreenName>(name: N): OffscreenTarget<N> => {\n return new Offscreen<N>(name).get();\n};\n"],"mappings":"AAAA,SAAQ,WAAW,gBAAgB,yBAAwB;AAC3D,OAAO,yBAAyB;AAczB,MAAM,eAAe,CAA0B,SAAgC;AAClF,SAAO,IAAI,UAAa,IAAI,EAAE,IAAI;AACtC;","names":[]}
@@ -1,4 +1,9 @@
1
1
  import { ProxyRelay, RegisterRelay, type ProxyRelayParams } from "./providers/index.js";
2
- import type { TransportDictionary, TransportName, TransportProxyTarget as RelayProxyTarget, TransportTarget as RelayTarget } from "../types/transport.js";
3
- export { type RelayTarget, type RelayProxyTarget, type ProxyRelayParams, ProxyRelay, RegisterRelay };
4
- export declare const getRelay: <N extends TransportName>(name: N) => TransportDictionary[N];
2
+ import type { TransportProxyTarget, TransportTarget } from "../transport/index.js";
3
+ export { type ProxyRelayParams, ProxyRelay, RegisterRelay };
4
+ export interface RelayRegistry {
5
+ }
6
+ export type RelayName = Extract<keyof RelayRegistry, string>;
7
+ export type RelayTarget<N extends keyof RelayRegistry> = TransportTarget<RelayRegistry, N>;
8
+ export type RelayProxyTarget<N extends keyof RelayRegistry> = TransportProxyTarget<RelayRegistry, N>;
9
+ export declare const getRelay: <N extends RelayName>(name: N) => RelayTarget<N>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/relay/index.ts"],"sourcesContent":["import {ProxyRelay, RegisterRelay, Relay, type ProxyRelayParams} from \"./providers\";\n\nimport type {\n TransportDictionary,\n TransportName,\n TransportProxyTarget as RelayProxyTarget,\n TransportTarget as RelayTarget,\n} from \"@typing/transport\";\n\nexport {type RelayTarget, type RelayProxyTarget, type ProxyRelayParams, ProxyRelay, RegisterRelay};\n\nexport const getRelay = <N extends TransportName>(name: N): TransportDictionary[N] => {\n return new Relay<N>(name).get();\n};\n"],"mappings":"AAAA,SAAQ,YAAY,eAAe,aAAmC;AAW/D,MAAM,WAAW,CAA0B,SAAoC;AAClF,SAAO,IAAI,MAAS,IAAI,EAAE,IAAI;AAClC;","names":[]}
1
+ {"version":3,"sources":["../../src/relay/index.ts"],"sourcesContent":["import {ProxyRelay, RegisterRelay, Relay, type ProxyRelayParams} from \"./providers\";\n\nimport type {TransportProxyTarget, TransportTarget} from \"@transport/index\";\n\nexport {type ProxyRelayParams, ProxyRelay, RegisterRelay};\n\nexport interface RelayRegistry {}\n\nexport type RelayName = Extract<keyof RelayRegistry, string>;\n\nexport type RelayTarget<N extends keyof RelayRegistry> = TransportTarget<RelayRegistry, N>;\n\nexport type RelayProxyTarget<N extends keyof RelayRegistry> = TransportProxyTarget<RelayRegistry, N>;\n\nexport const getRelay = <N extends RelayName>(name: N): RelayTarget<N> => {\n return new Relay<N>(name).get();\n};\n"],"mappings":"AAAA,SAAQ,YAAY,eAAe,aAAmC;AAc/D,MAAM,WAAW,CAAsB,SAA4B;AACtE,SAAO,IAAI,MAAS,IAAI,EAAE,IAAI;AAClC;","names":[]}
@@ -0,0 +1,6 @@
1
+ import { SandboxParameters } from "../types/sandbox.js";
2
+ export default class SandboxFrame {
3
+ private readonly frames;
4
+ make(name: string, parameters: SandboxParameters): Promise<HTMLIFrameElement>;
5
+ remove(name: string): void;
6
+ }
@@ -0,0 +1,31 @@
1
+ import { sandboxChannel } from "./utils.js";
2
+ import { ReadyFrame } from "./../frame/index.js";
3
+ import { SandboxReadyMessageType } from "./../types/sandbox.js";
4
+ class SandboxFrame {
5
+ frames = new ReadyFrame();
6
+ make(name, parameters) {
7
+ const { url, readyTimeout } = parameters;
8
+ const channel = sandboxChannel(name);
9
+ return this.frames.make({
10
+ key: name,
11
+ url,
12
+ readyTimeout,
13
+ isReady: (event, frame) => {
14
+ if (event.source !== frame.contentWindow) {
15
+ return false;
16
+ }
17
+ const data = event.data;
18
+ return (data == null ? void 0 : data.type) === SandboxReadyMessageType && data.channel === channel && data.name === name;
19
+ },
20
+ readyTimeoutMessage: (loaded, timeout) => loaded ? `Sandbox "${name}" loaded but never signaled ready within ${timeout}ms. Ensure the sandbox entry runs and the manifest sandbox CSP allows its script.` : `Sandbox "${name}" did not load "${url}" within ${timeout}ms. Ensure the page is listed in the manifest sandbox pages and is not blocked by CSP.`,
21
+ loadErrorMessage: () => `Sandbox "${name}" failed to load: ${url}`
22
+ });
23
+ }
24
+ remove(name) {
25
+ this.frames.remove(name);
26
+ }
27
+ }
28
+ export {
29
+ SandboxFrame as default
30
+ };
31
+ //# sourceMappingURL=SandboxFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sandbox/SandboxFrame.ts"],"sourcesContent":["import {sandboxChannel} from \"./utils\";\n\nimport {ReadyFrame} from \"@frame/index\";\n\nimport {SandboxParameters, SandboxReadyMessage, SandboxReadyMessageType} from \"@typing/sandbox\";\n\nexport default class SandboxFrame {\n private readonly frames = new ReadyFrame();\n\n public make(name: string, parameters: SandboxParameters): Promise<HTMLIFrameElement> {\n const {url, readyTimeout} = parameters;\n const channel = sandboxChannel(name);\n\n return this.frames.make({\n key: name,\n url,\n readyTimeout,\n isReady: (event, frame) => {\n if (event.source !== frame.contentWindow) {\n return false;\n }\n\n const data = event.data as Partial<SandboxReadyMessage>;\n\n return data?.type === SandboxReadyMessageType && data.channel === channel && data.name === name;\n },\n readyTimeoutMessage: (loaded, timeout) =>\n loaded\n ? `Sandbox \"${name}\" loaded but never signaled ready within ${timeout}ms. Ensure the sandbox entry runs and the manifest sandbox CSP allows its script.`\n : `Sandbox \"${name}\" did not load \"${url}\" within ${timeout}ms. Ensure the page is listed in the manifest sandbox pages and is not blocked by CSP.`,\n loadErrorMessage: () => `Sandbox \"${name}\" failed to load: ${url}`,\n });\n }\n\n public remove(name: string): void {\n this.frames.remove(name);\n }\n}\n"],"mappings":"AAAA,SAAQ,sBAAqB;AAE7B,SAAQ,kBAAiB;AAEzB,SAAgD,+BAA8B;AAE9E,MAAO,aAA2B;AAAA,EACb,SAAS,IAAI,WAAW;AAAA,EAElC,KAAK,MAAc,YAA2D;AACjF,UAAM,EAAC,KAAK,aAAY,IAAI;AAC5B,UAAM,UAAU,eAAe,IAAI;AAEnC,WAAO,KAAK,OAAO,KAAK;AAAA,MACpB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,CAAC,OAAO,UAAU;AACvB,YAAI,MAAM,WAAW,MAAM,eAAe;AACtC,iBAAO;AAAA,QACX;AAEA,cAAM,OAAO,MAAM;AAEnB,gBAAO,6BAAM,UAAS,2BAA2B,KAAK,YAAY,WAAW,KAAK,SAAS;AAAA,MAC/F;AAAA,MACA,qBAAqB,CAAC,QAAQ,YAC1B,SACM,YAAY,IAAI,4CAA4C,OAAO,sFACnE,YAAY,IAAI,mBAAmB,GAAG,YAAY,OAAO;AAAA,MACnE,kBAAkB,MAAM,YAAY,IAAI,qBAAqB,GAAG;AAAA,IACpE,CAAC;AAAA,EACL;AAAA,EAEO,OAAO,MAAoB;AAC9B,SAAK,OAAO,OAAO,IAAI;AAAA,EAC3B;AACJ;","names":[]}
@@ -0,0 +1,5 @@
1
+ import TransportManager from "../transport/TransportManager.js";
2
+ import type { TransportManager as TransportManagerContract } from "../types/transport.js";
3
+ export default class SandboxManager extends TransportManager {
4
+ static getInstance(): TransportManagerContract;
5
+ }
@@ -0,0 +1,12 @@
1
+ import TransportManager from "./../transport/TransportManager.js";
2
+ import { SandboxGlobalKey } from "./../types/sandbox.js";
3
+ class SandboxManager extends TransportManager {
4
+ static getInstance() {
5
+ var _a;
6
+ return globalThis[_a = SandboxGlobalKey] ?? (globalThis[_a] = new SandboxManager());
7
+ }
8
+ }
9
+ export {
10
+ SandboxManager as default
11
+ };
12
+ //# sourceMappingURL=SandboxManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sandbox/SandboxManager.ts"],"sourcesContent":["import TransportManager from \"@transport/TransportManager\";\n\nimport {SandboxGlobalKey} from \"@typing/sandbox\";\n\nimport type {TransportManager as TransportManagerContract} from \"@typing/transport\";\n\nexport default class SandboxManager extends TransportManager {\n public static getInstance(): TransportManagerContract {\n return (globalThis[SandboxGlobalKey] ??= new SandboxManager());\n }\n}\n"],"mappings":"AAAA,OAAO,sBAAsB;AAE7B,SAAQ,wBAAuB;AAI/B,MAAO,uBAAqC,iBAAiB;AAAA,EACzD,OAAc,cAAwC;AAP1D;AAQQ,WAAQ,gBAAW,sBAAX,iBAAiC,IAAI,eAAe;AAAA,EAChE;AACJ;","names":[]}
@@ -0,0 +1,30 @@
1
+ import { SandboxParameters, SandboxPort } from "../types/sandbox.js";
2
+ import type { MessageSender } from "../types/message.js";
3
+ import type { TransportMessage, TransportMessageData } from "../types/transport.js";
4
+ /**
5
+ * The standard transport channel (`send`/`watch`) for the sandbox layer, implemented over
6
+ * `window.postMessage` instead of the chrome.runtime `Message` provider. All request/response
7
+ * correlation (requestId, pending map, timeouts, error serialize/restore) lives here, behind
8
+ * the standard interface; the raw wire sits below in a `SandboxPort`.
9
+ */
10
+ export default class SandboxMessage implements TransportMessage {
11
+ private readonly name;
12
+ private readonly port;
13
+ private readonly parameters;
14
+ private static readonly hosts;
15
+ private readonly channel;
16
+ private readonly pending;
17
+ private listenUnsubscribe?;
18
+ private watchUnsubscribe?;
19
+ constructor(name: string, port: SandboxPort, parameters?: Partial<SandboxParameters>);
20
+ /**
21
+ * Host-side channel, cached per name. One cached instance means one peer listener per
22
+ * sandbox no matter how many times `getSandbox()` is called — this is the leak fix.
23
+ */
24
+ static for(name: string, parameters: SandboxParameters): SandboxMessage;
25
+ send(data: TransportMessageData): Promise<any>;
26
+ watch(handler: (data: TransportMessageData, sender: MessageSender) => any): () => void;
27
+ dispose(): void;
28
+ private listen;
29
+ private respond;
30
+ }
@@ -0,0 +1,127 @@
1
+ import { nanoid } from "nanoid";
2
+ import { sandboxChannel } from "./utils.js";
3
+ import { SandboxHost } from "./ports/index.js";
4
+ import { restoreError, serializeError } from "./../message/error.js";
5
+ import {
6
+ SandboxRequestMessageType,
7
+ SandboxResponseMessageType
8
+ } from "./../types/sandbox.js";
9
+ const DefaultRequestTimeout = 3e4;
10
+ class SandboxMessage {
11
+ constructor(name, port, parameters = {}) {
12
+ this.name = name;
13
+ this.port = port;
14
+ this.parameters = parameters;
15
+ this.channel = sandboxChannel(name);
16
+ }
17
+ name;
18
+ port;
19
+ parameters;
20
+ static hosts = /* @__PURE__ */ new Map();
21
+ channel;
22
+ pending = /* @__PURE__ */ new Map();
23
+ listenUnsubscribe;
24
+ watchUnsubscribe;
25
+ /**
26
+ * Host-side channel, cached per name. One cached instance means one peer listener per
27
+ * sandbox no matter how many times `getSandbox()` is called — this is the leak fix.
28
+ */
29
+ static for(name, parameters) {
30
+ let message = this.hosts.get(name);
31
+ if (!message) {
32
+ message = new SandboxMessage(name, new SandboxHost(name, parameters), parameters);
33
+ this.hosts.set(name, message);
34
+ }
35
+ return message;
36
+ }
37
+ async send(data) {
38
+ await this.port.connect();
39
+ this.listen();
40
+ const requestId = nanoid();
41
+ const request = {
42
+ type: SandboxRequestMessageType,
43
+ channel: this.channel,
44
+ name: this.name,
45
+ requestId,
46
+ path: data.path,
47
+ args: data.args
48
+ };
49
+ const requestTimeout = this.parameters.requestTimeout ?? DefaultRequestTimeout;
50
+ return new Promise((resolve, reject) => {
51
+ const timeout = setTimeout(() => {
52
+ this.pending.delete(requestId);
53
+ if (this.parameters.removeOnRequestTimeout && this.pending.size === 0) {
54
+ this.dispose();
55
+ }
56
+ reject(new Error(`Sandbox "${this.name}" request "${requestId}" timed out.`));
57
+ }, requestTimeout);
58
+ this.pending.set(requestId, { resolve, reject, timeout });
59
+ this.port.post(request);
60
+ });
61
+ }
62
+ watch(handler) {
63
+ if (this.watchUnsubscribe) {
64
+ return this.watchUnsubscribe;
65
+ }
66
+ const unsubscribe = this.port.subscribe(async (message, sender) => {
67
+ if (message.type !== SandboxRequestMessageType) {
68
+ return;
69
+ }
70
+ try {
71
+ const payload = await handler({ path: message.path, args: message.args ?? [] }, sender);
72
+ this.respond({ requestId: message.requestId, ok: true, payload });
73
+ } catch (error) {
74
+ this.respond({ requestId: message.requestId, ok: false, error: serializeError(error) });
75
+ }
76
+ });
77
+ this.watchUnsubscribe = unsubscribe;
78
+ return unsubscribe;
79
+ }
80
+ dispose() {
81
+ var _a, _b;
82
+ for (const pending of this.pending.values()) {
83
+ clearTimeout(pending.timeout);
84
+ pending.reject(new Error(`Sandbox "${this.name}" was disposed.`));
85
+ }
86
+ this.pending.clear();
87
+ (_a = this.listenUnsubscribe) == null ? void 0 : _a.call(this);
88
+ this.listenUnsubscribe = void 0;
89
+ (_b = this.watchUnsubscribe) == null ? void 0 : _b.call(this);
90
+ this.watchUnsubscribe = void 0;
91
+ this.port.dispose();
92
+ SandboxMessage.hosts.delete(this.name);
93
+ }
94
+ listen() {
95
+ if (this.listenUnsubscribe) {
96
+ return;
97
+ }
98
+ this.listenUnsubscribe = this.port.subscribe((message) => {
99
+ if (message.type !== SandboxResponseMessageType) {
100
+ return;
101
+ }
102
+ const pending = this.pending.get(message.requestId);
103
+ if (!pending) {
104
+ return;
105
+ }
106
+ clearTimeout(pending.timeout);
107
+ this.pending.delete(message.requestId);
108
+ if (message.ok) {
109
+ pending.resolve(message.payload);
110
+ } else {
111
+ pending.reject(restoreError(message.error));
112
+ }
113
+ });
114
+ }
115
+ respond(response) {
116
+ this.port.post({
117
+ type: SandboxResponseMessageType,
118
+ channel: this.channel,
119
+ name: this.name,
120
+ ...response
121
+ });
122
+ }
123
+ }
124
+ export {
125
+ SandboxMessage as default
126
+ };
127
+ //# sourceMappingURL=SandboxMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sandbox/SandboxMessage.ts"],"sourcesContent":["import {nanoid} from \"nanoid\";\n\nimport {sandboxChannel} from \"./utils\";\nimport {SandboxHost} from \"./ports\";\n\nimport {restoreError, serializeError} from \"@message/error\";\nimport {\n SandboxParameters,\n SandboxPort,\n SandboxRequestMessage,\n SandboxRequestMessageType,\n SandboxResponseMessage,\n SandboxResponseMessageType,\n} from \"@typing/sandbox\";\nimport type {MessageSender} from \"@typing/message\";\nimport type {TransportMessage, TransportMessageData} from \"@typing/transport\";\n\ntype Pending = {\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\nconst DefaultRequestTimeout = 30000;\n\n/**\n * The standard transport channel (`send`/`watch`) for the sandbox layer, implemented over\n * `window.postMessage` instead of the chrome.runtime `Message` provider. All request/response\n * correlation (requestId, pending map, timeouts, error serialize/restore) lives here, behind\n * the standard interface; the raw wire sits below in a `SandboxPort`.\n */\nexport default class SandboxMessage implements TransportMessage {\n private static readonly hosts: Map<string, SandboxMessage> = new Map();\n\n private readonly channel: string;\n\n private readonly pending: Map<string, Pending> = new Map();\n\n private listenUnsubscribe?: () => void;\n\n private watchUnsubscribe?: () => void;\n\n constructor(\n private readonly name: string,\n private readonly port: SandboxPort,\n private readonly parameters: Partial<SandboxParameters> = {}\n ) {\n this.channel = sandboxChannel(name);\n }\n\n /**\n * Host-side channel, cached per name. One cached instance means one peer listener per\n * sandbox no matter how many times `getSandbox()` is called — this is the leak fix.\n */\n public static for(name: string, parameters: SandboxParameters): SandboxMessage {\n let message = this.hosts.get(name);\n\n if (!message) {\n message = new SandboxMessage(name, new SandboxHost(name, parameters), parameters);\n\n this.hosts.set(name, message);\n }\n\n return message;\n }\n\n public async send(data: TransportMessageData): Promise<any> {\n await this.port.connect();\n\n this.listen();\n\n const requestId = nanoid();\n const request: SandboxRequestMessage = {\n type: SandboxRequestMessageType,\n channel: this.channel,\n name: this.name,\n requestId,\n path: data.path,\n args: data.args,\n };\n\n const requestTimeout = this.parameters.requestTimeout ?? DefaultRequestTimeout;\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(requestId);\n\n if (this.parameters.removeOnRequestTimeout && this.pending.size === 0) {\n this.dispose();\n }\n\n reject(new Error(`Sandbox \"${this.name}\" request \"${requestId}\" timed out.`));\n }, requestTimeout);\n\n this.pending.set(requestId, {resolve, reject, timeout});\n\n this.port.post(request);\n });\n }\n\n public watch(handler: (data: TransportMessageData, sender: MessageSender) => any): () => void {\n if (this.watchUnsubscribe) {\n return this.watchUnsubscribe;\n }\n\n const unsubscribe = this.port.subscribe(async (message, sender) => {\n if (message.type !== SandboxRequestMessageType) {\n return;\n }\n\n try {\n const payload = await handler({path: message.path, args: message.args ?? []}, sender);\n\n this.respond({requestId: message.requestId, ok: true, payload});\n } catch (error) {\n this.respond({requestId: message.requestId, ok: false, error: serializeError(error)});\n }\n });\n\n this.watchUnsubscribe = unsubscribe;\n\n return unsubscribe;\n }\n\n public dispose(): void {\n for (const pending of this.pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(`Sandbox \"${this.name}\" was disposed.`));\n }\n\n this.pending.clear();\n\n this.listenUnsubscribe?.();\n this.listenUnsubscribe = undefined;\n\n this.watchUnsubscribe?.();\n this.watchUnsubscribe = undefined;\n\n this.port.dispose();\n\n SandboxMessage.hosts.delete(this.name);\n }\n\n private listen(): void {\n if (this.listenUnsubscribe) {\n return;\n }\n\n this.listenUnsubscribe = this.port.subscribe(message => {\n if (message.type !== SandboxResponseMessageType) {\n return;\n }\n\n const pending = this.pending.get(message.requestId);\n\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timeout);\n this.pending.delete(message.requestId);\n\n if (message.ok) {\n pending.resolve(message.payload);\n } else {\n pending.reject(restoreError(message.error));\n }\n });\n }\n\n private respond(response: Omit<SandboxResponseMessage, \"type\" | \"channel\" | \"name\">): void {\n this.port.post({\n type: SandboxResponseMessageType,\n channel: this.channel,\n name: this.name,\n ...response,\n });\n }\n}\n"],"mappings":"AAAA,SAAQ,cAAa;AAErB,SAAQ,sBAAqB;AAC7B,SAAQ,mBAAkB;AAE1B,SAAQ,cAAc,sBAAqB;AAC3C;AAAA,EAII;AAAA,EAEA;AAAA,OACG;AAUP,MAAM,wBAAwB;AAQ9B,MAAO,eAAyD;AAAA,EAW5D,YACqB,MACA,MACA,aAAyC,CAAC,GAC7D;AAHmB;AACA;AACA;AAEjB,SAAK,UAAU,eAAe,IAAI;AAAA,EACtC;AAAA,EALqB;AAAA,EACA;AAAA,EACA;AAAA,EAbrB,OAAwB,QAAqC,oBAAI,IAAI;AAAA,EAEpD;AAAA,EAEA,UAAgC,oBAAI,IAAI;AAAA,EAEjD;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcR,OAAc,IAAI,MAAc,YAA+C;AAC3E,QAAI,UAAU,KAAK,MAAM,IAAI,IAAI;AAEjC,QAAI,CAAC,SAAS;AACV,gBAAU,IAAI,eAAe,MAAM,IAAI,YAAY,MAAM,UAAU,GAAG,UAAU;AAEhF,WAAK,MAAM,IAAI,MAAM,OAAO;AAAA,IAChC;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,KAAK,MAA0C;AACxD,UAAM,KAAK,KAAK,QAAQ;AAExB,SAAK,OAAO;AAEZ,UAAM,YAAY,OAAO;AACzB,UAAM,UAAiC;AAAA,MACnC,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX;AAAA,MACA,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,IACf;AAEA,UAAM,iBAAiB,KAAK,WAAW,kBAAkB;AAEzD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,YAAM,UAAU,WAAW,MAAM;AAC7B,aAAK,QAAQ,OAAO,SAAS;AAE7B,YAAI,KAAK,WAAW,0BAA0B,KAAK,QAAQ,SAAS,GAAG;AACnE,eAAK,QAAQ;AAAA,QACjB;AAEA,eAAO,IAAI,MAAM,YAAY,KAAK,IAAI,cAAc,SAAS,cAAc,CAAC;AAAA,MAChF,GAAG,cAAc;AAEjB,WAAK,QAAQ,IAAI,WAAW,EAAC,SAAS,QAAQ,QAAO,CAAC;AAEtD,WAAK,KAAK,KAAK,OAAO;AAAA,IAC1B,CAAC;AAAA,EACL;AAAA,EAEO,MAAM,SAAiF;AAC1F,QAAI,KAAK,kBAAkB;AACvB,aAAO,KAAK;AAAA,IAChB;AAEA,UAAM,cAAc,KAAK,KAAK,UAAU,OAAO,SAAS,WAAW;AAC/D,UAAI,QAAQ,SAAS,2BAA2B;AAC5C;AAAA,MACJ;AAEA,UAAI;AACA,cAAM,UAAU,MAAM,QAAQ,EAAC,MAAM,QAAQ,MAAM,MAAM,QAAQ,QAAQ,CAAC,EAAC,GAAG,MAAM;AAEpF,aAAK,QAAQ,EAAC,WAAW,QAAQ,WAAW,IAAI,MAAM,QAAO,CAAC;AAAA,MAClE,SAAS,OAAO;AACZ,aAAK,QAAQ,EAAC,WAAW,QAAQ,WAAW,IAAI,OAAO,OAAO,eAAe,KAAK,EAAC,CAAC;AAAA,MACxF;AAAA,IACJ,CAAC;AAED,SAAK,mBAAmB;AAExB,WAAO;AAAA,EACX;AAAA,EAEO,UAAgB;AA5H3B;AA6HQ,eAAW,WAAW,KAAK,QAAQ,OAAO,GAAG;AACzC,mBAAa,QAAQ,OAAO;AAC5B,cAAQ,OAAO,IAAI,MAAM,YAAY,KAAK,IAAI,iBAAiB,CAAC;AAAA,IACpE;AAEA,SAAK,QAAQ,MAAM;AAEnB,eAAK,sBAAL;AACA,SAAK,oBAAoB;AAEzB,eAAK,qBAAL;AACA,SAAK,mBAAmB;AAExB,SAAK,KAAK,QAAQ;AAElB,mBAAe,MAAM,OAAO,KAAK,IAAI;AAAA,EACzC;AAAA,EAEQ,SAAe;AACnB,QAAI,KAAK,mBAAmB;AACxB;AAAA,IACJ;AAEA,SAAK,oBAAoB,KAAK,KAAK,UAAU,aAAW;AACpD,UAAI,QAAQ,SAAS,4BAA4B;AAC7C;AAAA,MACJ;AAEA,YAAM,UAAU,KAAK,QAAQ,IAAI,QAAQ,SAAS;AAElD,UAAI,CAAC,SAAS;AACV;AAAA,MACJ;AAEA,mBAAa,QAAQ,OAAO;AAC5B,WAAK,QAAQ,OAAO,QAAQ,SAAS;AAErC,UAAI,QAAQ,IAAI;AACZ,gBAAQ,QAAQ,QAAQ,OAAO;AAAA,MACnC,OAAO;AACH,gBAAQ,OAAO,aAAa,QAAQ,KAAK,CAAC;AAAA,MAC9C;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,QAAQ,UAA2E;AACvF,SAAK,KAAK,KAAK;AAAA,MACX,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,GAAG;AAAA,IACP,CAAC;AAAA,EACL;AACJ;","names":[]}
@@ -0,0 +1,7 @@
1
+ import { ProxySandbox, RegisterSandbox } from "./providers/index.js";
2
+ import type { DeepAsyncProxy } from "../types/helpers.js";
3
+ export { ProxySandbox, RegisterSandbox };
4
+ export interface SandboxRegistry {
5
+ }
6
+ export type SandboxName = Extract<keyof SandboxRegistry, string>;
7
+ export type SandboxProxyTarget<N extends keyof SandboxRegistry> = DeepAsyncProxy<SandboxRegistry[N]>;
@@ -0,0 +1,6 @@
1
+ import { ProxySandbox, RegisterSandbox } from "./providers/index.js";
2
+ export {
3
+ ProxySandbox,
4
+ RegisterSandbox
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sandbox/index.ts"],"sourcesContent":["import {ProxySandbox, RegisterSandbox} from \"./providers\";\n\nimport type {DeepAsyncProxy} from \"@typing/helpers\";\n\nexport {ProxySandbox, RegisterSandbox};\n\nexport interface SandboxRegistry {}\n\nexport type SandboxName = Extract<keyof SandboxRegistry, string>;\n\nexport type SandboxProxyTarget<N extends keyof SandboxRegistry> = DeepAsyncProxy<SandboxRegistry[N]>;\n"],"mappings":"AAAA,SAAQ,cAAc,uBAAsB;","names":[]}