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.
- package/dist/cli/builders/locale/LocaleStructureValidator.js +7 -0
- package/dist/cli/builders/locale/LocaleStructureValidator.js.map +1 -1
- package/dist/cli/builders/manifest/ManifestBase.d.ts +4 -1
- package/dist/cli/builders/manifest/ManifestBase.js +19 -0
- package/dist/cli/builders/manifest/ManifestBase.js.map +1 -1
- package/dist/cli/bundler/plugins/GenerateJsonPlugin.js +3 -7
- package/dist/cli/bundler/plugins/GenerateJsonPlugin.js.map +1 -1
- package/dist/cli/entrypoint/file/injectors/core.js +9 -1
- package/dist/cli/entrypoint/file/injectors/core.js.map +1 -1
- package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.d.ts +2 -2
- package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js +2 -2
- package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/{AbstractOptionsFinder.js → AbstractParsedFinder.js} +3 -3
- package/dist/cli/entrypoint/finder/AbstractParsedFinder.js.map +1 -0
- package/dist/cli/entrypoint/finder/OptionsFinder.d.ts +13 -0
- package/dist/cli/entrypoint/finder/OptionsFinder.js +33 -0
- package/dist/cli/entrypoint/finder/OptionsFinder.js.map +1 -0
- package/dist/cli/entrypoint/finder/PluginFinder.d.ts +4 -4
- package/dist/cli/entrypoint/finder/PluginFinder.js +2 -2
- package/dist/cli/entrypoint/finder/PluginFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/index.d.ts +2 -1
- package/dist/cli/entrypoint/finder/index.js +20 -18
- package/dist/cli/entrypoint/finder/index.js.map +1 -1
- package/dist/cli/entrypoint/finder/tests/fixtures/options/discovery/account.options.d.ts +1 -0
- package/dist/cli/entrypoint/finder/tests/fixtures/options/discovery/advanced.options/index.d.ts +1 -0
- package/dist/cli/entrypoint/parser/ContentParser.d.ts +2 -2
- package/dist/cli/entrypoint/parser/ContentParser.js.map +1 -1
- package/dist/cli/entrypoint/parser/OptionsParser.d.ts +6 -0
- package/dist/cli/entrypoint/parser/OptionsParser.js +16 -0
- package/dist/cli/entrypoint/parser/OptionsParser.js.map +1 -0
- package/dist/cli/entrypoint/parser/RelayParser.js +2 -1
- package/dist/cli/entrypoint/parser/RelayParser.js.map +1 -1
- package/dist/cli/entrypoint/parser/index.d.ts +1 -0
- package/dist/cli/entrypoint/parser/index.js +16 -14
- package/dist/cli/entrypoint/parser/index.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plugins/content/ContentDriver.d.ts +21 -8
- package/dist/cli/plugins/content/ContentDriver.js +24 -2
- package/dist/cli/plugins/content/ContentDriver.js.map +1 -1
- package/dist/cli/plugins/content/ContentManager.d.ts +8 -3
- package/dist/cli/plugins/content/ContentManager.js +41 -6
- package/dist/cli/plugins/content/ContentManager.js.map +1 -1
- package/dist/cli/plugins/content/Relay.d.ts +6 -8
- package/dist/cli/plugins/content/Relay.js +2 -14
- package/dist/cli/plugins/content/Relay.js.map +1 -1
- package/dist/cli/plugins/content/RelayDeclaration.d.ts +0 -1
- package/dist/cli/plugins/content/RelayDeclaration.js +0 -3
- package/dist/cli/plugins/content/RelayDeclaration.js.map +1 -1
- package/dist/cli/plugins/content/RelayDriver.d.ts +10 -0
- package/dist/cli/plugins/content/RelayDriver.js +39 -0
- package/dist/cli/plugins/content/RelayDriver.js.map +1 -0
- package/dist/cli/plugins/content/index.js +1 -10
- package/dist/cli/plugins/content/index.js.map +1 -1
- package/dist/cli/plugins/content/types.d.ts +3 -0
- package/dist/cli/plugins/index.d.ts +1 -0
- package/dist/cli/plugins/index.js +22 -20
- package/dist/cli/plugins/index.js.map +1 -1
- package/dist/cli/plugins/locale/Locale.js +5 -1
- package/dist/cli/plugins/locale/Locale.js.map +1 -1
- package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js +2 -3
- package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js.map +1 -1
- package/dist/cli/plugins/locale/declaration/locale.d.ts +3 -124
- package/dist/cli/plugins/options/Options.d.ts +10 -0
- package/dist/cli/plugins/options/Options.js +24 -0
- package/dist/cli/plugins/options/Options.js.map +1 -0
- package/dist/cli/plugins/options/index.d.ts +2 -0
- package/dist/cli/plugins/options/index.js +41 -0
- package/dist/cli/plugins/options/index.js.map +1 -0
- package/dist/cli/plugins/view/index.js +1 -1
- package/dist/cli/plugins/view/index.js.map +1 -1
- package/dist/cli/resolvers/config.js +2 -0
- package/dist/cli/resolvers/config.js.map +1 -1
- package/dist/cli/virtual/index.js +2 -2
- package/dist/cli/virtual/virtual.d.ts +52 -147
- package/dist/entry/relay/index.d.ts +2 -1
- package/dist/entry/relay/index.js.map +1 -1
- package/dist/locale/adapters/react/LocaleProvider.js +2 -0
- package/dist/locale/adapters/react/LocaleProvider.js.map +1 -1
- package/dist/locale/adapters/react/context.d.ts +1 -0
- package/dist/locale/adapters/react/context.js +3 -2
- package/dist/locale/adapters/react/context.js.map +1 -1
- package/dist/locale/helpers.js.map +1 -1
- package/dist/locale/providers/AbstractLocale.d.ts +2 -0
- package/dist/locale/providers/AbstractLocale.js +5 -0
- package/dist/locale/providers/AbstractLocale.js.map +1 -1
- package/dist/locale/providers/NativeLocale.d.ts +3 -2
- package/dist/locale/providers/NativeLocale.js +1 -1
- package/dist/locale/providers/NativeLocale.js.map +1 -1
- package/dist/main/index.d.ts +1 -0
- package/dist/main/index.js +1 -0
- package/dist/main/index.js.map +1 -1
- package/dist/main/options.d.ts +3 -0
- package/dist/main/options.js +7 -0
- package/dist/main/options.js.map +1 -0
- package/dist/main/relay.d.ts +7 -6
- package/dist/main/relay.js +12 -5
- package/dist/main/relay.js.map +1 -1
- package/dist/message/error.d.ts +6 -0
- package/dist/message/error.js +21 -0
- package/dist/message/error.js.map +1 -1
- package/dist/message/index.d.ts +2 -1
- package/dist/message/index.js +2 -0
- package/dist/message/index.js.map +1 -1
- package/dist/message/providers/Message.d.ts +3 -0
- package/dist/message/providers/Message.js +36 -6
- package/dist/message/providers/Message.js.map +1 -1
- package/dist/offscreen/providers/ProxyOffscreen.d.ts +2 -2
- package/dist/offscreen/providers/ProxyOffscreen.js.map +1 -1
- package/dist/relay/RelayPermission.d.ts +6 -3
- package/dist/relay/RelayPermission.js +28 -12
- package/dist/relay/RelayPermission.js.map +1 -1
- package/dist/relay/adapters/RelayAdapter.d.ts +8 -0
- package/dist/relay/adapters/RelayAdapter.js +16 -0
- package/dist/relay/adapters/RelayAdapter.js.map +1 -0
- package/dist/relay/adapters/RelayMessagingAdapter.d.ts +11 -0
- package/dist/relay/adapters/RelayMessagingAdapter.js +91 -0
- package/dist/relay/adapters/RelayMessagingAdapter.js.map +1 -0
- package/dist/relay/adapters/RelayScriptingAdapter.d.ts +15 -0
- package/dist/relay/adapters/RelayScriptingAdapter.js +170 -0
- package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -0
- package/dist/relay/discovery/RelayDiscovery.d.ts +10 -0
- package/dist/relay/discovery/RelayDiscovery.js +62 -0
- package/dist/relay/discovery/RelayDiscovery.js.map +1 -0
- package/dist/relay/index.d.ts +1 -4
- package/dist/relay/index.js +1 -3
- package/dist/relay/index.js.map +1 -1
- package/dist/relay/providers/ProxyRelay.d.ts +20 -17
- package/dist/relay/providers/ProxyRelay.js +79 -52
- package/dist/relay/providers/ProxyRelay.js.map +1 -1
- package/dist/relay/providers/RegisterRelay.js +1 -2
- package/dist/relay/providers/RegisterRelay.js.map +1 -1
- package/dist/relay/result.d.ts +12 -0
- package/dist/relay/result.js +88 -0
- package/dist/relay/result.js.map +1 -0
- package/dist/sandbox/index.d.ts +2 -2
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/providers/ProxySandbox.d.ts +2 -2
- package/dist/sandbox/providers/ProxySandbox.js.map +1 -1
- package/dist/service/providers/ProxyService.d.ts +2 -2
- package/dist/service/providers/ProxyService.js.map +1 -1
- package/dist/transport/ProxyTransport.d.ts +2 -2
- package/dist/transport/ProxyTransport.js.map +1 -1
- package/dist/transport/index.d.ts +3 -2
- package/dist/types/helpers.d.ts +0 -4
- package/dist/types/locale.d.ts +3 -0
- package/dist/types/locale.js +58 -0
- package/dist/types/locale.js.map +1 -1
- package/dist/types/manifest.d.ts +14 -0
- package/dist/types/manifest.js.map +1 -1
- package/dist/types/options.d.ts +9 -0
- package/dist/types/options.js +1 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/plugin.d.ts +2 -1
- package/dist/types/relay.d.ts +130 -3
- package/dist/types/relay.js +16 -0
- package/dist/types/relay.js.map +1 -1
- package/dist/types/rpc.d.ts +4 -0
- package/dist/types/rpc.js +1 -0
- package/dist/types/rpc.js.map +1 -0
- package/dist/types/transport.d.ts +3 -2
- package/package.json +5 -4
- package/dist/cli/entrypoint/finder/AbstractOptionsFinder.js.map +0 -1
- /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":[]}
|
package/dist/relay/index.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
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>;
|
package/dist/relay/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import
|
|
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
|
package/dist/relay/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/relay/index.ts"],"sourcesContent":["import
|
|
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 {
|
|
5
|
-
import {
|
|
6
|
-
import { TransportDictionary, TransportManager, TransportName } from "../../types/transport.js";
|
|
7
|
-
export type ProxyRelayParams = number |
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
private
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
21
|
-
private
|
|
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 {
|
|
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.
|
|
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
|
-
|
|
22
|
-
|
|
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
|
|
31
|
-
if (!await this.permission
|
|
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.
|
|
66
|
+
return this.adapter.invoke(args, path);
|
|
38
67
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
65
|
-
|
|
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
|
|
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()) {
|