adnbn 0.7.1 → 0.9.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 (135) hide show
  1. package/dist/cli/builders/locale/LocaleStructureValidator.js +7 -0
  2. package/dist/cli/builders/locale/LocaleStructureValidator.js.map +1 -1
  3. package/dist/cli/bundler/plugins/GenerateJsonPlugin.js +3 -7
  4. package/dist/cli/bundler/plugins/GenerateJsonPlugin.js.map +1 -1
  5. package/dist/cli/entrypoint/file/injectors/core.js +9 -1
  6. package/dist/cli/entrypoint/file/injectors/core.js.map +1 -1
  7. package/dist/cli/entrypoint/finder/AbstractAssetFinder.js +22 -11
  8. package/dist/cli/entrypoint/finder/AbstractAssetFinder.js.map +1 -1
  9. package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js +7 -0
  10. package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js.map +1 -1
  11. package/dist/cli/entrypoint/finder/AbstractFinder.d.ts +0 -2
  12. package/dist/cli/entrypoint/finder/AbstractFinder.js +5 -25
  13. package/dist/cli/entrypoint/finder/AbstractFinder.js.map +1 -1
  14. package/dist/cli/entrypoint/finder/AbstractViewFinder.js +3 -4
  15. package/dist/cli/entrypoint/finder/AbstractViewFinder.js.map +1 -1
  16. package/dist/cli/entrypoint/finder/AssetPluginFinder.js +14 -1
  17. package/dist/cli/entrypoint/finder/AssetPluginFinder.js.map +1 -1
  18. package/dist/cli/entrypoint/finder/LocaleFinder.d.ts +2 -0
  19. package/dist/cli/entrypoint/finder/LocaleFinder.js +27 -0
  20. package/dist/cli/entrypoint/finder/LocaleFinder.js.map +1 -1
  21. package/dist/cli/entrypoint/finder/PluginFinder.js +12 -3
  22. package/dist/cli/entrypoint/finder/PluginFinder.js.map +1 -1
  23. package/dist/cli/entrypoint/finder/ViewCspFinder.d.ts +2 -0
  24. package/dist/cli/entrypoint/finder/ViewCspFinder.js +13 -6
  25. package/dist/cli/entrypoint/finder/ViewCspFinder.js.map +1 -1
  26. package/dist/cli/entrypoint/finder/utils/filePrecedence.d.ts +35 -0
  27. package/dist/cli/entrypoint/finder/utils/filePrecedence.js +64 -0
  28. package/dist/cli/entrypoint/finder/utils/filePrecedence.js.map +1 -0
  29. package/dist/cli/entrypoint/parser/ContentParser.d.ts +2 -2
  30. package/dist/cli/entrypoint/parser/ContentParser.js.map +1 -1
  31. package/dist/cli/entrypoint/parser/RelayParser.js +2 -1
  32. package/dist/cli/entrypoint/parser/RelayParser.js.map +1 -1
  33. package/dist/cli/index.js +2 -0
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/plugins/content/ContentDriver.d.ts +21 -8
  36. package/dist/cli/plugins/content/ContentDriver.js +24 -2
  37. package/dist/cli/plugins/content/ContentDriver.js.map +1 -1
  38. package/dist/cli/plugins/content/ContentManager.d.ts +8 -3
  39. package/dist/cli/plugins/content/ContentManager.js +41 -6
  40. package/dist/cli/plugins/content/ContentManager.js.map +1 -1
  41. package/dist/cli/plugins/content/Relay.d.ts +6 -8
  42. package/dist/cli/plugins/content/Relay.js +2 -14
  43. package/dist/cli/plugins/content/Relay.js.map +1 -1
  44. package/dist/cli/plugins/content/RelayDeclaration.d.ts +0 -1
  45. package/dist/cli/plugins/content/RelayDeclaration.js +0 -3
  46. package/dist/cli/plugins/content/RelayDeclaration.js.map +1 -1
  47. package/dist/cli/plugins/content/RelayDriver.d.ts +10 -0
  48. package/dist/cli/plugins/content/RelayDriver.js +39 -0
  49. package/dist/cli/plugins/content/RelayDriver.js.map +1 -0
  50. package/dist/cli/plugins/content/index.js +1 -10
  51. package/dist/cli/plugins/content/index.js.map +1 -1
  52. package/dist/cli/plugins/content/types.d.ts +3 -0
  53. package/dist/cli/plugins/locale/Locale.js +5 -1
  54. package/dist/cli/plugins/locale/Locale.js.map +1 -1
  55. package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js +2 -3
  56. package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js.map +1 -1
  57. package/dist/cli/plugins/locale/declaration/locale.d.ts +3 -124
  58. package/dist/cli/virtual/index.js +2 -2
  59. package/dist/cli/virtual/virtual.d.ts +52 -147
  60. package/dist/entry/relay/index.d.ts +2 -1
  61. package/dist/entry/relay/index.js.map +1 -1
  62. package/dist/locale/adapters/react/LocaleProvider.js +2 -0
  63. package/dist/locale/adapters/react/LocaleProvider.js.map +1 -1
  64. package/dist/locale/adapters/react/context.d.ts +1 -0
  65. package/dist/locale/adapters/react/context.js +3 -2
  66. package/dist/locale/adapters/react/context.js.map +1 -1
  67. package/dist/locale/helpers.js.map +1 -1
  68. package/dist/locale/providers/AbstractLocale.d.ts +2 -0
  69. package/dist/locale/providers/AbstractLocale.js +5 -0
  70. package/dist/locale/providers/AbstractLocale.js.map +1 -1
  71. package/dist/locale/providers/NativeLocale.d.ts +3 -2
  72. package/dist/locale/providers/NativeLocale.js +1 -1
  73. package/dist/locale/providers/NativeLocale.js.map +1 -1
  74. package/dist/main/relay.d.ts +7 -6
  75. package/dist/main/relay.js +12 -5
  76. package/dist/main/relay.js.map +1 -1
  77. package/dist/message/error.d.ts +6 -0
  78. package/dist/message/error.js +21 -0
  79. package/dist/message/error.js.map +1 -1
  80. package/dist/message/index.d.ts +2 -1
  81. package/dist/message/index.js +2 -0
  82. package/dist/message/index.js.map +1 -1
  83. package/dist/message/providers/Message.d.ts +3 -0
  84. package/dist/message/providers/Message.js +36 -6
  85. package/dist/message/providers/Message.js.map +1 -1
  86. package/dist/offscreen/providers/ProxyOffscreen.d.ts +2 -2
  87. package/dist/offscreen/providers/ProxyOffscreen.js.map +1 -1
  88. package/dist/relay/RelayPermission.d.ts +6 -3
  89. package/dist/relay/RelayPermission.js +28 -12
  90. package/dist/relay/RelayPermission.js.map +1 -1
  91. package/dist/relay/adapters/RelayAdapter.d.ts +8 -0
  92. package/dist/relay/adapters/RelayAdapter.js +16 -0
  93. package/dist/relay/adapters/RelayAdapter.js.map +1 -0
  94. package/dist/relay/adapters/RelayMessagingAdapter.d.ts +11 -0
  95. package/dist/relay/adapters/RelayMessagingAdapter.js +91 -0
  96. package/dist/relay/adapters/RelayMessagingAdapter.js.map +1 -0
  97. package/dist/relay/adapters/RelayScriptingAdapter.d.ts +15 -0
  98. package/dist/relay/adapters/RelayScriptingAdapter.js +170 -0
  99. package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -0
  100. package/dist/relay/discovery/RelayDiscovery.d.ts +10 -0
  101. package/dist/relay/discovery/RelayDiscovery.js +62 -0
  102. package/dist/relay/discovery/RelayDiscovery.js.map +1 -0
  103. package/dist/relay/index.d.ts +1 -4
  104. package/dist/relay/index.js +1 -3
  105. package/dist/relay/index.js.map +1 -1
  106. package/dist/relay/providers/ProxyRelay.d.ts +20 -17
  107. package/dist/relay/providers/ProxyRelay.js +79 -52
  108. package/dist/relay/providers/ProxyRelay.js.map +1 -1
  109. package/dist/relay/providers/RegisterRelay.js +1 -2
  110. package/dist/relay/providers/RegisterRelay.js.map +1 -1
  111. package/dist/relay/result.d.ts +12 -0
  112. package/dist/relay/result.js +88 -0
  113. package/dist/relay/result.js.map +1 -0
  114. package/dist/sandbox/index.d.ts +2 -2
  115. package/dist/sandbox/index.js.map +1 -1
  116. package/dist/sandbox/providers/ProxySandbox.d.ts +2 -2
  117. package/dist/sandbox/providers/ProxySandbox.js.map +1 -1
  118. package/dist/service/providers/ProxyService.d.ts +2 -2
  119. package/dist/service/providers/ProxyService.js.map +1 -1
  120. package/dist/transport/ProxyTransport.d.ts +2 -2
  121. package/dist/transport/ProxyTransport.js.map +1 -1
  122. package/dist/transport/index.d.ts +3 -2
  123. package/dist/types/config.d.ts +8 -0
  124. package/dist/types/helpers.d.ts +0 -4
  125. package/dist/types/locale.d.ts +3 -0
  126. package/dist/types/locale.js +58 -0
  127. package/dist/types/locale.js.map +1 -1
  128. package/dist/types/relay.d.ts +130 -3
  129. package/dist/types/relay.js +16 -0
  130. package/dist/types/relay.js.map +1 -1
  131. package/dist/types/rpc.d.ts +4 -0
  132. package/dist/types/rpc.js +1 -0
  133. package/dist/types/rpc.js.map +1 -0
  134. package/dist/types/transport.d.ts +3 -2
  135. package/package.json +5 -4
@@ -0,0 +1,170 @@
1
+ import injectScriptFactory from "@addon-core/inject-script";
2
+ import { restoreError } from "./../../message/error.js";
3
+ import {
4
+ RelayAllFrames,
5
+ RelayFrameErrorKind,
6
+ RelayGlobalKey
7
+ } from "./../../types/relay.js";
8
+ import { fulfilledRelayFrame, injectScriptErrorKind, rejectedRelayFrame, sortRelayFrameResults } from "../result.js";
9
+ import RelayAdapter from "./RelayAdapter.js";
10
+ class RelayScriptingAdapter extends RelayAdapter {
11
+ _injectScript;
12
+ constructor(name, target) {
13
+ super(name, target);
14
+ }
15
+ get injectScript() {
16
+ return this._injectScript ?? (this._injectScript = injectScriptFactory(this.injectScriptOptions()));
17
+ }
18
+ async invoke(args, path) {
19
+ const func = (name, path2, args2, key, retryManager) => {
20
+ const serialize = (error) => {
21
+ if (error instanceof Error) {
22
+ return {
23
+ name: error.name,
24
+ message: error.message,
25
+ ...error.stack ? { stack: error.stack } : {}
26
+ };
27
+ }
28
+ if (typeof error === "object" && error !== null) {
29
+ const record = error;
30
+ return {
31
+ name: typeof record.name === "string" ? record.name : "Error",
32
+ message: typeof record.message === "string" ? record.message : (() => {
33
+ try {
34
+ return JSON.stringify(error) ?? String(error);
35
+ } catch {
36
+ return String(error);
37
+ }
38
+ })(),
39
+ ...typeof record.stack === "string" ? { stack: record.stack } : {}
40
+ };
41
+ }
42
+ return { name: "Error", message: String(error) };
43
+ };
44
+ const invoke = (manager2) => {
45
+ try {
46
+ return Promise.resolve(manager2.property(name, { path: path2, args: args2 })).then(
47
+ (result) => result === void 0 ? { ok: true, hasResult: false } : { ok: true, hasResult: true, result },
48
+ (error) => ({ ok: false, error: serialize(error) })
49
+ );
50
+ } catch (error) {
51
+ return Promise.resolve({ ok: false, error: serialize(error) });
52
+ }
53
+ };
54
+ const manager = globalThis[key];
55
+ if (manager) {
56
+ return invoke(manager);
57
+ }
58
+ if (!retryManager) {
59
+ return Promise.reject(new Error("Relay manager not found."));
60
+ }
61
+ return new Promise((resolve, reject) => {
62
+ const maxAttempts = 10;
63
+ const delay = 300;
64
+ let attempts = 0;
65
+ const findManager = () => {
66
+ const delayedManager = globalThis[key];
67
+ if (delayedManager) {
68
+ resolve(invoke(delayedManager));
69
+ return;
70
+ }
71
+ attempts++;
72
+ if (attempts >= maxAttempts) {
73
+ reject(new Error(`Relay manager not found after ${maxAttempts} attempts.`));
74
+ return;
75
+ }
76
+ setTimeout(findManager, delay);
77
+ };
78
+ findManager();
79
+ });
80
+ };
81
+ const scriptArgs = [
82
+ this.name,
83
+ path ?? null,
84
+ args,
85
+ RelayGlobalKey,
86
+ !this.isAnyFramesTarget()
87
+ ];
88
+ const outcomes = await this.injectScript.run(func, scriptArgs);
89
+ const results = this.normalize(outcomes);
90
+ if (this.isAnyFramesTarget()) {
91
+ const result = results.find((result2) => result2.status === "fulfilled") ?? results[0];
92
+ return result ? [
93
+ {
94
+ ...result,
95
+ target: { tabId: this.target.tabId, allFrames: RelayAllFrames.Any }
96
+ }
97
+ ] : [];
98
+ }
99
+ if (this.isBatchTarget(this.target)) {
100
+ return results;
101
+ }
102
+ return this.unwrap(results);
103
+ }
104
+ normalize(outcomes) {
105
+ return sortRelayFrameResults(
106
+ outcomes.map((outcome) => {
107
+ const target = this.resultTarget(outcome.target);
108
+ if (!outcome.success) {
109
+ return rejectedRelayFrame(target, outcome.error, injectScriptErrorKind(outcome.error.kind));
110
+ }
111
+ if (!outcome.value.ok) {
112
+ return rejectedRelayFrame(target, outcome.value.error, RelayFrameErrorKind.Remote);
113
+ }
114
+ return fulfilledRelayFrame(target, outcome.value.hasResult ? outcome.value.result : void 0);
115
+ })
116
+ );
117
+ }
118
+ resultTarget(target) {
119
+ if (target.allFrames === true) {
120
+ return {
121
+ tabId: target.tabId,
122
+ allFrames: this.target.allFrames === RelayAllFrames.All ? RelayAllFrames.All : RelayAllFrames.Any
123
+ };
124
+ }
125
+ return target;
126
+ }
127
+ unwrap(results) {
128
+ const result = results[0];
129
+ if (!result) {
130
+ throw new Error(`Relay "${this.name}" did not return a frame result.`);
131
+ }
132
+ if (result.status === "fulfilled") {
133
+ return result.result;
134
+ }
135
+ throw restoreError(result.error);
136
+ }
137
+ injectScriptOptions() {
138
+ let injectTarget;
139
+ if (this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any || this.target.allFrames === RelayAllFrames.All) {
140
+ injectTarget = { tabId: this.target.tabId, allFrames: true };
141
+ } else if (this.target.frameIds !== void 0) {
142
+ injectTarget = { tabId: this.target.tabId, frameIds: this.target.frameIds };
143
+ } else if (this.target.documentIds !== void 0) {
144
+ injectTarget = { tabId: this.target.tabId, documentIds: this.target.documentIds };
145
+ } else if (this.isFrameTarget(this.target)) {
146
+ injectTarget = { tabId: this.target.tabId, frameIds: [this.target.frameId] };
147
+ } else if (this.isDocumentTarget(this.target)) {
148
+ injectTarget = { tabId: this.target.tabId, documentIds: [this.target.documentId] };
149
+ } else {
150
+ injectTarget = { tabId: this.target.tabId };
151
+ }
152
+ return {
153
+ target: injectTarget,
154
+ ...this.target.timeoutMs === void 0 ? {} : { timeoutMs: this.target.timeoutMs }
155
+ };
156
+ }
157
+ isFrameTarget(target) {
158
+ return target.frameId !== void 0;
159
+ }
160
+ isDocumentTarget(target) {
161
+ return target.documentId !== void 0;
162
+ }
163
+ isAnyFramesTarget() {
164
+ return this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any;
165
+ }
166
+ }
167
+ export {
168
+ RelayScriptingAdapter as default
169
+ };
170
+ //# sourceMappingURL=RelayScriptingAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/relay/adapters/RelayScriptingAdapter.ts"],"sourcesContent":["import injectScriptFactory, {\n type InjectScriptContract,\n type InjectScriptOptions,\n type InjectScriptResult,\n type InjectScriptResultTarget,\n type InjectScriptTarget,\n type JsonValue,\n} from \"@addon-core/inject-script\";\n\nimport {restoreError} from \"@message/error\";\n\nimport type {MessageError} from \"@typing/message\";\nimport {\n RelayAllFrames,\n RelayFrameErrorKind,\n RelayGlobalKey,\n type RelayCallOptions,\n type RelayDocumentOptions,\n type RelayFrameOptions,\n type RelayFramesResult,\n type RelayResultTarget,\n type RelayScalarOptions,\n} from \"@typing/relay\";\n\nimport {fulfilledRelayFrame, injectScriptErrorKind, rejectedRelayFrame, sortRelayFrameResults} from \"../result\";\nimport RelayAdapter from \"./RelayAdapter\";\n\ntype RelayInvocationResult =\n | {\n ok: true;\n hasResult: false;\n }\n | {\n ok: true;\n hasResult: true;\n result: any;\n }\n | {\n ok: false;\n error: MessageError;\n };\n\nexport default class RelayScriptingAdapter extends RelayAdapter {\n private _injectScript?: InjectScriptContract;\n\n public constructor(name: string, target: RelayCallOptions) {\n super(name, target);\n }\n\n private get injectScript(): InjectScriptContract {\n return (this._injectScript ??= injectScriptFactory(this.injectScriptOptions()));\n }\n\n public async invoke(args: any[], path?: string): Promise<any> {\n const func = (\n name: string,\n path: string | null,\n args: JsonValue[],\n key: string,\n retryManager: boolean\n ): Promise<RelayInvocationResult> => {\n const serialize = (error: unknown): MessageError => {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack ? {stack: error.stack} : {}),\n };\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n\n return {\n name: typeof record.name === \"string\" ? record.name : \"Error\",\n message:\n typeof record.message === \"string\"\n ? record.message\n : (() => {\n try {\n return JSON.stringify(error) ?? String(error);\n } catch {\n return String(error);\n }\n })(),\n ...(typeof record.stack === \"string\" ? {stack: record.stack} : {}),\n };\n }\n\n return {name: \"Error\", message: String(error)};\n };\n\n const invoke = (manager: any): Promise<RelayInvocationResult> => {\n try {\n return Promise.resolve(manager.property(name, {path, args})).then(\n result =>\n result === undefined\n ? {ok: true as const, hasResult: false as const}\n : {ok: true as const, hasResult: true as const, result},\n error => ({ok: false as const, error: serialize(error)})\n );\n } catch (error) {\n return Promise.resolve({ok: false as const, error: serialize(error)});\n }\n };\n\n const manager = globalThis[key];\n\n if (manager) {\n // Keep the normal Scripting path synchronous until the remote method starts.\n return invoke(manager);\n }\n\n if (!retryManager) {\n return Promise.reject(new Error(\"Relay manager not found.\"));\n }\n\n return new Promise<RelayInvocationResult>((resolve, reject) => {\n const maxAttempts = 10;\n const delay = 300;\n let attempts = 0;\n\n const findManager = () => {\n const delayedManager = globalThis[key];\n\n if (delayedManager) {\n resolve(invoke(delayedManager));\n return;\n }\n\n attempts++;\n\n if (attempts >= maxAttempts) {\n reject(new Error(`Relay manager not found after ${maxAttempts} attempts.`));\n return;\n }\n\n setTimeout(findManager, delay);\n };\n\n findManager();\n });\n };\n\n const scriptArgs: [string, string | null, JsonValue[], string, boolean] = [\n this.name,\n path ?? null,\n args as JsonValue[],\n RelayGlobalKey,\n !this.isAnyFramesTarget(),\n ];\n const outcomes = await this.injectScript.run(func, scriptArgs);\n const results = this.normalize(outcomes);\n\n if (this.isAnyFramesTarget()) {\n const result = results.find(result => result.status === \"fulfilled\") ?? results[0];\n\n return result\n ? [\n {\n ...result,\n target: {tabId: this.target.tabId, allFrames: RelayAllFrames.Any},\n },\n ]\n : [];\n }\n\n if (this.isBatchTarget(this.target)) {\n return results;\n }\n\n return this.unwrap(results);\n }\n\n private normalize(outcomes: readonly InjectScriptResult<RelayInvocationResult>[]): RelayFramesResult<any> {\n return sortRelayFrameResults(\n outcomes.map(outcome => {\n const target = this.resultTarget(outcome.target);\n\n if (!outcome.success) {\n return rejectedRelayFrame(target, outcome.error, injectScriptErrorKind(outcome.error.kind));\n }\n\n if (!outcome.value.ok) {\n return rejectedRelayFrame(target, outcome.value.error, RelayFrameErrorKind.Remote);\n }\n\n return fulfilledRelayFrame(target, outcome.value.hasResult ? outcome.value.result : undefined);\n })\n );\n }\n\n private resultTarget(target: InjectScriptResultTarget): RelayResultTarget {\n if (target.allFrames === true) {\n return {\n tabId: target.tabId,\n allFrames: this.target.allFrames === RelayAllFrames.All ? RelayAllFrames.All : RelayAllFrames.Any,\n };\n }\n\n return target;\n }\n\n private unwrap(results: RelayFramesResult<any>): any {\n const result = results[0];\n\n if (!result) {\n throw new Error(`Relay \"${this.name}\" did not return a frame result.`);\n }\n\n if (result.status === \"fulfilled\") {\n return result.result;\n }\n\n throw restoreError(result.error);\n }\n\n private injectScriptOptions(): InjectScriptOptions {\n let injectTarget: InjectScriptTarget;\n\n if (\n this.target.allFrames === true ||\n this.target.allFrames === RelayAllFrames.Any ||\n this.target.allFrames === RelayAllFrames.All\n ) {\n injectTarget = {tabId: this.target.tabId, allFrames: true};\n } else if (this.target.frameIds !== undefined) {\n injectTarget = {tabId: this.target.tabId, frameIds: this.target.frameIds};\n } else if (this.target.documentIds !== undefined) {\n injectTarget = {tabId: this.target.tabId, documentIds: this.target.documentIds};\n } else if (this.isFrameTarget(this.target)) {\n injectTarget = {tabId: this.target.tabId, frameIds: [this.target.frameId]};\n } else if (this.isDocumentTarget(this.target)) {\n injectTarget = {tabId: this.target.tabId, documentIds: [this.target.documentId]};\n } else {\n injectTarget = {tabId: (this.target as RelayScalarOptions).tabId};\n }\n\n return {\n target: injectTarget,\n ...(this.target.timeoutMs === undefined ? {} : {timeoutMs: this.target.timeoutMs}),\n };\n }\n\n private isFrameTarget(target: RelayCallOptions): target is RelayFrameOptions {\n return target.frameId !== undefined;\n }\n\n private isDocumentTarget(target: RelayCallOptions): target is RelayDocumentOptions {\n return target.documentId !== undefined;\n }\n\n private isAnyFramesTarget(): boolean {\n return this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any;\n }\n}\n"],"mappings":"AAAA,OAAO,yBAOA;AAEP,SAAQ,oBAAmB;AAG3B;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAOG;AAEP,SAAQ,qBAAqB,uBAAuB,oBAAoB,6BAA4B;AACpG,OAAO,kBAAkB;AAiBzB,MAAO,8BAA4C,aAAa;AAAA,EACpD;AAAA,EAED,YAAY,MAAc,QAA0B;AACvD,UAAM,MAAM,MAAM;AAAA,EACtB;AAAA,EAEA,IAAY,eAAqC;AAC7C,WAAQ,KAAK,kBAAL,KAAK,gBAAkB,oBAAoB,KAAK,oBAAoB,CAAC;AAAA,EACjF;AAAA,EAEA,MAAa,OAAO,MAAa,MAA6B;AAC1D,UAAM,OAAO,CACT,MACAA,OACAC,OACA,KACA,iBACiC;AACjC,YAAM,YAAY,CAAC,UAAiC;AAChD,YAAI,iBAAiB,OAAO;AACxB,iBAAO;AAAA,YACH,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,YACf,GAAI,MAAM,QAAQ,EAAC,OAAO,MAAM,MAAK,IAAI,CAAC;AAAA,UAC9C;AAAA,QACJ;AAEA,YAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,gBAAM,SAAS;AAEf,iBAAO;AAAA,YACH,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,YACtD,SACI,OAAO,OAAO,YAAY,WACpB,OAAO,WACN,MAAM;AACH,kBAAI;AACA,uBAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAAA,cAChD,QAAQ;AACJ,uBAAO,OAAO,KAAK;AAAA,cACvB;AAAA,YACJ,GAAG;AAAA,YACb,GAAI,OAAO,OAAO,UAAU,WAAW,EAAC,OAAO,OAAO,MAAK,IAAI,CAAC;AAAA,UACpE;AAAA,QACJ;AAEA,eAAO,EAAC,MAAM,SAAS,SAAS,OAAO,KAAK,EAAC;AAAA,MACjD;AAEA,YAAM,SAAS,CAACC,aAAiD;AAC7D,YAAI;AACA,iBAAO,QAAQ,QAAQA,SAAQ,SAAS,MAAM,EAAC,MAAAF,OAAM,MAAAC,MAAI,CAAC,CAAC,EAAE;AAAA,YACzD,YACI,WAAW,SACL,EAAC,IAAI,MAAe,WAAW,MAAc,IAC7C,EAAC,IAAI,MAAe,WAAW,MAAe,OAAM;AAAA,YAC9D,YAAU,EAAC,IAAI,OAAgB,OAAO,UAAU,KAAK,EAAC;AAAA,UAC1D;AAAA,QACJ,SAAS,OAAO;AACZ,iBAAO,QAAQ,QAAQ,EAAC,IAAI,OAAgB,OAAO,UAAU,KAAK,EAAC,CAAC;AAAA,QACxE;AAAA,MACJ;AAEA,YAAM,UAAU,WAAW,GAAG;AAE9B,UAAI,SAAS;AAET,eAAO,OAAO,OAAO;AAAA,MACzB;AAEA,UAAI,CAAC,cAAc;AACf,eAAO,QAAQ,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAAA,MAC/D;AAEA,aAAO,IAAI,QAA+B,CAAC,SAAS,WAAW;AAC3D,cAAM,cAAc;AACpB,cAAM,QAAQ;AACd,YAAI,WAAW;AAEf,cAAM,cAAc,MAAM;AACtB,gBAAM,iBAAiB,WAAW,GAAG;AAErC,cAAI,gBAAgB;AAChB,oBAAQ,OAAO,cAAc,CAAC;AAC9B;AAAA,UACJ;AAEA;AAEA,cAAI,YAAY,aAAa;AACzB,mBAAO,IAAI,MAAM,iCAAiC,WAAW,YAAY,CAAC;AAC1E;AAAA,UACJ;AAEA,qBAAW,aAAa,KAAK;AAAA,QACjC;AAEA,oBAAY;AAAA,MAChB,CAAC;AAAA,IACL;AAEA,UAAM,aAAoE;AAAA,MACtE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,CAAC,KAAK,kBAAkB;AAAA,IAC5B;AACA,UAAM,WAAW,MAAM,KAAK,aAAa,IAAI,MAAM,UAAU;AAC7D,UAAM,UAAU,KAAK,UAAU,QAAQ;AAEvC,QAAI,KAAK,kBAAkB,GAAG;AAC1B,YAAM,SAAS,QAAQ,KAAK,CAAAE,YAAUA,QAAO,WAAW,WAAW,KAAK,QAAQ,CAAC;AAEjF,aAAO,SACD;AAAA,QACI;AAAA,UACI,GAAG;AAAA,UACH,QAAQ,EAAC,OAAO,KAAK,OAAO,OAAO,WAAW,eAAe,IAAG;AAAA,QACpE;AAAA,MACJ,IACA,CAAC;AAAA,IACX;AAEA,QAAI,KAAK,cAAc,KAAK,MAAM,GAAG;AACjC,aAAO;AAAA,IACX;AAEA,WAAO,KAAK,OAAO,OAAO;AAAA,EAC9B;AAAA,EAEQ,UAAU,UAAwF;AACtG,WAAO;AAAA,MACH,SAAS,IAAI,aAAW;AACpB,cAAM,SAAS,KAAK,aAAa,QAAQ,MAAM;AAE/C,YAAI,CAAC,QAAQ,SAAS;AAClB,iBAAO,mBAAmB,QAAQ,QAAQ,OAAO,sBAAsB,QAAQ,MAAM,IAAI,CAAC;AAAA,QAC9F;AAEA,YAAI,CAAC,QAAQ,MAAM,IAAI;AACnB,iBAAO,mBAAmB,QAAQ,QAAQ,MAAM,OAAO,oBAAoB,MAAM;AAAA,QACrF;AAEA,eAAO,oBAAoB,QAAQ,QAAQ,MAAM,YAAY,QAAQ,MAAM,SAAS,MAAS;AAAA,MACjG,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,aAAa,QAAqD;AACtE,QAAI,OAAO,cAAc,MAAM;AAC3B,aAAO;AAAA,QACH,OAAO,OAAO;AAAA,QACd,WAAW,KAAK,OAAO,cAAc,eAAe,MAAM,eAAe,MAAM,eAAe;AAAA,MAClG;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,OAAO,SAAsC;AACjD,UAAM,SAAS,QAAQ,CAAC;AAExB,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,UAAU,KAAK,IAAI,kCAAkC;AAAA,IACzE;AAEA,QAAI,OAAO,WAAW,aAAa;AAC/B,aAAO,OAAO;AAAA,IAClB;AAEA,UAAM,aAAa,OAAO,KAAK;AAAA,EACnC;AAAA,EAEQ,sBAA2C;AAC/C,QAAI;AAEJ,QACI,KAAK,OAAO,cAAc,QAC1B,KAAK,OAAO,cAAc,eAAe,OACzC,KAAK,OAAO,cAAc,eAAe,KAC3C;AACE,qBAAe,EAAC,OAAO,KAAK,OAAO,OAAO,WAAW,KAAI;AAAA,IAC7D,WAAW,KAAK,OAAO,aAAa,QAAW;AAC3C,qBAAe,EAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,OAAO,SAAQ;AAAA,IAC5E,WAAW,KAAK,OAAO,gBAAgB,QAAW;AAC9C,qBAAe,EAAC,OAAO,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,YAAW;AAAA,IAClF,WAAW,KAAK,cAAc,KAAK,MAAM,GAAG;AACxC,qBAAe,EAAC,OAAO,KAAK,OAAO,OAAO,UAAU,CAAC,KAAK,OAAO,OAAO,EAAC;AAAA,IAC7E,WAAW,KAAK,iBAAiB,KAAK,MAAM,GAAG;AAC3C,qBAAe,EAAC,OAAO,KAAK,OAAO,OAAO,aAAa,CAAC,KAAK,OAAO,UAAU,EAAC;AAAA,IACnF,OAAO;AACH,qBAAe,EAAC,OAAQ,KAAK,OAA8B,MAAK;AAAA,IACpE;AAEA,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,GAAI,KAAK,OAAO,cAAc,SAAY,CAAC,IAAI,EAAC,WAAW,KAAK,OAAO,UAAS;AAAA,IACpF;AAAA,EACJ;AAAA,EAEQ,cAAc,QAAuD;AACzE,WAAO,OAAO,YAAY;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,QAA0D;AAC/E,WAAO,OAAO,eAAe;AAAA,EACjC;AAAA,EAEQ,oBAA6B;AACjC,WAAO,KAAK,OAAO,cAAc,QAAQ,KAAK,OAAO,cAAc,eAAe;AAAA,EACtF;AACJ;","names":["path","args","manager","result"]}
@@ -0,0 +1,10 @@
1
+ import type { RelayAddressTarget } from "../../types/relay.js";
2
+ export declare class RelayDiscoveryError extends Error {
3
+ constructor(message: string, cause?: unknown);
4
+ }
5
+ /** Enumerates frame addresses for strict Messaging All calls, without checking whether Relay is registered. */
6
+ export default class RelayDiscovery {
7
+ discover(tabId: number): Promise<RelayAddressTarget[]>;
8
+ private assertSupported;
9
+ private normalize;
10
+ }
@@ -0,0 +1,62 @@
1
+ import { getAllFrames, getManifest } from "@addon-core/browser";
2
+ class RelayDiscoveryError extends Error {
3
+ constructor(message, cause) {
4
+ super(message, cause === void 0 ? void 0 : { cause });
5
+ this.name = "RelayDiscoveryError";
6
+ }
7
+ }
8
+ class RelayDiscovery {
9
+ async discover(tabId) {
10
+ this.assertSupported();
11
+ try {
12
+ const frames = await getAllFrames(tabId);
13
+ return this.normalize(
14
+ frames.map((frame) => ({
15
+ tabId,
16
+ frameId: frame.frameId,
17
+ ...frame.documentId ? { documentId: frame.documentId } : {}
18
+ }))
19
+ );
20
+ } catch (error) {
21
+ throw new RelayDiscoveryError(
22
+ `Relay failed to discover frames in tab ${tabId} through webNavigation.getAllFrames().`,
23
+ error
24
+ );
25
+ }
26
+ }
27
+ assertSupported() {
28
+ let permissions;
29
+ try {
30
+ permissions = getManifest().permissions ?? [];
31
+ } catch (error) {
32
+ throw new RelayDiscoveryError(
33
+ 'Relay could not verify the "webNavigation" permission required for Messaging "allFrames".',
34
+ error
35
+ );
36
+ }
37
+ if (!permissions.includes("webNavigation")) {
38
+ throw new RelayDiscoveryError(
39
+ 'Messaging Relay with RelayAllFrames.All requires the "webNavigation" permission. Configure the Relay entrypoint with allFrames: RelayAllFrames.All so the framework can declare it automatically, or use RelayAllFrames.Any, "frameIds" or "documentIds".'
40
+ );
41
+ }
42
+ }
43
+ normalize(targets) {
44
+ const unique = /* @__PURE__ */ new Map();
45
+ for (const target of targets) {
46
+ const key = target.frameId === void 0 ? `${target.tabId}:document:${target.documentId}` : `${target.tabId}:frame:${target.frameId}`;
47
+ unique.set(key, target);
48
+ }
49
+ return [...unique.values()].sort((a, b) => {
50
+ const frameDifference = (a.frameId ?? Number.MAX_SAFE_INTEGER) - (b.frameId ?? Number.MAX_SAFE_INTEGER);
51
+ if (frameDifference !== 0) {
52
+ return frameDifference;
53
+ }
54
+ return (a.documentId ?? "").localeCompare(b.documentId ?? "");
55
+ });
56
+ }
57
+ }
58
+ export {
59
+ RelayDiscoveryError,
60
+ RelayDiscovery as default
61
+ };
62
+ //# sourceMappingURL=RelayDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/relay/discovery/RelayDiscovery.ts"],"sourcesContent":["import {getAllFrames, getManifest} from \"@addon-core/browser\";\n\nimport type {RelayAddressTarget} from \"@typing/relay\";\n\nexport class RelayDiscoveryError extends Error {\n public constructor(message: string, cause?: unknown) {\n super(message, cause === undefined ? undefined : {cause});\n this.name = \"RelayDiscoveryError\";\n }\n}\n\n/** Enumerates frame addresses for strict Messaging All calls, without checking whether Relay is registered. */\nexport default class RelayDiscovery {\n public async discover(tabId: number): Promise<RelayAddressTarget[]> {\n this.assertSupported();\n\n try {\n const frames = await getAllFrames(tabId);\n\n return this.normalize(\n frames.map(frame => ({\n tabId,\n frameId: frame.frameId,\n ...(frame.documentId ? {documentId: frame.documentId} : {}),\n }))\n );\n } catch (error) {\n throw new RelayDiscoveryError(\n `Relay failed to discover frames in tab ${tabId} through webNavigation.getAllFrames().`,\n error\n );\n }\n }\n\n private assertSupported(): void {\n let permissions: string[];\n\n try {\n permissions = getManifest().permissions ?? [];\n } catch (error) {\n throw new RelayDiscoveryError(\n 'Relay could not verify the \"webNavigation\" permission required for Messaging \"allFrames\".',\n error\n );\n }\n\n if (!permissions.includes(\"webNavigation\")) {\n throw new RelayDiscoveryError(\n 'Messaging Relay with RelayAllFrames.All requires the \"webNavigation\" permission. Configure the Relay entrypoint with allFrames: RelayAllFrames.All so the framework can declare it automatically, or use RelayAllFrames.Any, \"frameIds\" or \"documentIds\".'\n );\n }\n }\n\n private normalize(targets: RelayAddressTarget[]): RelayAddressTarget[] {\n const unique = new Map<string, RelayAddressTarget>();\n\n for (const target of targets) {\n const key =\n target.frameId === undefined\n ? `${target.tabId}:document:${target.documentId}`\n : `${target.tabId}:frame:${target.frameId}`;\n\n unique.set(key, target);\n }\n\n return [...unique.values()].sort((a, b) => {\n const frameDifference = (a.frameId ?? Number.MAX_SAFE_INTEGER) - (b.frameId ?? Number.MAX_SAFE_INTEGER);\n\n if (frameDifference !== 0) {\n return frameDifference;\n }\n\n return (a.documentId ?? \"\").localeCompare(b.documentId ?? \"\");\n });\n }\n}\n"],"mappings":"AAAA,SAAQ,cAAc,mBAAkB;AAIjC,MAAM,4BAA4B,MAAM;AAAA,EACpC,YAAY,SAAiB,OAAiB;AACjD,UAAM,SAAS,UAAU,SAAY,SAAY,EAAC,MAAK,CAAC;AACxD,SAAK,OAAO;AAAA,EAChB;AACJ;AAGA,MAAO,eAA6B;AAAA,EAChC,MAAa,SAAS,OAA8C;AAChE,SAAK,gBAAgB;AAErB,QAAI;AACA,YAAM,SAAS,MAAM,aAAa,KAAK;AAEvC,aAAO,KAAK;AAAA,QACR,OAAO,IAAI,YAAU;AAAA,UACjB;AAAA,UACA,SAAS,MAAM;AAAA,UACf,GAAI,MAAM,aAAa,EAAC,YAAY,MAAM,WAAU,IAAI,CAAC;AAAA,QAC7D,EAAE;AAAA,MACN;AAAA,IACJ,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,0CAA0C,KAAK;AAAA,QAC/C;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,kBAAwB;AAC5B,QAAI;AAEJ,QAAI;AACA,oBAAc,YAAY,EAAE,eAAe,CAAC;AAAA,IAChD,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,CAAC,YAAY,SAAS,eAAe,GAAG;AACxC,YAAM,IAAI;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,UAAU,SAAqD;AACnE,UAAM,SAAS,oBAAI,IAAgC;AAEnD,eAAW,UAAU,SAAS;AAC1B,YAAM,MACF,OAAO,YAAY,SACb,GAAG,OAAO,KAAK,aAAa,OAAO,UAAU,KAC7C,GAAG,OAAO,KAAK,UAAU,OAAO,OAAO;AAEjD,aAAO,IAAI,KAAK,MAAM;AAAA,IAC1B;AAEA,WAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AACvC,YAAM,mBAAmB,EAAE,WAAW,OAAO,qBAAqB,EAAE,WAAW,OAAO;AAEtF,UAAI,oBAAoB,GAAG;AACvB,eAAO;AAAA,MACX;AAEA,cAAQ,EAAE,cAAc,IAAI,cAAc,EAAE,cAAc,EAAE;AAAA,IAChE,CAAC;AAAA,EACL;AACJ;","names":[]}
@@ -1,9 +1,6 @@
1
- import { ProxyRelay, RegisterRelay, type ProxyRelayParams } from "./providers/index.js";
2
- import type { TransportProxyTarget, TransportTarget } from "../transport/index.js";
3
- export { type ProxyRelayParams, ProxyRelay, RegisterRelay };
1
+ import type { TransportTarget } from "../types/transport.js";
4
2
  export interface RelayRegistry {
5
3
  }
6
4
  export type RelayName = Extract<keyof RelayRegistry, string>;
7
5
  export type RelayTarget<N extends keyof RelayRegistry> = TransportTarget<RelayRegistry, N>;
8
- export type RelayProxyTarget<N extends keyof RelayRegistry> = TransportProxyTarget<RelayRegistry, N>;
9
6
  export declare const getRelay: <N extends RelayName>(name: N) => RelayTarget<N>;
@@ -1,10 +1,8 @@
1
- import { ProxyRelay, RegisterRelay, Relay } from "./providers/index.js";
1
+ import Relay from "./providers/Relay.js";
2
2
  const getRelay = (name) => {
3
3
  return new Relay(name).get();
4
4
  };
5
5
  export {
6
- ProxyRelay,
7
- RegisterRelay,
8
6
  getRelay
9
7
  };
10
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"sources":["../../src/relay/index.ts"],"sourcesContent":["import Relay from \"./providers/Relay\";\n\nimport type {TransportTarget} from \"@typing/transport\";\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 const getRelay = <N extends RelayName>(name: N): RelayTarget<N> => {\n return new Relay<N>(name).get();\n};\n"],"mappings":"AAAA,OAAO,WAAW;AAUX,MAAM,WAAW,CAAsB,SAA4B;AACtE,SAAO,IAAI,MAAS,IAAI,EAAE,IAAI;AAClC;","names":[]}
@@ -1,23 +1,26 @@
1
- import { type InjectScriptOptions } from "@addon-core/inject-script";
2
1
  import ProxyTransport from "../../transport/ProxyTransport.js";
3
2
  import RelayPermission from "../RelayPermission.js";
4
- import { RelayOptions } from "../../types/relay.js";
5
- import { DeepAsyncProxy } from "../../types/helpers.js";
6
- import { TransportDictionary, TransportManager, TransportName } from "../../types/transport.js";
7
- export type ProxyRelayParams = number | (Omit<InjectScriptOptions, "frameId" | "documentId" | "timeFallback"> & {
8
- frameId?: number;
9
- documentId?: string;
10
- });
11
- export default class ProxyRelay<N extends TransportName, T = DeepAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
12
- protected options: RelayOptions;
13
- protected params: ProxyRelayParams;
14
- private injectScript;
15
- private message;
16
- constructor(name: N, options: RelayOptions, params: ProxyRelayParams);
3
+ import type { RpcAsyncProxy } from "../../types/rpc.js";
4
+ import { type RelayCallOptions, type RelayOptions } from "../../types/relay.js";
5
+ import type { TransportDictionary, TransportManager, TransportName } from "../../types/transport.js";
6
+ export type ProxyRelayParams = number | RelayCallOptions;
7
+ export default class ProxyRelay<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
8
+ protected readonly options: RelayOptions;
9
+ private readonly params;
10
+ private readonly permission;
11
+ private static readonly SelectorKeys;
12
+ private _adapter?;
13
+ private _target?;
14
+ constructor(name: N, options: RelayOptions, params: ProxyRelayParams, permission: RelayPermission);
15
+ private get adapter();
16
+ private get target();
17
17
  protected manager(): TransportManager;
18
- protected permission(): RelayPermission;
19
18
  protected apply(args: any[], path?: string): Promise<any>;
20
- private scriptingApply;
21
- private messagingApply;
19
+ private validateTabId;
20
+ private validateFrameId;
21
+ private validateDocumentId;
22
+ private validateTimeout;
23
+ private validateArray;
24
+ private invalid;
22
25
  get(): T;
23
26
  }
@@ -1,76 +1,102 @@
1
- import injectScriptFactory from "@addon-core/inject-script";
2
1
  import ProxyTransport from "./../../transport/ProxyTransport.js";
2
+ import RelayMessagingAdapter from "../adapters/RelayMessagingAdapter.js";
3
+ import RelayScriptingAdapter from "../adapters/RelayScriptingAdapter.js";
3
4
  import RelayManager from "../RelayManager.js";
4
- import RelayMessage from "../RelayMessage.js";
5
- import RelayPermission from "../RelayPermission.js";
6
5
  import { isRelayContext } from "../utils.js";
7
- import { RelayGlobalKey, RelayMethod } from "./../../types/relay.js";
6
+ import { RelayAllFrames, RelayMethod } from "./../../types/relay.js";
8
7
  class ProxyRelay extends ProxyTransport {
9
- constructor(name, options, params) {
8
+ constructor(name, options, params, permission) {
10
9
  super(name);
11
10
  this.options = options;
12
11
  this.params = params;
13
- this.message = new RelayMessage(name);
14
- this.injectScript = injectScriptFactory({
15
- ...typeof params === "number" ? { tabId: params } : params,
16
- timeFallback: 4e3
17
- });
12
+ this.permission = permission;
18
13
  }
19
14
  options;
20
15
  params;
21
- injectScript;
22
- message;
16
+ permission;
17
+ static SelectorKeys = ["allFrames", "frameId", "frameIds", "documentId", "documentIds"];
18
+ _adapter;
19
+ _target;
20
+ get adapter() {
21
+ return this._adapter ?? (this._adapter = this.options.method === RelayMethod.Scripting ? new RelayScriptingAdapter(this.name, this.target) : new RelayMessagingAdapter(this.name, this.target));
22
+ }
23
+ get target() {
24
+ if (this._target) {
25
+ return this._target;
26
+ }
27
+ const target = typeof this.params === "number" ? { tabId: this.params } : { ...this.params };
28
+ this.validateTabId(target.tabId);
29
+ this.validateTimeout(target.timeoutMs);
30
+ const selected = ProxyRelay.SelectorKeys.filter((key) => target[key] !== void 0);
31
+ if (selected.length > 1) {
32
+ this.invalid(`selectors are mutually exclusive; received ${selected.map((key) => `"${key}"`).join(", ")}.`);
33
+ }
34
+ if (target.allFrames !== void 0 && target.allFrames !== false && target.allFrames !== true && target.allFrames !== RelayAllFrames.Any && target.allFrames !== RelayAllFrames.All) {
35
+ this.invalid('"allFrames" accepts only false, true, RelayAllFrames.Any or RelayAllFrames.All.');
36
+ }
37
+ if (target.frameId !== void 0) {
38
+ this.validateFrameId(target.frameId);
39
+ }
40
+ if (target.frameIds !== void 0) {
41
+ this.validateArray(target.frameIds, "frameIds", (item, property) => this.validateFrameId(item, property));
42
+ }
43
+ if (target.documentId !== void 0) {
44
+ this.validateDocumentId(target.documentId);
45
+ }
46
+ if (target.documentIds !== void 0) {
47
+ this.validateArray(
48
+ target.documentIds,
49
+ "documentIds",
50
+ (item, property) => this.validateDocumentId(item, property)
51
+ );
52
+ }
53
+ return this._target = target;
54
+ }
23
55
  manager() {
24
56
  return RelayManager.getInstance();
25
57
  }
26
- permission() {
27
- return RelayPermission.getInstance();
28
- }
29
58
  async apply(args, path) {
30
- if (!this.permission().allow(this.name)) {
31
- if (!await this.permission().request(this.name)) {
59
+ if (!this.permission.allow(this.name)) {
60
+ if (!await this.permission.request(this.name)) {
32
61
  throw new Error(
33
62
  `ProxyRelay: User denied required permissions for relay "${this.name}" at path "${path}". Cannot proceed with the operation.`
34
63
  );
35
64
  }
36
65
  }
37
- return this.options.method === RelayMethod.Scripting ? this.scriptingApply(args, path) : this.messagingApply(args, path);
66
+ return this.adapter.invoke(args, path);
38
67
  }
39
- async scriptingApply(args, path) {
40
- var _a;
41
- const func = async (name, path2, args2, key) => {
42
- try {
43
- const awaitManager = async (maxAttempts = 10, delay = 300) => {
44
- for (let count = 0; count < maxAttempts; count++) {
45
- const manager2 = globalThis[key];
46
- if (manager2) return manager2;
47
- await new Promise((resolve) => setTimeout(resolve, delay));
48
- }
49
- throw new Error(`Relay manager not found after ${maxAttempts} attempts.`);
50
- };
51
- const manager = await awaitManager();
52
- return await manager.property(name, { path: path2, args: args2 });
53
- } catch (e) {
54
- console.error(
55
- `ProxyRelay.scriptingApply(): failed to access relay "${name}" at path "${path2}" via injected script; manager with key "${key}" is unavailable or property not found. URL: ${document.location.href}`,
56
- e
57
- );
58
- throw e;
59
- }
60
- };
61
- const result = await this.injectScript.run(func, [this.name, path, args, RelayGlobalKey]);
62
- return (_a = result == null ? void 0 : result[0]) == null ? void 0 : _a.result;
68
+ validateTabId(tabId) {
69
+ if (!Number.isInteger(tabId) || tabId < 0) {
70
+ this.invalid('"tabId" must be a non-negative integer.');
71
+ }
72
+ }
73
+ validateFrameId(frameId, property = "frameId") {
74
+ if (!Number.isInteger(frameId) || frameId < 0) {
75
+ this.invalid(`"${property}" must contain only non-negative integers.`);
76
+ }
77
+ }
78
+ validateDocumentId(documentId, property = "documentId") {
79
+ if (typeof documentId !== "string" || documentId.trim() === "") {
80
+ this.invalid(`"${property}" must contain only non-empty strings.`);
81
+ }
82
+ }
83
+ validateTimeout(timeoutMs) {
84
+ if (timeoutMs !== void 0 && (!Number.isFinite(timeoutMs) || timeoutMs <= 0)) {
85
+ this.invalid('"timeoutMs" must be greater than zero.');
86
+ }
87
+ }
88
+ validateArray(value, property, validate) {
89
+ if (!Array.isArray(value) || value.length === 0) {
90
+ this.invalid(`"${property}" must be a non-empty array.`);
91
+ }
92
+ const items = value;
93
+ items.forEach((item) => validate(item, property));
94
+ if (new Set(items).size !== items.length) {
95
+ this.invalid(`"${property}" must not contain duplicate values.`);
96
+ }
63
97
  }
64
- async messagingApply(args, path) {
65
- const options = typeof this.params === "number" ? {
66
- tabId: this.params,
67
- frameId: 0
68
- } : {
69
- tabId: this.params.tabId,
70
- frameId: this.params.frameId || 0,
71
- documentId: this.params.documentId
72
- };
73
- return this.message.send({ path, args }, options);
98
+ invalid(message) {
99
+ throw new TypeError(`Invalid Relay target: ${message}`);
74
100
  }
75
101
  get() {
76
102
  if (isRelayContext()) {
@@ -78,6 +104,7 @@ class ProxyRelay extends ProxyTransport {
78
104
  `You are trying to get proxy relay "${this.name}" from script content. You can get original relay instead`
79
105
  );
80
106
  }
107
+ void this.target;
81
108
  return super.get();
82
109
  }
83
110
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/relay/providers/ProxyRelay.ts"],"sourcesContent":["import injectScriptFactory, {type InjectScriptContract, type InjectScriptOptions} from \"@addon-core/inject-script\";\n\nimport ProxyTransport from \"@transport/ProxyTransport\";\n\nimport RelayManager from \"../RelayManager\";\nimport RelayMessage from \"../RelayMessage\";\nimport RelayPermission from \"../RelayPermission\";\n\nimport {isRelayContext} from \"../utils\";\n\nimport {RelayGlobalKey, RelayMethod, RelayOptions} from \"@typing/relay\";\nimport {DeepAsyncProxy} from \"@typing/helpers\";\nimport {MessageSendOptions} from \"@typing/message\";\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\n\nexport type ProxyRelayParams =\n | number\n | (Omit<InjectScriptOptions, \"frameId\" | \"documentId\" | \"timeFallback\"> & {\n frameId?: number;\n documentId?: string;\n });\n\nexport default class ProxyRelay<\n N extends TransportName,\n T = DeepAsyncProxy<TransportDictionary[N]>,\n> extends ProxyTransport<N, T> {\n private injectScript: InjectScriptContract;\n private message: TransportMessage;\n\n constructor(\n name: N,\n protected options: RelayOptions,\n protected params: ProxyRelayParams\n ) {\n super(name);\n\n this.message = new RelayMessage(name);\n\n this.injectScript = injectScriptFactory({\n ...(typeof params === \"number\" ? {tabId: params} : params),\n timeFallback: 4000,\n });\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n protected permission(): RelayPermission {\n return RelayPermission.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n if (!this.permission().allow(this.name)) {\n if (!(await this.permission().request(this.name))) {\n throw new Error(\n `ProxyRelay: User denied required permissions for relay \"${this.name}\" at path \"${path}\". Cannot proceed with the operation.`\n );\n }\n }\n\n return this.options.method === RelayMethod.Scripting\n ? this.scriptingApply(args, path)\n : this.messagingApply(args, path);\n }\n\n private async scriptingApply(args: any[], path?: string): Promise<any> {\n const func = async (name: string, path: string, args: any[], key: string) => {\n try {\n const awaitManager = async (maxAttempts = 10, delay = 300): Promise<RelayManager> => {\n for (let count = 0; count < maxAttempts; count++) {\n const manager = globalThis[key];\n\n if (manager) return manager;\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n\n throw new Error(`Relay manager not found after ${maxAttempts} attempts.`);\n };\n\n const manager: RelayManager = await awaitManager();\n\n return await manager.property(name, {path, args});\n } catch (e) {\n console.error(\n `ProxyRelay.scriptingApply(): failed to access relay \"${name}\" at path \"${path}\" via injected script; manager with key \"${key}\" is unavailable or property not found. URL: ${document.location.href}`,\n e\n );\n\n throw e;\n }\n };\n\n const result = await this.injectScript.run(func, [this.name, path!, args, RelayGlobalKey]);\n\n return result?.[0]?.result;\n }\n\n private async messagingApply(args: any[], path?: string): Promise<any> {\n const options: MessageSendOptions =\n typeof this.params === \"number\"\n ? {\n tabId: this.params,\n frameId: 0,\n }\n : {\n tabId: this.params.tabId,\n frameId: this.params.frameId || 0,\n documentId: this.params.documentId,\n };\n\n return this.message.send({path, args}, options);\n }\n\n public get(): T {\n if (isRelayContext()) {\n throw new Error(\n `You are trying to get proxy relay \"${this.name}\" from script content. You can get original relay instead`\n );\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,OAAO,yBAAgF;AAEvF,OAAO,oBAAoB;AAE3B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,OAAO,qBAAqB;AAE5B,SAAQ,sBAAqB;AAE7B,SAAQ,gBAAgB,mBAAgC;AAYxD,MAAO,mBAGG,eAAqB;AAAA,EAI3B,YACI,MACU,SACA,QACZ;AACE,UAAM,IAAI;AAHA;AACA;AAIV,SAAK,UAAU,IAAI,aAAa,IAAI;AAEpC,SAAK,eAAe,oBAAoB;AAAA,MACpC,GAAI,OAAO,WAAW,WAAW,EAAC,OAAO,OAAM,IAAI;AAAA,MACnD,cAAc;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EAXc;AAAA,EACA;AAAA,EANN;AAAA,EACA;AAAA,EAiBE,UAA4B;AAClC,WAAO,aAAa,YAAY;AAAA,EACpC;AAAA,EAEU,aAA8B;AACpC,WAAO,gBAAgB,YAAY;AAAA,EACvC;AAAA,EAEA,MAAgB,MAAM,MAAa,MAA6B;AAC5D,QAAI,CAAC,KAAK,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG;AACrC,UAAI,CAAE,MAAM,KAAK,WAAW,EAAE,QAAQ,KAAK,IAAI,GAAI;AAC/C,cAAM,IAAI;AAAA,UACN,2DAA2D,KAAK,IAAI,cAAc,IAAI;AAAA,QAC1F;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,KAAK,QAAQ,WAAW,YAAY,YACrC,KAAK,eAAe,MAAM,IAAI,IAC9B,KAAK,eAAe,MAAM,IAAI;AAAA,EACxC;AAAA,EAEA,MAAc,eAAe,MAAa,MAA6B;AAlE3E;AAmEQ,UAAM,OAAO,OAAO,MAAcA,OAAcC,OAAa,QAAgB;AACzE,UAAI;AACA,cAAM,eAAe,OAAO,cAAc,IAAI,QAAQ,QAA+B;AACjF,mBAAS,QAAQ,GAAG,QAAQ,aAAa,SAAS;AAC9C,kBAAMC,WAAU,WAAW,GAAG;AAE9B,gBAAIA,SAAS,QAAOA;AAEpB,kBAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,KAAK,CAAC;AAAA,UAC3D;AAEA,gBAAM,IAAI,MAAM,iCAAiC,WAAW,YAAY;AAAA,QAC5E;AAEA,cAAM,UAAwB,MAAM,aAAa;AAEjD,eAAO,MAAM,QAAQ,SAAS,MAAM,EAAC,MAAAF,OAAM,MAAAC,MAAI,CAAC;AAAA,MACpD,SAAS,GAAG;AACR,gBAAQ;AAAA,UACJ,wDAAwD,IAAI,cAAcD,KAAI,4CAA4C,GAAG,gDAAgD,SAAS,SAAS,IAAI;AAAA,UACnM;AAAA,QACJ;AAEA,cAAM;AAAA,MACV;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,KAAK,MAAM,MAAO,MAAM,cAAc,CAAC;AAEzF,YAAO,sCAAS,OAAT,mBAAa;AAAA,EACxB;AAAA,EAEA,MAAc,eAAe,MAAa,MAA6B;AACnE,UAAM,UACF,OAAO,KAAK,WAAW,WACjB;AAAA,MACI,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACb,IACA;AAAA,MACI,OAAO,KAAK,OAAO;AAAA,MACnB,SAAS,KAAK,OAAO,WAAW;AAAA,MAChC,YAAY,KAAK,OAAO;AAAA,IAC5B;AAEV,WAAO,KAAK,QAAQ,KAAK,EAAC,MAAM,KAAI,GAAG,OAAO;AAAA,EAClD;AAAA,EAEO,MAAS;AACZ,QAAI,eAAe,GAAG;AAClB,YAAM,IAAI;AAAA,QACN,sCAAsC,KAAK,IAAI;AAAA,MACnD;AAAA,IACJ;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":["path","args","manager"]}
1
+ {"version":3,"sources":["../../../src/relay/providers/ProxyRelay.ts"],"sourcesContent":["import ProxyTransport from \"@transport/ProxyTransport\";\n\nimport RelayAdapter from \"../adapters/RelayAdapter\";\nimport RelayMessagingAdapter from \"../adapters/RelayMessagingAdapter\";\nimport RelayScriptingAdapter from \"../adapters/RelayScriptingAdapter\";\nimport RelayManager from \"../RelayManager\";\nimport RelayPermission from \"../RelayPermission\";\nimport {isRelayContext} from \"../utils\";\n\nimport type {RpcAsyncProxy} from \"@typing/rpc\";\nimport {RelayAllFrames, RelayMethod, type RelayCallOptions, type RelayOptions} from \"@typing/relay\";\nimport type {TransportDictionary, TransportManager, TransportName} from \"@typing/transport\";\n\nexport type ProxyRelayParams = number | RelayCallOptions;\n\nexport default class ProxyRelay<\n N extends TransportName,\n T = RpcAsyncProxy<TransportDictionary[N]>,\n> extends ProxyTransport<N, T> {\n private static readonly SelectorKeys = [\"allFrames\", \"frameId\", \"frameIds\", \"documentId\", \"documentIds\"] as const;\n\n private _adapter?: RelayAdapter;\n private _target?: RelayCallOptions;\n\n constructor(\n name: N,\n protected readonly options: RelayOptions,\n private readonly params: ProxyRelayParams,\n private readonly permission: RelayPermission\n ) {\n super(name);\n }\n\n private get adapter(): RelayAdapter {\n return (this._adapter ??=\n this.options.method === RelayMethod.Scripting\n ? new RelayScriptingAdapter(this.name, this.target)\n : new RelayMessagingAdapter(this.name, this.target));\n }\n\n private get target(): RelayCallOptions {\n if (this._target) {\n return this._target;\n }\n\n const target: Record<string, unknown> =\n typeof this.params === \"number\" ? {tabId: this.params} : {...this.params};\n\n this.validateTabId(target.tabId);\n this.validateTimeout(target.timeoutMs);\n\n const selected = ProxyRelay.SelectorKeys.filter(key => target[key] !== undefined);\n\n if (selected.length > 1) {\n this.invalid(`selectors are mutually exclusive; received ${selected.map(key => `\"${key}\"`).join(\", \")}.`);\n }\n\n if (\n target.allFrames !== undefined &&\n target.allFrames !== false &&\n target.allFrames !== true &&\n target.allFrames !== RelayAllFrames.Any &&\n target.allFrames !== RelayAllFrames.All\n ) {\n this.invalid('\"allFrames\" accepts only false, true, RelayAllFrames.Any or RelayAllFrames.All.');\n }\n\n if (target.frameId !== undefined) {\n this.validateFrameId(target.frameId);\n }\n\n if (target.frameIds !== undefined) {\n this.validateArray(target.frameIds, \"frameIds\", (item, property) => this.validateFrameId(item, property));\n }\n\n if (target.documentId !== undefined) {\n this.validateDocumentId(target.documentId);\n }\n\n if (target.documentIds !== undefined) {\n this.validateArray(target.documentIds, \"documentIds\", (item, property) =>\n this.validateDocumentId(item, property)\n );\n }\n\n return (this._target = target as unknown as RelayCallOptions);\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n if (!this.permission.allow(this.name)) {\n if (!(await this.permission.request(this.name))) {\n throw new Error(\n `ProxyRelay: User denied required permissions for relay \"${this.name}\" at path \"${path}\". Cannot proceed with the operation.`\n );\n }\n }\n\n return this.adapter.invoke(args, path);\n }\n\n private validateTabId(tabId: unknown): void {\n if (!Number.isInteger(tabId) || (tabId as number) < 0) {\n this.invalid('\"tabId\" must be a non-negative integer.');\n }\n }\n\n private validateFrameId(frameId: unknown, property = \"frameId\"): void {\n if (!Number.isInteger(frameId) || (frameId as number) < 0) {\n this.invalid(`\"${property}\" must contain only non-negative integers.`);\n }\n }\n\n private validateDocumentId(documentId: unknown, property = \"documentId\"): void {\n if (typeof documentId !== \"string\" || documentId.trim() === \"\") {\n this.invalid(`\"${property}\" must contain only non-empty strings.`);\n }\n }\n\n private validateTimeout(timeoutMs: unknown): void {\n if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || (timeoutMs as number) <= 0)) {\n this.invalid('\"timeoutMs\" must be greater than zero.');\n }\n }\n\n private validateArray(\n value: unknown,\n property: \"frameIds\" | \"documentIds\",\n validate: (item: unknown, property: string) => void\n ): void {\n if (!Array.isArray(value) || value.length === 0) {\n this.invalid(`\"${property}\" must be a non-empty array.`);\n }\n\n const items = value as unknown[];\n\n items.forEach(item => validate(item, property));\n\n if (new Set(items).size !== items.length) {\n this.invalid(`\"${property}\" must not contain duplicate values.`);\n }\n }\n\n private invalid(message: string): never {\n throw new TypeError(`Invalid Relay target: ${message}`);\n }\n\n public get(): T {\n if (isRelayContext()) {\n throw new Error(\n `You are trying to get proxy relay \"${this.name}\" from script content. You can get original relay instead`\n );\n }\n\n void this.target;\n\n return super.get();\n }\n}\n"],"mappings":"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","names":[]}
@@ -25,9 +25,8 @@ class RegisterRelay_default extends RegisterTransport {
25
25
  const relay = this.init(...args);
26
26
  this.manager().add(this.name, relay);
27
27
  return relay;
28
- } else {
29
- return super.register(...args);
30
28
  }
29
+ return super.register(...args);
31
30
  }
32
31
  get() {
33
32
  if (!isRelayContext()) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/relay/providers/RegisterRelay.ts"],"sourcesContent":["import RegisterTransport from \"@transport/RegisterTransport\";\n\nimport RelayMessage from \"../RelayMessage\";\nimport RelayManager from \"../RelayManager\";\nimport {isRelayContext} from \"../utils\";\n\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\nimport {RelayMethod} from \"@typing/relay\";\n\nexport default class<\n N extends TransportName,\n T extends object = TransportDictionary[N],\n A extends any[] = [],\n> extends RegisterTransport<N, T, A> {\n constructor(\n name: N,\n protected method: RelayMethod,\n protected readonly init: (...args: A) => T\n ) {\n super(name, init);\n }\n\n protected message(): TransportMessage {\n return new RelayMessage(this.name);\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n public register(...args: A): T {\n if (this.method === RelayMethod.Scripting) {\n if (this.manager().has(this.name)) {\n throw new Error(`A relay with the name \"${this.name}\" already exists. The relay name must be unique.`);\n }\n\n const relay = this.init(...args);\n\n this.manager().add(this.name, relay);\n\n return relay;\n } else {\n return super.register(...args);\n }\n }\n\n public get(): T {\n if (!isRelayContext()) {\n throw new Error(`Relay \"${this.name}\" can be getting only from content script`);\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,OAAO,uBAAuB;AAE9B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,SAAQ,sBAAqB;AAG7B,SAAQ,mBAAkB;AAE1B,MAAO,8BAIG,kBAA2B;AAAA,EACjC,YACI,MACU,QACS,MACrB;AACE,UAAM,MAAM,IAAI;AAHN;AACS;AAAA,EAGvB;AAAA,EAJc;AAAA,EACS;AAAA,EAKb,UAA4B;AAClC,WAAO,IAAI,aAAa,KAAK,IAAI;AAAA,EACrC;AAAA,EAEU,UAA4B;AAClC,WAAO,aAAa,YAAY;AAAA,EACpC;AAAA,EAEO,YAAY,MAAY;AAC3B,QAAI,KAAK,WAAW,YAAY,WAAW;AACvC,UAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI,GAAG;AAC/B,cAAM,IAAI,MAAM,0BAA0B,KAAK,IAAI,kDAAkD;AAAA,MACzG;AAEA,YAAM,QAAQ,KAAK,KAAK,GAAG,IAAI;AAE/B,WAAK,QAAQ,EAAE,IAAI,KAAK,MAAM,KAAK;AAEnC,aAAO;AAAA,IACX,OAAO;AACH,aAAO,MAAM,SAAS,GAAG,IAAI;AAAA,IACjC;AAAA,EACJ;AAAA,EAEO,MAAS;AACZ,QAAI,CAAC,eAAe,GAAG;AACnB,YAAM,IAAI,MAAM,UAAU,KAAK,IAAI,2CAA2C;AAAA,IAClF;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/relay/providers/RegisterRelay.ts"],"sourcesContent":["import RegisterTransport from \"@transport/RegisterTransport\";\n\nimport RelayMessage from \"../RelayMessage\";\nimport RelayManager from \"../RelayManager\";\nimport {isRelayContext} from \"../utils\";\n\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\nimport {RelayMethod} from \"@typing/relay\";\n\nexport default class<\n N extends TransportName,\n T extends object = TransportDictionary[N],\n A extends any[] = [],\n> extends RegisterTransport<N, T, A> {\n constructor(\n name: N,\n protected method: RelayMethod,\n protected readonly init: (...args: A) => T\n ) {\n super(name, init);\n }\n\n protected message(): TransportMessage {\n return new RelayMessage(this.name);\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n public register(...args: A): T {\n if (this.method === RelayMethod.Scripting) {\n if (this.manager().has(this.name)) {\n throw new Error(`A relay with the name \"${this.name}\" already exists. The relay name must be unique.`);\n }\n\n const relay = this.init(...args);\n\n this.manager().add(this.name, relay);\n\n return relay;\n }\n\n return super.register(...args);\n }\n\n public get(): T {\n if (!isRelayContext()) {\n throw new Error(`Relay \"${this.name}\" can be getting only from content script`);\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,OAAO,uBAAuB;AAE9B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,SAAQ,sBAAqB;AAG7B,SAAQ,mBAAkB;AAE1B,MAAO,8BAIG,kBAA2B;AAAA,EACjC,YACI,MACU,QACS,MACrB;AACE,UAAM,MAAM,IAAI;AAHN;AACS;AAAA,EAGvB;AAAA,EAJc;AAAA,EACS;AAAA,EAKb,UAA4B;AAClC,WAAO,IAAI,aAAa,KAAK,IAAI;AAAA,EACrC;AAAA,EAEU,UAA4B;AAClC,WAAO,aAAa,YAAY;AAAA,EACpC;AAAA,EAEO,YAAY,MAAY;AAC3B,QAAI,KAAK,WAAW,YAAY,WAAW;AACvC,UAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI,GAAG;AAC/B,cAAM,IAAI,MAAM,0BAA0B,KAAK,IAAI,kDAAkD;AAAA,MACzG;AAEA,YAAM,QAAQ,KAAK,KAAK,GAAG,IAAI;AAE/B,WAAK,QAAQ,EAAE,IAAI,KAAK,MAAM,KAAK;AAEnC,aAAO;AAAA,IACX;AAEA,WAAO,MAAM,SAAS,GAAG,IAAI;AAAA,EACjC;AAAA,EAEO,MAAS;AACZ,QAAI,CAAC,eAAe,GAAG;AACnB,YAAM,IAAI,MAAM,UAAU,KAAK,IAAI,2CAA2C;AAAA,IAClF;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
@@ -0,0 +1,12 @@
1
+ import { InjectScriptTargetErrorKind } from "@addon-core/inject-script";
2
+ import { RelayFrameErrorKind, type RelayFrameResult, type RelayFramesResult, type RelayResultTarget } from "../types/relay.js";
3
+ export declare class RelayFrameTimeoutError extends Error {
4
+ readonly timeoutMs: number;
5
+ constructor(timeoutMs: number);
6
+ }
7
+ export declare const fulfilledRelayFrame: <T>(target: RelayResultTarget, result: T) => RelayFrameResult<T>;
8
+ export declare const rejectedRelayFrame: <T>(target: RelayResultTarget, error: unknown, kind: RelayFrameErrorKind) => RelayFrameResult<T>;
9
+ export declare const messageErrorKind: (error: unknown) => RelayFrameErrorKind;
10
+ export declare const injectScriptErrorKind: (kind: `${InjectScriptTargetErrorKind}`) => RelayFrameErrorKind;
11
+ export declare const withRelayTimeout: <T>(promise: Promise<T>, timeoutMs?: number) => Promise<T>;
12
+ export declare const sortRelayFrameResults: <T>(results: RelayFramesResult<T>) => RelayFramesResult<T>;