adnbn 0.8.0 → 0.10.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 (164) 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/builders/manifest/ManifestBase.d.ts +4 -1
  4. package/dist/cli/builders/manifest/ManifestBase.js +19 -0
  5. package/dist/cli/builders/manifest/ManifestBase.js.map +1 -1
  6. package/dist/cli/bundler/plugins/GenerateJsonPlugin.js +3 -7
  7. package/dist/cli/bundler/plugins/GenerateJsonPlugin.js.map +1 -1
  8. package/dist/cli/entrypoint/file/injectors/core.js +9 -1
  9. package/dist/cli/entrypoint/file/injectors/core.js.map +1 -1
  10. package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.d.ts +2 -2
  11. package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js +2 -2
  12. package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js.map +1 -1
  13. package/dist/cli/entrypoint/finder/{AbstractOptionsFinder.js → AbstractParsedFinder.js} +3 -3
  14. package/dist/cli/entrypoint/finder/AbstractParsedFinder.js.map +1 -0
  15. package/dist/cli/entrypoint/finder/OptionsFinder.d.ts +13 -0
  16. package/dist/cli/entrypoint/finder/OptionsFinder.js +33 -0
  17. package/dist/cli/entrypoint/finder/OptionsFinder.js.map +1 -0
  18. package/dist/cli/entrypoint/finder/PluginFinder.d.ts +4 -4
  19. package/dist/cli/entrypoint/finder/PluginFinder.js +2 -2
  20. package/dist/cli/entrypoint/finder/PluginFinder.js.map +1 -1
  21. package/dist/cli/entrypoint/finder/index.d.ts +2 -1
  22. package/dist/cli/entrypoint/finder/index.js +20 -18
  23. package/dist/cli/entrypoint/finder/index.js.map +1 -1
  24. package/dist/cli/entrypoint/finder/tests/fixtures/options/discovery/account.options.d.ts +1 -0
  25. package/dist/cli/entrypoint/finder/tests/fixtures/options/discovery/advanced.options/index.d.ts +1 -0
  26. package/dist/cli/entrypoint/parser/ContentParser.d.ts +2 -2
  27. package/dist/cli/entrypoint/parser/ContentParser.js.map +1 -1
  28. package/dist/cli/entrypoint/parser/OptionsParser.d.ts +6 -0
  29. package/dist/cli/entrypoint/parser/OptionsParser.js +16 -0
  30. package/dist/cli/entrypoint/parser/OptionsParser.js.map +1 -0
  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/entrypoint/parser/index.d.ts +1 -0
  34. package/dist/cli/entrypoint/parser/index.js +16 -14
  35. package/dist/cli/entrypoint/parser/index.js.map +1 -1
  36. package/dist/cli/index.js +2 -0
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/cli/plugins/content/ContentDriver.d.ts +21 -8
  39. package/dist/cli/plugins/content/ContentDriver.js +24 -2
  40. package/dist/cli/plugins/content/ContentDriver.js.map +1 -1
  41. package/dist/cli/plugins/content/ContentManager.d.ts +8 -3
  42. package/dist/cli/plugins/content/ContentManager.js +41 -6
  43. package/dist/cli/plugins/content/ContentManager.js.map +1 -1
  44. package/dist/cli/plugins/content/Relay.d.ts +6 -8
  45. package/dist/cli/plugins/content/Relay.js +2 -14
  46. package/dist/cli/plugins/content/Relay.js.map +1 -1
  47. package/dist/cli/plugins/content/RelayDeclaration.d.ts +0 -1
  48. package/dist/cli/plugins/content/RelayDeclaration.js +0 -3
  49. package/dist/cli/plugins/content/RelayDeclaration.js.map +1 -1
  50. package/dist/cli/plugins/content/RelayDriver.d.ts +10 -0
  51. package/dist/cli/plugins/content/RelayDriver.js +39 -0
  52. package/dist/cli/plugins/content/RelayDriver.js.map +1 -0
  53. package/dist/cli/plugins/content/index.js +1 -10
  54. package/dist/cli/plugins/content/index.js.map +1 -1
  55. package/dist/cli/plugins/content/types.d.ts +3 -0
  56. package/dist/cli/plugins/index.d.ts +1 -0
  57. package/dist/cli/plugins/index.js +22 -20
  58. package/dist/cli/plugins/index.js.map +1 -1
  59. package/dist/cli/plugins/locale/Locale.js +5 -1
  60. package/dist/cli/plugins/locale/Locale.js.map +1 -1
  61. package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js +2 -3
  62. package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js.map +1 -1
  63. package/dist/cli/plugins/locale/declaration/locale.d.ts +3 -124
  64. package/dist/cli/plugins/options/Options.d.ts +10 -0
  65. package/dist/cli/plugins/options/Options.js +24 -0
  66. package/dist/cli/plugins/options/Options.js.map +1 -0
  67. package/dist/cli/plugins/options/index.d.ts +2 -0
  68. package/dist/cli/plugins/options/index.js +41 -0
  69. package/dist/cli/plugins/options/index.js.map +1 -0
  70. package/dist/cli/plugins/view/index.js +1 -1
  71. package/dist/cli/plugins/view/index.js.map +1 -1
  72. package/dist/cli/resolvers/config.js +2 -0
  73. package/dist/cli/resolvers/config.js.map +1 -1
  74. package/dist/cli/virtual/index.js +2 -2
  75. package/dist/cli/virtual/virtual.d.ts +52 -147
  76. package/dist/entry/relay/index.d.ts +2 -1
  77. package/dist/entry/relay/index.js.map +1 -1
  78. package/dist/locale/adapters/react/LocaleProvider.js +2 -0
  79. package/dist/locale/adapters/react/LocaleProvider.js.map +1 -1
  80. package/dist/locale/adapters/react/context.d.ts +1 -0
  81. package/dist/locale/adapters/react/context.js +3 -2
  82. package/dist/locale/adapters/react/context.js.map +1 -1
  83. package/dist/locale/helpers.js.map +1 -1
  84. package/dist/locale/providers/AbstractLocale.d.ts +2 -0
  85. package/dist/locale/providers/AbstractLocale.js +5 -0
  86. package/dist/locale/providers/AbstractLocale.js.map +1 -1
  87. package/dist/locale/providers/NativeLocale.d.ts +3 -2
  88. package/dist/locale/providers/NativeLocale.js +1 -1
  89. package/dist/locale/providers/NativeLocale.js.map +1 -1
  90. package/dist/main/index.d.ts +1 -0
  91. package/dist/main/index.js +1 -0
  92. package/dist/main/index.js.map +1 -1
  93. package/dist/main/options.d.ts +3 -0
  94. package/dist/main/options.js +7 -0
  95. package/dist/main/options.js.map +1 -0
  96. package/dist/main/relay.d.ts +7 -6
  97. package/dist/main/relay.js +12 -5
  98. package/dist/main/relay.js.map +1 -1
  99. package/dist/message/error.d.ts +6 -0
  100. package/dist/message/error.js +21 -0
  101. package/dist/message/error.js.map +1 -1
  102. package/dist/message/index.d.ts +2 -1
  103. package/dist/message/index.js +2 -0
  104. package/dist/message/index.js.map +1 -1
  105. package/dist/message/providers/Message.d.ts +3 -0
  106. package/dist/message/providers/Message.js +36 -6
  107. package/dist/message/providers/Message.js.map +1 -1
  108. package/dist/offscreen/providers/ProxyOffscreen.d.ts +2 -2
  109. package/dist/offscreen/providers/ProxyOffscreen.js.map +1 -1
  110. package/dist/relay/RelayPermission.d.ts +6 -3
  111. package/dist/relay/RelayPermission.js +28 -12
  112. package/dist/relay/RelayPermission.js.map +1 -1
  113. package/dist/relay/adapters/RelayAdapter.d.ts +8 -0
  114. package/dist/relay/adapters/RelayAdapter.js +16 -0
  115. package/dist/relay/adapters/RelayAdapter.js.map +1 -0
  116. package/dist/relay/adapters/RelayMessagingAdapter.d.ts +11 -0
  117. package/dist/relay/adapters/RelayMessagingAdapter.js +91 -0
  118. package/dist/relay/adapters/RelayMessagingAdapter.js.map +1 -0
  119. package/dist/relay/adapters/RelayScriptingAdapter.d.ts +15 -0
  120. package/dist/relay/adapters/RelayScriptingAdapter.js +170 -0
  121. package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -0
  122. package/dist/relay/discovery/RelayDiscovery.d.ts +10 -0
  123. package/dist/relay/discovery/RelayDiscovery.js +62 -0
  124. package/dist/relay/discovery/RelayDiscovery.js.map +1 -0
  125. package/dist/relay/index.d.ts +1 -4
  126. package/dist/relay/index.js +1 -3
  127. package/dist/relay/index.js.map +1 -1
  128. package/dist/relay/providers/ProxyRelay.d.ts +20 -17
  129. package/dist/relay/providers/ProxyRelay.js +79 -52
  130. package/dist/relay/providers/ProxyRelay.js.map +1 -1
  131. package/dist/relay/providers/RegisterRelay.js +1 -2
  132. package/dist/relay/providers/RegisterRelay.js.map +1 -1
  133. package/dist/relay/result.d.ts +12 -0
  134. package/dist/relay/result.js +88 -0
  135. package/dist/relay/result.js.map +1 -0
  136. package/dist/sandbox/index.d.ts +2 -2
  137. package/dist/sandbox/index.js.map +1 -1
  138. package/dist/sandbox/providers/ProxySandbox.d.ts +2 -2
  139. package/dist/sandbox/providers/ProxySandbox.js.map +1 -1
  140. package/dist/service/providers/ProxyService.d.ts +2 -2
  141. package/dist/service/providers/ProxyService.js.map +1 -1
  142. package/dist/transport/ProxyTransport.d.ts +2 -2
  143. package/dist/transport/ProxyTransport.js.map +1 -1
  144. package/dist/transport/index.d.ts +3 -2
  145. package/dist/types/helpers.d.ts +0 -4
  146. package/dist/types/locale.d.ts +3 -0
  147. package/dist/types/locale.js +58 -0
  148. package/dist/types/locale.js.map +1 -1
  149. package/dist/types/manifest.d.ts +14 -0
  150. package/dist/types/manifest.js.map +1 -1
  151. package/dist/types/options.d.ts +9 -0
  152. package/dist/types/options.js +1 -0
  153. package/dist/types/options.js.map +1 -0
  154. package/dist/types/plugin.d.ts +2 -1
  155. package/dist/types/relay.d.ts +130 -3
  156. package/dist/types/relay.js +16 -0
  157. package/dist/types/relay.js.map +1 -1
  158. package/dist/types/rpc.d.ts +4 -0
  159. package/dist/types/rpc.js +1 -0
  160. package/dist/types/rpc.js.map +1 -0
  161. package/dist/types/transport.d.ts +3 -2
  162. package/package.json +5 -4
  163. package/dist/cli/entrypoint/finder/AbstractOptionsFinder.js.map +0 -1
  164. /package/dist/cli/entrypoint/finder/{AbstractOptionsFinder.d.ts → AbstractParsedFinder.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/relay/adapters/RelayMessagingAdapter.ts"],"sourcesContent":["import {isRemoteMessageError} from \"@message/error\";\n\nimport type {MessageSendOptions} from \"@typing/message\";\nimport {RelayAllFrames, RelayFrameErrorKind, type RelayAddressTarget, type RelayCallOptions} from \"@typing/relay\";\nimport type {TransportMessage} from \"@typing/transport\";\n\nimport RelayDiscovery from \"../discovery/RelayDiscovery\";\nimport RelayMessage from \"../RelayMessage\";\nimport {\n fulfilledRelayFrame,\n messageErrorKind,\n rejectedRelayFrame,\n RelayFrameTimeoutError,\n sortRelayFrameResults,\n withRelayTimeout,\n} from \"../result\";\nimport RelayAdapter from \"./RelayAdapter\";\n\nexport default class RelayMessagingAdapter extends RelayAdapter {\n private readonly discovery = new RelayDiscovery();\n private readonly message: TransportMessage;\n\n public constructor(name: string, target: RelayCallOptions) {\n super(name, target);\n\n this.message = new RelayMessage(name);\n }\n\n public async invoke(args: any[], path?: string): Promise<any> {\n if (!this.isBatchTarget(this.target)) {\n const target = this.scalarTarget();\n\n return withRelayTimeout(\n this.message.send({path, args}, this.messageOptions(target)),\n this.target.timeoutMs\n );\n }\n\n if (this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any) {\n const target = {tabId: this.target.tabId, allFrames: RelayAllFrames.Any} as const;\n\n try {\n const result = await withRelayTimeout(\n this.message.send({path, args}, {tabId: this.target.tabId}),\n this.target.timeoutMs\n );\n\n return [fulfilledRelayFrame(target, result)];\n } catch (error) {\n const kind =\n error instanceof RelayFrameTimeoutError\n ? RelayFrameErrorKind.Timeout\n : isRemoteMessageError(error)\n ? RelayFrameErrorKind.Remote\n : messageErrorKind(error);\n\n return [rejectedRelayFrame(target, error, kind)];\n }\n }\n\n const targets = await this.batchTargets();\n const results = await Promise.all(\n targets.map(async target => {\n try {\n const result = await withRelayTimeout(\n this.message.send({path, args}, this.messageOptions(target)),\n this.target.timeoutMs\n );\n\n return fulfilledRelayFrame(target, result);\n } catch (error) {\n const kind =\n error instanceof RelayFrameTimeoutError\n ? RelayFrameErrorKind.Timeout\n : isRemoteMessageError(error)\n ? RelayFrameErrorKind.Remote\n : messageErrorKind(error);\n\n return rejectedRelayFrame(target, error, kind);\n }\n })\n );\n\n return sortRelayFrameResults(results);\n }\n\n private scalarTarget(): RelayAddressTarget {\n if (this.target.frameId !== undefined) {\n return {tabId: this.target.tabId, frameId: this.target.frameId};\n }\n\n if (this.target.documentId !== undefined) {\n return {tabId: this.target.tabId, documentId: this.target.documentId};\n }\n\n return {tabId: this.target.tabId, frameId: 0};\n }\n\n private async batchTargets(): Promise<RelayAddressTarget[]> {\n if (this.target.allFrames === RelayAllFrames.All) {\n return this.discovery.discover(this.target.tabId);\n }\n\n if (this.target.frameIds !== undefined) {\n return this.target.frameIds.map(frameId => ({tabId: this.target.tabId, frameId}));\n }\n\n return (this.target.documentIds ?? []).map(documentId => ({tabId: this.target.tabId, documentId}));\n }\n\n private messageOptions(target: RelayAddressTarget): MessageSendOptions {\n if (target.frameId !== undefined) {\n return {\n tabId: target.tabId,\n frameId: target.frameId,\n ...(target.documentId === undefined ? {} : {documentId: target.documentId}),\n };\n }\n\n return {tabId: target.tabId, documentId: target.documentId};\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,15 @@
1
+ import { type RelayCallOptions } from "../../types/relay.js";
2
+ import RelayAdapter from "./RelayAdapter.js";
3
+ export default class RelayScriptingAdapter extends RelayAdapter {
4
+ private _injectScript?;
5
+ constructor(name: string, target: RelayCallOptions);
6
+ private get injectScript();
7
+ invoke(args: any[], path?: string): Promise<any>;
8
+ private normalize;
9
+ private resultTarget;
10
+ private unwrap;
11
+ private injectScriptOptions;
12
+ private isFrameTarget;
13
+ private isDocumentTarget;
14
+ private isAnyFramesTarget;
15
+ }
@@ -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":"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","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()) {