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/main/options.ts"],"sourcesContent":["import {OptionsConfig, OptionsDefinition, OptionsProps} from \"@typing/options\";\n\nexport type {OptionsDefinition, OptionsProps, OptionsConfig};\n\nexport const defineOptions = (options: OptionsDefinition): OptionsDefinition => {\n return options;\n};\n"],"mappings":"AAIO,MAAM,gBAAgB,CAAC,YAAkD;AAC5E,SAAO;AACX;","names":[]}
|
package/dist/main/relay.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { RelayName, RelayProxyTarget } from "../relay/index.js";
|
|
1
|
+
import type { RelayName } from "../relay/index.js";
|
|
3
2
|
import type { TransportType } from "../types/transport.js";
|
|
4
|
-
import { RelayDefinition, RelayMethod,
|
|
5
|
-
export { RelayMethod };
|
|
6
|
-
export
|
|
3
|
+
import { RelayDefinition, RelayAllFrames, RelayFrameErrorKind, RelayMethod, type RelayBatchOptions, type RelayBatchProxyTarget, type RelayProxyTarget, type RelayScalarOptions } from "../types/relay.js";
|
|
4
|
+
export { RelayAllFrames, RelayFrameErrorKind, RelayMethod };
|
|
5
|
+
export { RelayDiscoveryError } from "../relay/discovery/RelayDiscovery.js";
|
|
6
|
+
export type { RelayAllFramesOptions, RelayAnyFramesOptions, RelayBatchOptions, RelayBatchProxyTarget, RelayBatchRpcProxy, RelayCallOptions, RelayDocumentOptions, RelayDocumentsOptions, RelayExecutionOptions, RelayEveryFrameOptions, RelayFrameError, RelayFrameOptions, RelayFrameResult, RelayFramesOptions, RelayFramesResult, RelayNonEmptyReadonlyArray, RelayProxyTarget, RelayResultTarget, RelayScalarOptions, RelayTopFrameOptions, RelayDefinition, } from "../types/relay.js";
|
|
7
7
|
export declare const defineRelay: <T extends TransportType>(options: RelayDefinition<T>) => RelayDefinition<T>;
|
|
8
|
-
export declare
|
|
8
|
+
export declare function getRelay<N extends RelayName>(name: N, params: number | RelayScalarOptions): RelayProxyTarget<N>;
|
|
9
|
+
export declare function getRelay<N extends RelayName>(name: N, params: RelayBatchOptions): RelayBatchProxyTarget<N>;
|
package/dist/main/relay.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import RelayPermission from "./../relay/RelayPermission.js";
|
|
2
2
|
import { ProxyRelay } from "./../relay/providers/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
RelayAllFrames,
|
|
5
|
+
RelayFrameErrorKind,
|
|
6
|
+
RelayMethod
|
|
7
|
+
} from "./../types/relay.js";
|
|
8
|
+
import { RelayDiscoveryError } from "./../relay/discovery/RelayDiscovery.js";
|
|
4
9
|
const defineRelay = (options) => {
|
|
5
10
|
return options;
|
|
6
11
|
};
|
|
@@ -13,16 +18,18 @@ const getRelayOptionsMap = () => {
|
|
|
13
18
|
}
|
|
14
19
|
return relays;
|
|
15
20
|
};
|
|
16
|
-
|
|
21
|
+
function getRelay(name, params) {
|
|
17
22
|
const relays = getRelayOptionsMap();
|
|
18
|
-
RelayPermission.init(relays);
|
|
19
23
|
const options = relays.get(name);
|
|
20
24
|
if (!options) {
|
|
21
25
|
throw new Error(`Failed to get relay "${name}"`);
|
|
22
26
|
}
|
|
23
|
-
return new ProxyRelay(name, options, params).get();
|
|
24
|
-
}
|
|
27
|
+
return new ProxyRelay(name, options, params, RelayPermission.getInstance(relays)).get();
|
|
28
|
+
}
|
|
25
29
|
export {
|
|
30
|
+
RelayAllFrames,
|
|
31
|
+
RelayDiscoveryError,
|
|
32
|
+
RelayFrameErrorKind,
|
|
26
33
|
RelayMethod,
|
|
27
34
|
defineRelay,
|
|
28
35
|
getRelay
|
package/dist/main/relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/main/relay.ts"],"sourcesContent":["import RelayPermission from \"@relay/RelayPermission\";\nimport {ProxyRelay, type ProxyRelayParams} from \"@relay/providers\";\n\nimport type {RelayName
|
|
1
|
+
{"version":3,"sources":["../../src/main/relay.ts"],"sourcesContent":["import RelayPermission from \"@relay/RelayPermission\";\nimport {ProxyRelay, type ProxyRelayParams} from \"@relay/providers\";\n\nimport type {RelayName} from \"@relay/index\";\nimport type {TransportType} from \"@typing/transport\";\nimport {\n RelayDefinition,\n RelayAllFrames,\n RelayFrameErrorKind,\n RelayMethod,\n RelayOptions,\n RelayOptionsMap,\n type RelayBatchOptions,\n type RelayBatchProxyTarget,\n type RelayProxyTarget,\n type RelayScalarOptions,\n} from \"@typing/relay\";\n\nexport {RelayAllFrames, RelayFrameErrorKind, RelayMethod};\nexport {RelayDiscoveryError} from \"@relay/discovery/RelayDiscovery\";\nexport type {\n RelayAllFramesOptions,\n RelayAnyFramesOptions,\n RelayBatchOptions,\n RelayBatchProxyTarget,\n RelayBatchRpcProxy,\n RelayCallOptions,\n RelayDocumentOptions,\n RelayDocumentsOptions,\n RelayExecutionOptions,\n RelayEveryFrameOptions,\n RelayFrameError,\n RelayFrameOptions,\n RelayFrameResult,\n RelayFramesOptions,\n RelayFramesResult,\n RelayNonEmptyReadonlyArray,\n RelayProxyTarget,\n RelayResultTarget,\n RelayScalarOptions,\n RelayTopFrameOptions,\n RelayDefinition,\n} from \"@typing/relay\";\n\nexport const defineRelay = <T extends TransportType>(options: RelayDefinition<T>): RelayDefinition<T> => {\n return options;\n};\n\nconst getRelayOptionsMap = (): RelayOptionsMap => {\n const relays: RelayOptionsMap = new Map();\n\n try {\n // @ts-expect-error: __ADNBN_RELAY_OPTIONS__ is a virtual variable generated by the bundler `src/cli/plugins/content/index.ts`\n Object.entries<RelayOptions>(__ADNBN_RELAY_OPTIONS__).forEach(([key, value]) => relays.set(key, value));\n } catch (e) {\n console.error(\"Failed getting relays: \", e);\n }\n\n return relays;\n};\n\nexport function getRelay<N extends RelayName>(name: N, params: number | RelayScalarOptions): RelayProxyTarget<N>;\n\nexport function getRelay<N extends RelayName>(name: N, params: RelayBatchOptions): RelayBatchProxyTarget<N>;\n\nexport function getRelay<N extends RelayName>(\n name: N,\n params: ProxyRelayParams\n): RelayProxyTarget<N> | RelayBatchProxyTarget<N> {\n const relays = getRelayOptionsMap();\n const options = relays.get(name);\n\n if (!options) {\n throw new Error(`Failed to get relay \"${name}\"`);\n }\n\n return new ProxyRelay(name, options, params, RelayPermission.getInstance(relays)).get() as\n | RelayProxyTarget<N>\n | RelayBatchProxyTarget<N>;\n}\n"],"mappings":"AAAA,OAAO,qBAAqB;AAC5B,SAAQ,kBAAwC;AAIhD;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,OAOG;AAGP,SAAQ,2BAA0B;AAyB3B,MAAM,cAAc,CAA0B,YAAoD;AACrG,SAAO;AACX;AAEA,MAAM,qBAAqB,MAAuB;AAC9C,QAAM,SAA0B,oBAAI,IAAI;AAExC,MAAI;AAEA,WAAO,QAAsB,uBAAuB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,IAAI,KAAK,KAAK,CAAC;AAAA,EAC1G,SAAS,GAAG;AACR,YAAQ,MAAM,2BAA2B,CAAC;AAAA,EAC9C;AAEA,SAAO;AACX;AAMO,SAAS,SACZ,MACA,QAC8C;AAC9C,QAAM,SAAS,mBAAmB;AAClC,QAAM,UAAU,OAAO,IAAI,IAAI;AAE/B,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,wBAAwB,IAAI,GAAG;AAAA,EACnD;AAEA,SAAO,IAAI,WAAW,MAAM,SAAS,QAAQ,gBAAgB,YAAY,MAAM,CAAC,EAAE,IAAI;AAG1F;","names":[]}
|
package/dist/message/error.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { MessageError } from "../types/message.js";
|
|
2
|
+
export declare class UnsupportedMessageTargetError extends Error {
|
|
3
|
+
readonly cause?: unknown;
|
|
4
|
+
constructor(message: string, cause?: unknown);
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
7
|
* Convert any thrown value into a transferable {@link MessageError} envelope. Handles real
|
|
4
8
|
* `Error` instances, error-like objects, and primitives (JSON-stringifying objects when no
|
|
@@ -10,3 +14,5 @@ export declare const serializeError: (error: unknown) => MessageError;
|
|
|
10
14
|
* back to its native constructor (so `instanceof TypeError` survives the boundary).
|
|
11
15
|
*/
|
|
12
16
|
export declare const restoreError: (error?: MessageError) => Error;
|
|
17
|
+
export declare const markRemoteMessageError: <T extends Error>(error: T) => T;
|
|
18
|
+
export declare const isRemoteMessageError: (error: unknown) => error is Error;
|
package/dist/message/error.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
const RemoteMessageErrorMarker = /* @__PURE__ */ Symbol("RemoteMessageError");
|
|
2
|
+
class UnsupportedMessageTargetError extends Error {
|
|
3
|
+
cause;
|
|
4
|
+
constructor(message, cause) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "UnsupportedMessageTargetError";
|
|
7
|
+
if (cause !== void 0) {
|
|
8
|
+
this.cause = cause;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
1
12
|
const build = (name, message, stack) => {
|
|
2
13
|
return stack ? { name, message, stack } : { name, message };
|
|
3
14
|
};
|
|
@@ -48,7 +59,17 @@ const restoreError = (error) => {
|
|
|
48
59
|
}
|
|
49
60
|
return restored;
|
|
50
61
|
};
|
|
62
|
+
const markRemoteMessageError = (error) => {
|
|
63
|
+
Object.defineProperty(error, RemoteMessageErrorMarker, { value: true });
|
|
64
|
+
return error;
|
|
65
|
+
};
|
|
66
|
+
const isRemoteMessageError = (error) => {
|
|
67
|
+
return error instanceof Error && error[RemoteMessageErrorMarker] === true;
|
|
68
|
+
};
|
|
51
69
|
export {
|
|
70
|
+
UnsupportedMessageTargetError,
|
|
71
|
+
isRemoteMessageError,
|
|
72
|
+
markRemoteMessageError,
|
|
52
73
|
restoreError,
|
|
53
74
|
serializeError
|
|
54
75
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/message/error.ts"],"sourcesContent":["import {MessageError} from \"@typing/message\";\n\nconst build = (name: string, message: string, stack?: string): MessageError => {\n return stack ? {name, message, stack} : {name, message};\n};\n\nconst stringify = (error: object): string => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst constructorFor = (name: string): new (message?: string) => Error => {\n switch (name) {\n case \"EvalError\":\n return EvalError;\n case \"RangeError\":\n return RangeError;\n case \"ReferenceError\":\n return ReferenceError;\n case \"SyntaxError\":\n return SyntaxError;\n case \"TypeError\":\n return TypeError;\n case \"URIError\":\n return URIError;\n default:\n return Error;\n }\n};\n\n/**\n * Convert any thrown value into a transferable {@link MessageError} envelope. Handles real\n * `Error` instances, error-like objects, and primitives (JSON-stringifying objects when no\n * `message` is present). The standard serialize step for every cross-context transport.\n */\nexport const serializeError = (error: unknown): MessageError => {\n if (error instanceof Error) {\n return build(error.name, error.message, error.stack);\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : \"Error\";\n const message = typeof record.message === \"string\" ? record.message : stringify(error);\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n\n return build(name, message, stack);\n }\n\n return build(\"Error\", String(error));\n};\n\n/**\n * Reconstruct an `Error` from a {@link MessageError} envelope, mapping the serialized `name`\n * back to its native constructor (so `instanceof TypeError` survives the boundary).\n */\nexport const restoreError = (error?: MessageError): Error => {\n const ErrorConstructor = constructorFor(error?.name ?? \"Error\");\n const restored = new ErrorConstructor(error?.message ?? \"Request failed.\");\n\n restored.name = error?.name || \"Error\";\n\n if (error?.stack) {\n restored.stack = error.stack;\n }\n\n return restored;\n};\n"],"mappings":"AAEA,MAAM,QAAQ,CAAC,MAAc,SAAiB,UAAiC;AAC3E,SAAO,QAAQ,EAAC,MAAM,SAAS,MAAK,IAAI,EAAC,MAAM,QAAO;AAC1D;AAEA,MAAM,YAAY,CAAC,UAA0B;AACzC,MAAI;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO,OAAO,KAAK;AAAA,EACvB;AACJ;AAEA,MAAM,iBAAiB,CAAC,SAAkD;AACtE,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;AAOO,MAAM,iBAAiB,CAAC,UAAiC;AAC5D,MAAI,iBAAiB,OAAO;AACxB,WAAO,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,KAAK;AAAA,EACvD;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,UAAM,SAAS;AACf,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,UAAU,KAAK;AACrF,UAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAEhE,WAAO,MAAM,MAAM,SAAS,KAAK;AAAA,EACrC;AAEA,SAAO,MAAM,SAAS,OAAO,KAAK,CAAC;AACvC;AAMO,MAAM,eAAe,CAAC,UAAgC;AACzD,QAAM,mBAAmB,gBAAe,+BAAO,SAAQ,OAAO;AAC9D,QAAM,WAAW,IAAI,kBAAiB,+BAAO,YAAW,iBAAiB;AAEzE,WAAS,QAAO,+BAAO,SAAQ;AAE/B,MAAI,+BAAO,OAAO;AACd,aAAS,QAAQ,MAAM;AAAA,EAC3B;AAEA,SAAO;AACX;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/message/error.ts"],"sourcesContent":["import {MessageError} from \"@typing/message\";\n\nconst RemoteMessageErrorMarker = Symbol(\"RemoteMessageError\");\n\nexport class UnsupportedMessageTargetError extends Error {\n public override readonly cause?: unknown;\n\n public constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"UnsupportedMessageTargetError\";\n\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nconst build = (name: string, message: string, stack?: string): MessageError => {\n return stack ? {name, message, stack} : {name, message};\n};\n\nconst stringify = (error: object): string => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n};\n\nconst constructorFor = (name: string): new (message?: string) => Error => {\n switch (name) {\n case \"EvalError\":\n return EvalError;\n case \"RangeError\":\n return RangeError;\n case \"ReferenceError\":\n return ReferenceError;\n case \"SyntaxError\":\n return SyntaxError;\n case \"TypeError\":\n return TypeError;\n case \"URIError\":\n return URIError;\n default:\n return Error;\n }\n};\n\n/**\n * Convert any thrown value into a transferable {@link MessageError} envelope. Handles real\n * `Error` instances, error-like objects, and primitives (JSON-stringifying objects when no\n * `message` is present). The standard serialize step for every cross-context transport.\n */\nexport const serializeError = (error: unknown): MessageError => {\n if (error instanceof Error) {\n return build(error.name, error.message, error.stack);\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : \"Error\";\n const message = typeof record.message === \"string\" ? record.message : stringify(error);\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n\n return build(name, message, stack);\n }\n\n return build(\"Error\", String(error));\n};\n\n/**\n * Reconstruct an `Error` from a {@link MessageError} envelope, mapping the serialized `name`\n * back to its native constructor (so `instanceof TypeError` survives the boundary).\n */\nexport const restoreError = (error?: MessageError): Error => {\n const ErrorConstructor = constructorFor(error?.name ?? \"Error\");\n const restored = new ErrorConstructor(error?.message ?? \"Request failed.\");\n\n restored.name = error?.name || \"Error\";\n\n if (error?.stack) {\n restored.stack = error.stack;\n }\n\n return restored;\n};\n\nexport const markRemoteMessageError = <T extends Error>(error: T): T => {\n Object.defineProperty(error, RemoteMessageErrorMarker, {value: true});\n\n return error;\n};\n\nexport const isRemoteMessageError = (error: unknown): error is Error => {\n return (\n error instanceof Error &&\n (error as Error & {[RemoteMessageErrorMarker]?: boolean})[RemoteMessageErrorMarker] === true\n );\n};\n"],"mappings":"AAEA,MAAM,2BAA2B,uBAAO,oBAAoB;AAErD,MAAM,sCAAsC,MAAM;AAAA,EAC5B;AAAA,EAElB,YAAY,SAAiB,OAAiB;AACjD,UAAM,OAAO;AACb,SAAK,OAAO;AAEZ,QAAI,UAAU,QAAW;AACrB,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AACJ;AAEA,MAAM,QAAQ,CAAC,MAAc,SAAiB,UAAiC;AAC3E,SAAO,QAAQ,EAAC,MAAM,SAAS,MAAK,IAAI,EAAC,MAAM,QAAO;AAC1D;AAEA,MAAM,YAAY,CAAC,UAA0B;AACzC,MAAI;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO,OAAO,KAAK;AAAA,EACvB;AACJ;AAEA,MAAM,iBAAiB,CAAC,SAAkD;AACtE,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;AAOO,MAAM,iBAAiB,CAAC,UAAiC;AAC5D,MAAI,iBAAiB,OAAO;AACxB,WAAO,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,KAAK;AAAA,EACvD;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,UAAM,SAAS;AACf,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,UAAU,KAAK;AACrF,UAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAEhE,WAAO,MAAM,MAAM,SAAS,KAAK;AAAA,EACrC;AAEA,SAAO,MAAM,SAAS,OAAO,KAAK,CAAC;AACvC;AAMO,MAAM,eAAe,CAAC,UAAgC;AACzD,QAAM,mBAAmB,gBAAe,+BAAO,SAAQ,OAAO;AAC9D,QAAM,WAAW,IAAI,kBAAiB,+BAAO,YAAW,iBAAiB;AAEzE,WAAS,QAAO,+BAAO,SAAQ;AAE/B,MAAI,+BAAO,OAAO;AACd,aAAS,QAAQ,MAAM;AAAA,EAC3B;AAEA,SAAO;AACX;AAEO,MAAM,yBAAyB,CAAkB,UAAgB;AACpE,SAAO,eAAe,OAAO,0BAA0B,EAAC,OAAO,KAAI,CAAC;AAEpE,SAAO;AACX;AAEO,MAAM,uBAAuB,CAAC,UAAmC;AACpE,SACI,iBAAiB,SAChB,MAAyD,wBAAwB,MAAM;AAEhG;","names":[]}
|
package/dist/message/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Message } from "./providers/index.js";
|
|
2
|
+
import { UnsupportedMessageTargetError } from "./error.js";
|
|
2
3
|
import { MessageData, MessageDictionary, MessageGeneralHandler, MessageMapHandler, MessageResponse, MessageSenderAware, MessageTargetHandler, MessageType, MessageSender, MessageSendOptions } from "../types/message.js";
|
|
3
4
|
export type { MessageData, MessageDictionary, MessageGeneralHandler, MessageMapHandler, MessageResponse, MessageTargetHandler, MessageType, MessageSendOptions, MessageSenderAware, MessageSender, };
|
|
4
|
-
export { Message };
|
|
5
|
+
export { Message, UnsupportedMessageTargetError };
|
|
5
6
|
export interface MessageRegistry extends MessageDictionary {
|
|
6
7
|
}
|
|
7
8
|
export declare function sendMessage<K extends MessageType<MessageRegistry>>(type: K, data: MessageData<MessageRegistry, K>, options?: MessageSendOptions): Promise<MessageResponse<MessageRegistry, K>>;
|
package/dist/message/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Message } from "./../message/providers/index.js";
|
|
2
|
+
import { UnsupportedMessageTargetError } from "./../message/error.js";
|
|
2
3
|
function sendMessage(type, data, options) {
|
|
3
4
|
return Message.getInstance().send(type, data, options);
|
|
4
5
|
}
|
|
@@ -7,6 +8,7 @@ function onMessage(arg1, arg2) {
|
|
|
7
8
|
}
|
|
8
9
|
export {
|
|
9
10
|
Message,
|
|
11
|
+
UnsupportedMessageTargetError,
|
|
10
12
|
onMessage,
|
|
11
13
|
sendMessage
|
|
12
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/message/index.ts"],"sourcesContent":["import {Message} from \"@message/providers\";\n\nimport {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageMapHandler,\n MessageResponse,\n MessageSenderAware,\n MessageTargetHandler,\n MessageType,\n MessageSender,\n MessageSendOptions,\n} from \"@typing/message\";\n\nexport type {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageMapHandler,\n MessageResponse,\n MessageTargetHandler,\n MessageType,\n MessageSendOptions,\n MessageSenderAware,\n MessageSender,\n};\n\nexport {Message};\n\nexport interface MessageRegistry extends MessageDictionary {}\n\nexport function sendMessage<K extends MessageType<MessageRegistry>>(\n type: K,\n data: MessageData<MessageRegistry, K>,\n options?: MessageSendOptions\n): Promise<MessageResponse<MessageRegistry, K>> {\n return Message.getInstance<MessageRegistry>().send(type, data, options);\n}\n\nexport function onMessage<K extends MessageType<MessageRegistry>>(\n type: K,\n handler: MessageTargetHandler<MessageRegistry, K>\n): () => void;\n\nexport function onMessage<K extends MessageType<MessageRegistry>>(\n handler: MessageGeneralHandler<MessageRegistry, K>\n): () => void;\n\nexport function onMessage(map: MessageMapHandler<MessageRegistry>): () => void;\n\nexport function onMessage<K extends MessageType<MessageRegistry>>(\n arg1: K | MessageMapHandler<MessageRegistry> | MessageGeneralHandler<MessageRegistry, K>,\n arg2?: MessageTargetHandler<MessageRegistry, K>\n): () => void {\n return Message.getInstance<MessageRegistry>().watch(arg1, arg2);\n}\n"],"mappings":"AAAA,SAAQ,eAAc;
|
|
1
|
+
{"version":3,"sources":["../../src/message/index.ts"],"sourcesContent":["import {Message} from \"@message/providers\";\nimport {UnsupportedMessageTargetError} from \"@message/error\";\n\nimport {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageMapHandler,\n MessageResponse,\n MessageSenderAware,\n MessageTargetHandler,\n MessageType,\n MessageSender,\n MessageSendOptions,\n} from \"@typing/message\";\n\nexport type {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageMapHandler,\n MessageResponse,\n MessageTargetHandler,\n MessageType,\n MessageSendOptions,\n MessageSenderAware,\n MessageSender,\n};\n\nexport {Message, UnsupportedMessageTargetError};\n\nexport interface MessageRegistry extends MessageDictionary {}\n\nexport function sendMessage<K extends MessageType<MessageRegistry>>(\n type: K,\n data: MessageData<MessageRegistry, K>,\n options?: MessageSendOptions\n): Promise<MessageResponse<MessageRegistry, K>> {\n return Message.getInstance<MessageRegistry>().send(type, data, options);\n}\n\nexport function onMessage<K extends MessageType<MessageRegistry>>(\n type: K,\n handler: MessageTargetHandler<MessageRegistry, K>\n): () => void;\n\nexport function onMessage<K extends MessageType<MessageRegistry>>(\n handler: MessageGeneralHandler<MessageRegistry, K>\n): () => void;\n\nexport function onMessage(map: MessageMapHandler<MessageRegistry>): () => void;\n\nexport function onMessage<K extends MessageType<MessageRegistry>>(\n arg1: K | MessageMapHandler<MessageRegistry> | MessageGeneralHandler<MessageRegistry, K>,\n arg2?: MessageTargetHandler<MessageRegistry, K>\n): () => void {\n return Message.getInstance<MessageRegistry>().watch(arg1, arg2);\n}\n"],"mappings":"AAAA,SAAQ,eAAc;AACtB,SAAQ,qCAAoC;AAgCrC,SAAS,YACZ,MACA,MACA,SAC4C;AAC5C,SAAO,QAAQ,YAA6B,EAAE,KAAK,MAAM,MAAM,OAAO;AAC1E;AAaO,SAAS,UACZ,MACA,MACU;AACV,SAAO,QAAQ,YAA6B,EAAE,MAAM,MAAM,IAAI;AAClE;","names":[]}
|
|
@@ -2,12 +2,15 @@ import { MessageData, MessageDictionary, MessageGeneralHandler, MessageMapHandle
|
|
|
2
2
|
import AbstractMessage from "./AbstractMessage.js";
|
|
3
3
|
import MessageManager from "../MessageManager.js";
|
|
4
4
|
export default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {
|
|
5
|
+
private static readonly FirefoxDocumentIdMinVersion;
|
|
5
6
|
private static instance;
|
|
7
|
+
private firefoxDocumentIdVersion?;
|
|
6
8
|
static getInstance<T extends MessageDictionary>(): Message<MessageDictionary>;
|
|
7
9
|
protected get manager(): MessageManager<T>;
|
|
8
10
|
send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: MessageSendOptions): Promise<MessageResponse<T, K>>;
|
|
9
11
|
private dispatch;
|
|
10
12
|
private unwrap;
|
|
13
|
+
private assertFirefoxDocumentTargetSupport;
|
|
11
14
|
private isMessageResult;
|
|
12
15
|
private isSerializedError;
|
|
13
16
|
private isRecord;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { sendMessage, sendTabMessage } from "@addon-core/browser";
|
|
2
|
-
import { restoreError } from "../error.js";
|
|
1
|
+
import { getBrowserInfo, sendMessage, sendTabMessage } from "@addon-core/browser";
|
|
2
|
+
import { markRemoteMessageError, restoreError, UnsupportedMessageTargetError } from "../error.js";
|
|
3
3
|
import { isBrowser } from "./../../main/env.js";
|
|
4
4
|
import {
|
|
5
5
|
MessageResultEnvelopeProperty
|
|
@@ -9,7 +9,9 @@ import AbstractMessage from "./AbstractMessage.js";
|
|
|
9
9
|
import MessageManager from "../MessageManager.js";
|
|
10
10
|
import { GeneralHandler, MapHandler, SingleHandler } from "../handlers/index.js";
|
|
11
11
|
class Message extends AbstractMessage {
|
|
12
|
+
static FirefoxDocumentIdMinVersion = 153;
|
|
12
13
|
static instance = null;
|
|
14
|
+
firefoxDocumentIdVersion;
|
|
13
15
|
static getInstance() {
|
|
14
16
|
return this.instance ?? (this.instance = new Message());
|
|
15
17
|
}
|
|
@@ -21,7 +23,7 @@ class Message extends AbstractMessage {
|
|
|
21
23
|
const response = await this.dispatch(message, options);
|
|
22
24
|
return this.unwrap(response);
|
|
23
25
|
}
|
|
24
|
-
dispatch(message, options) {
|
|
26
|
+
async dispatch(message, options) {
|
|
25
27
|
if (options === void 0) {
|
|
26
28
|
return sendMessage(message);
|
|
27
29
|
}
|
|
@@ -29,8 +31,8 @@ class Message extends AbstractMessage {
|
|
|
29
31
|
return sendTabMessage(options, message);
|
|
30
32
|
}
|
|
31
33
|
const { tabId, ...other } = options;
|
|
32
|
-
if (isBrowser(Browser.Firefox)) {
|
|
33
|
-
|
|
34
|
+
if (other.documentId !== void 0 && isBrowser(Browser.Firefox)) {
|
|
35
|
+
await this.assertFirefoxDocumentTargetSupport();
|
|
34
36
|
}
|
|
35
37
|
return sendTabMessage(tabId, message, other);
|
|
36
38
|
}
|
|
@@ -41,7 +43,35 @@ class Message extends AbstractMessage {
|
|
|
41
43
|
if (response.ok) {
|
|
42
44
|
return response.payload;
|
|
43
45
|
}
|
|
44
|
-
throw restoreError(response.error);
|
|
46
|
+
throw markRemoteMessageError(restoreError(response.error));
|
|
47
|
+
}
|
|
48
|
+
async assertFirefoxDocumentTargetSupport() {
|
|
49
|
+
this.firefoxDocumentIdVersion ?? (this.firefoxDocumentIdVersion = getBrowserInfo().then((info) => {
|
|
50
|
+
const major = Number.parseInt(info.version.split(".")[0], 10);
|
|
51
|
+
if (!Number.isInteger(major)) {
|
|
52
|
+
throw new UnsupportedMessageTargetError(
|
|
53
|
+
`Cannot determine whether Firefox ${JSON.stringify(info.version)} supports documentId message targets.`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return { major, version: info.version };
|
|
57
|
+
}));
|
|
58
|
+
let browserVersion;
|
|
59
|
+
try {
|
|
60
|
+
browserVersion = await this.firefoxDocumentIdVersion;
|
|
61
|
+
} catch (error) {
|
|
62
|
+
if (error instanceof UnsupportedMessageTargetError) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
throw new UnsupportedMessageTargetError(
|
|
66
|
+
"Cannot determine whether the current Firefox version supports documentId message targets.",
|
|
67
|
+
error
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
if (browserVersion.major < Message.FirefoxDocumentIdMinVersion) {
|
|
71
|
+
throw new UnsupportedMessageTargetError(
|
|
72
|
+
`Messaging by documentId requires Firefox ${Message.FirefoxDocumentIdMinVersion} or newer; current version is ${browserVersion.version}.`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
45
75
|
}
|
|
46
76
|
isMessageResult(response) {
|
|
47
77
|
if (!this.isRecord(response) || response[MessageResultEnvelopeProperty] !== true || typeof response.ok !== "boolean") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/message/providers/Message.ts"],"sourcesContent":["import {sendMessage, sendTabMessage} from \"@addon-core/browser\";\n\nimport {restoreError} from \"../error\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport {\n MessageBody,\n MessageData,\n MessageDictionary,\n MessageError,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResult,\n MessageResultEnvelopeProperty,\n MessageResponse,\n MessageSendOptions,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\nimport {Browser} from \"@typing/browser\";\n\nimport AbstractMessage from \"./AbstractMessage\";\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {\n private static instance: Message<MessageDictionary> | null = null;\n\n public static getInstance<T extends MessageDictionary>() {\n return (this.instance ??= new Message<T>());\n }\n\n protected get manager(): MessageManager<T> {\n return MessageManager.getInstance<T>();\n }\n\n public async send<K extends MessageType<T>>(\n type: K,\n data: MessageData<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n const response = await this.dispatch(message, options);\n\n return this.unwrap(response);\n }\n\n private dispatch<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined> {\n if (options === undefined) {\n return sendMessage(message);\n }\n\n if (typeof options === \"number\") {\n return sendTabMessage(options, message);\n }\n\n const {tabId, ...other} = options;\n\n if (isBrowser(Browser.Firefox)) {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/message/providers/Message.ts"],"sourcesContent":["import {getBrowserInfo, sendMessage, sendTabMessage} from \"@addon-core/browser\";\n\nimport {markRemoteMessageError, restoreError, UnsupportedMessageTargetError} from \"../error\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport {\n MessageBody,\n MessageData,\n MessageDictionary,\n MessageError,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResult,\n MessageResultEnvelopeProperty,\n MessageResponse,\n MessageSendOptions,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\nimport {Browser} from \"@typing/browser\";\n\nimport AbstractMessage from \"./AbstractMessage\";\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {\n private static readonly FirefoxDocumentIdMinVersion = 153;\n private static instance: Message<MessageDictionary> | null = null;\n private firefoxDocumentIdVersion?: Promise<{major: number; version: string}>;\n\n public static getInstance<T extends MessageDictionary>() {\n return (this.instance ??= new Message<T>());\n }\n\n protected get manager(): MessageManager<T> {\n return MessageManager.getInstance<T>();\n }\n\n public async send<K extends MessageType<T>>(\n type: K,\n data: MessageData<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n const response = await this.dispatch(message, options);\n\n return this.unwrap(response);\n }\n\n private async dispatch<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined> {\n if (options === undefined) {\n return sendMessage(message);\n }\n\n if (typeof options === \"number\") {\n return sendTabMessage(options, message);\n }\n\n const {tabId, ...other} = options;\n\n if (other.documentId !== undefined && isBrowser(Browser.Firefox)) {\n await this.assertFirefoxDocumentTargetSupport();\n }\n\n return sendTabMessage(tabId, message, other);\n }\n\n private unwrap<K extends MessageType<T>>(\n response: MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined\n ): MessageResponse<T, K> {\n if (!this.isMessageResult(response)) {\n return response as MessageResponse<T, K>;\n }\n\n if (response.ok) {\n return response.payload;\n }\n\n throw markRemoteMessageError(restoreError(response.error));\n }\n\n private async assertFirefoxDocumentTargetSupport(): Promise<void> {\n this.firefoxDocumentIdVersion ??= getBrowserInfo().then(info => {\n const major = Number.parseInt(info.version.split(\".\")[0], 10);\n\n if (!Number.isInteger(major)) {\n throw new UnsupportedMessageTargetError(\n `Cannot determine whether Firefox ${JSON.stringify(info.version)} supports documentId message targets.`\n );\n }\n\n return {major, version: info.version};\n });\n\n let browserVersion: {major: number; version: string};\n\n try {\n browserVersion = await this.firefoxDocumentIdVersion;\n } catch (error) {\n if (error instanceof UnsupportedMessageTargetError) {\n throw error;\n }\n\n throw new UnsupportedMessageTargetError(\n \"Cannot determine whether the current Firefox version supports documentId message targets.\",\n error\n );\n }\n\n if (browserVersion.major < Message.FirefoxDocumentIdMinVersion) {\n throw new UnsupportedMessageTargetError(\n `Messaging by documentId requires Firefox ${Message.FirefoxDocumentIdMinVersion} or newer; current version is ${browserVersion.version}.`\n );\n }\n }\n\n private isMessageResult(response: unknown): response is MessageResult {\n if (\n !this.isRecord(response) ||\n response[MessageResultEnvelopeProperty] !== true ||\n typeof response.ok !== \"boolean\"\n ) {\n return false;\n }\n\n if (response.ok) {\n return \"payload\" in response;\n }\n\n return this.isSerializedError(response.error);\n }\n\n private isSerializedError(error: unknown): error is MessageError {\n return (\n this.isRecord(error) &&\n typeof error.name === \"string\" &&\n typeof error.message === \"string\" &&\n (error.stack === undefined || typeof error.stack === \"string\")\n );\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n }\n\n public watch<K extends MessageType<T>>(\n arg1: K | MessageMapHandler<T> | MessageGeneralHandler<T, K>,\n arg2?: MessageTargetHandler<T, K>\n ): () => void {\n let handler: MessageHandler<T>;\n\n if (typeof arg1 === \"function\") {\n handler = new GeneralHandler<T, K>(arg1);\n } else if (typeof arg1 === \"object\" && arg2 === undefined) {\n handler = new MapHandler<T>(arg1);\n } else if (typeof arg1 === \"string\" && arg2) {\n handler = new SingleHandler<T>(arg1, arg2);\n } else {\n throw new Error(\"Invalid arguments passed to watch()\");\n }\n\n this.manager.add(handler);\n\n return () => this.manager.remove(handler);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import ProxyTransport from "../../transport/ProxyTransport.js";
|
|
2
|
-
import {
|
|
2
|
+
import { RpcAsyncProxy } from "../../types/rpc.js";
|
|
3
3
|
import { TransportDictionary, TransportManager, TransportMessage, TransportName } from "../../types/transport.js";
|
|
4
4
|
type CreateParameters = chrome.offscreen.CreateParameters;
|
|
5
|
-
export default class ProxyOffscreen<N extends TransportName, T =
|
|
5
|
+
export default class ProxyOffscreen<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
|
|
6
6
|
private parameters;
|
|
7
7
|
protected message: TransportMessage;
|
|
8
8
|
constructor(name: N, parameters: CreateParameters);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/offscreen/providers/ProxyOffscreen.ts"],"sourcesContent":["import {closeOffscreen, createOffscreen, hasOffscreen, hasOffscreenPath, isManifestVersion3} from \"@addon-core/browser\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport ProxyTransport from \"@transport/ProxyTransport\";\n\nimport OffscreenManager from \"../OffscreenManager\";\nimport OffscreenMessage from \"../OffscreenMessage\";\nimport OffscreenBridge from \"../OffscreenBridge\";\n\nimport {isOffscreen} from \"../utils\";\n\nimport {Browser} from \"@typing/browser\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/offscreen/providers/ProxyOffscreen.ts"],"sourcesContent":["import {closeOffscreen, createOffscreen, hasOffscreen, hasOffscreenPath, isManifestVersion3} from \"@addon-core/browser\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport ProxyTransport from \"@transport/ProxyTransport\";\n\nimport OffscreenManager from \"../OffscreenManager\";\nimport OffscreenMessage from \"../OffscreenMessage\";\nimport OffscreenBridge from \"../OffscreenBridge\";\n\nimport {isOffscreen} from \"../utils\";\n\nimport {Browser} from \"@typing/browser\";\nimport {RpcAsyncProxy} from \"@typing/rpc\";\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\n\ntype CreateParameters = chrome.offscreen.CreateParameters;\ntype ReleaseLock = () => void;\n\nconst GateLockName = \"adnbn:offscreen:gate\";\nconst ActiveLockName = \"adnbn:offscreen:active\";\n\nexport default class ProxyOffscreen<\n N extends TransportName,\n T = RpcAsyncProxy<TransportDictionary[N]>,\n> extends ProxyTransport<N, T> {\n protected message: TransportMessage;\n\n constructor(\n name: N,\n private parameters: CreateParameters\n ) {\n super(name);\n\n this.message = new OffscreenMessage(name);\n }\n\n protected manager(): TransportManager {\n return OffscreenManager.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n if (!isManifestVersion3() || isBrowser(Browser.Firefox)) {\n await OffscreenBridge.createOffscreen(this.parameters);\n\n return this.message.send({path, args});\n }\n\n const release = await this.acquire(this.parameters);\n\n try {\n return await this.message.send({path, args});\n } finally {\n release();\n }\n }\n\n private async acquire(parameters: CreateParameters): Promise<ReleaseLock> {\n return navigator.locks.request(GateLockName, {mode: \"exclusive\"}, async () => {\n if (await hasOffscreenPath(parameters.url)) {\n return this.acquireLock(ActiveLockName, {mode: \"shared\"});\n }\n\n const releaseActive = await this.acquireLock(ActiveLockName, {mode: \"exclusive\"});\n\n try {\n if (!(await hasOffscreenPath(parameters.url))) {\n if (await hasOffscreen()) {\n await closeOffscreen();\n }\n\n await createOffscreen(parameters);\n }\n } finally {\n releaseActive();\n }\n\n return this.acquireLock(ActiveLockName, {mode: \"shared\"});\n });\n }\n\n private async acquireLock(name: string, options: LockOptions): Promise<ReleaseLock> {\n let releaseLock!: ReleaseLock;\n\n // Keep the Web Lock callback pending and expose its resolver as a manual release function.\n const lockHeld = new Promise<void>(resolve => {\n releaseLock = resolve;\n });\n\n return new Promise<ReleaseLock>((resolve, reject) => {\n navigator.locks\n .request(name, options, async () => {\n resolve(releaseLock);\n\n await lockHeld;\n })\n .catch(reject);\n });\n }\n\n public get(): T {\n if (isOffscreen()) {\n throw new Error(\n `You are trying to get proxy offscreen service \"${this.name}\" from offscreen. You can get original offscreen service instead`\n );\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,SAAQ,gBAAgB,iBAAiB,cAAc,kBAAkB,0BAAyB;AAElG,SAAQ,iBAAgB;AAExB,OAAO,oBAAoB;AAE3B,OAAO,sBAAsB;AAC7B,OAAO,sBAAsB;AAC7B,OAAO,qBAAqB;AAE5B,SAAQ,mBAAkB;AAE1B,SAAQ,eAAc;AAOtB,MAAM,eAAe;AACrB,MAAM,iBAAiB;AAEvB,MAAO,uBAGG,eAAqB;AAAA,EAG3B,YACI,MACQ,YACV;AACE,UAAM,IAAI;AAFF;AAIR,SAAK,UAAU,IAAI,iBAAiB,IAAI;AAAA,EAC5C;AAAA,EALY;AAAA,EAJF;AAAA,EAWA,UAA4B;AAClC,WAAO,iBAAiB,YAAY;AAAA,EACxC;AAAA,EAEA,MAAgB,MAAM,MAAa,MAA6B;AAC5D,QAAI,CAAC,mBAAmB,KAAK,UAAU,QAAQ,OAAO,GAAG;AACrD,YAAM,gBAAgB,gBAAgB,KAAK,UAAU;AAErD,aAAO,KAAK,QAAQ,KAAK,EAAC,MAAM,KAAI,CAAC;AAAA,IACzC;AAEA,UAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,UAAU;AAElD,QAAI;AACA,aAAO,MAAM,KAAK,QAAQ,KAAK,EAAC,MAAM,KAAI,CAAC;AAAA,IAC/C,UAAE;AACE,cAAQ;AAAA,IACZ;AAAA,EACJ;AAAA,EAEA,MAAc,QAAQ,YAAoD;AACtE,WAAO,UAAU,MAAM,QAAQ,cAAc,EAAC,MAAM,YAAW,GAAG,YAAY;AAC1E,UAAI,MAAM,iBAAiB,WAAW,GAAG,GAAG;AACxC,eAAO,KAAK,YAAY,gBAAgB,EAAC,MAAM,SAAQ,CAAC;AAAA,MAC5D;AAEA,YAAM,gBAAgB,MAAM,KAAK,YAAY,gBAAgB,EAAC,MAAM,YAAW,CAAC;AAEhF,UAAI;AACA,YAAI,CAAE,MAAM,iBAAiB,WAAW,GAAG,GAAI;AAC3C,cAAI,MAAM,aAAa,GAAG;AACtB,kBAAM,eAAe;AAAA,UACzB;AAEA,gBAAM,gBAAgB,UAAU;AAAA,QACpC;AAAA,MACJ,UAAE;AACE,sBAAc;AAAA,MAClB;AAEA,aAAO,KAAK,YAAY,gBAAgB,EAAC,MAAM,SAAQ,CAAC;AAAA,IAC5D,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,YAAY,MAAc,SAA4C;AAChF,QAAI;AAGJ,UAAM,WAAW,IAAI,QAAc,aAAW;AAC1C,oBAAc;AAAA,IAClB,CAAC;AAED,WAAO,IAAI,QAAqB,CAAC,SAAS,WAAW;AACjD,gBAAU,MACL,QAAQ,MAAM,SAAS,YAAY;AAChC,gBAAQ,WAAW;AAEnB,cAAM;AAAA,MACV,CAAC,EACA,MAAM,MAAM;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EAEO,MAAS;AACZ,QAAI,YAAY,GAAG;AACf,YAAM,IAAI;AAAA,QACN,kDAAkD,KAAK,IAAI;AAAA,MAC/D;AAAA,IACJ;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
|
|
@@ -4,11 +4,14 @@ export interface RelayPermissionValue {
|
|
|
4
4
|
allow: boolean;
|
|
5
5
|
permissions?: Permissions;
|
|
6
6
|
}
|
|
7
|
+
export declare const RelayPermissionGlobalKey = "adnbnRelayPermission";
|
|
7
8
|
export default class RelayPermission {
|
|
8
|
-
private static _instance?;
|
|
9
9
|
private permissions;
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
private started;
|
|
11
|
+
private constructor();
|
|
12
|
+
private configure;
|
|
13
|
+
static getInstance(relays: RelayOptionsMap): RelayPermission;
|
|
14
|
+
start(): this;
|
|
12
15
|
set(name: string, value: Partial<RelayPermissionValue>): this;
|
|
13
16
|
get(name: string): RelayPermissionValue | undefined;
|
|
14
17
|
has(name: string): boolean;
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { containsPermissions, onPermissionsAdded, onPermissionsRemoved, requestPermissions } from "@addon-core/browser";
|
|
2
2
|
import { RelayMethod } from "./../types/relay.js";
|
|
3
3
|
import { ContentScriptDeclarative } from "./../types/content.js";
|
|
4
|
+
const RelayPermissionGlobalKey = "adnbnRelayPermission";
|
|
4
5
|
class RelayPermission {
|
|
5
|
-
static _instance;
|
|
6
6
|
permissions = /* @__PURE__ */ new Map();
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
started = false;
|
|
8
|
+
constructor(relays) {
|
|
9
|
+
this.configure(relays);
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
-
if (this._instance || relays.size === 0) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
const instance = RelayPermission.getInstance();
|
|
11
|
+
configure(relays) {
|
|
15
12
|
for (const [name, { declarative, method, matches }] of relays) {
|
|
16
13
|
if (declarative === false && method === RelayMethod.Scripting) {
|
|
17
14
|
console.warn(
|
|
@@ -23,12 +20,30 @@ class RelayPermission {
|
|
|
23
20
|
origins: !declarative || declarative === ContentScriptDeclarative.Optional ? matches : [],
|
|
24
21
|
permissions: ["scripting"]
|
|
25
22
|
};
|
|
26
|
-
|
|
23
|
+
this.set(name, { allow, permissions });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
static getInstance(relays) {
|
|
27
|
+
const current = globalThis[RelayPermissionGlobalKey];
|
|
28
|
+
if (current) {
|
|
29
|
+
return current;
|
|
27
30
|
}
|
|
28
|
-
const
|
|
31
|
+
const instance = new RelayPermission(relays);
|
|
32
|
+
globalThis[RelayPermissionGlobalKey] = instance;
|
|
33
|
+
return instance.start();
|
|
34
|
+
}
|
|
35
|
+
start() {
|
|
36
|
+
if (this.started) {
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
this.started = true;
|
|
40
|
+
const checkPermissions = () => {
|
|
41
|
+
void this.check().catch((error) => console.error(error));
|
|
42
|
+
};
|
|
29
43
|
onPermissionsAdded(checkPermissions);
|
|
30
44
|
onPermissionsRemoved(checkPermissions);
|
|
31
|
-
checkPermissions()
|
|
45
|
+
checkPermissions();
|
|
46
|
+
return this;
|
|
32
47
|
}
|
|
33
48
|
set(name, value) {
|
|
34
49
|
const relayPermissions = this.get(name) || { allow: false, permissions: {} };
|
|
@@ -70,10 +85,11 @@ class RelayPermission {
|
|
|
70
85
|
return allow;
|
|
71
86
|
}
|
|
72
87
|
async check() {
|
|
73
|
-
await Promise.allSettled(
|
|
88
|
+
await Promise.allSettled([...this.permissions.keys()].map((name) => this.contains(name)));
|
|
74
89
|
}
|
|
75
90
|
}
|
|
76
91
|
export {
|
|
92
|
+
RelayPermissionGlobalKey,
|
|
77
93
|
RelayPermission as default
|
|
78
94
|
};
|
|
79
95
|
//# sourceMappingURL=RelayPermission.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/relay/RelayPermission.ts"],"sourcesContent":["import {containsPermissions, onPermissionsAdded, onPermissionsRemoved, requestPermissions} from \"@addon-core/browser\";\n\nimport {RelayMethod, RelayOptionsMap} from \"@typing/relay\";\nimport {ContentScriptDeclarative} from \"@typing/content\";\n\ntype Permissions = chrome.permissions.Permissions;\n\nexport interface RelayPermissionValue {\n allow: boolean;\n permissions?: Permissions;\n}\n\nexport
|
|
1
|
+
{"version":3,"sources":["../../src/relay/RelayPermission.ts"],"sourcesContent":["import {containsPermissions, onPermissionsAdded, onPermissionsRemoved, requestPermissions} from \"@addon-core/browser\";\n\nimport {RelayMethod, RelayOptionsMap} from \"@typing/relay\";\nimport {ContentScriptDeclarative} from \"@typing/content\";\n\ntype Permissions = chrome.permissions.Permissions;\n\nexport interface RelayPermissionValue {\n allow: boolean;\n permissions?: Permissions;\n}\n\nexport const RelayPermissionGlobalKey = \"adnbnRelayPermission\";\n\nexport default class RelayPermission {\n private permissions = new Map<string, RelayPermissionValue>();\n private started = false;\n\n private constructor(relays: RelayOptionsMap) {\n this.configure(relays);\n }\n\n private configure(relays: RelayOptionsMap): void {\n for (const [name, {declarative, method, matches}] of relays) {\n if (declarative === false && method === RelayMethod.Scripting) {\n console.warn(\n `Relay \"${name}\" has invalid configuration: \"scripting\" method cannot work with declarative = false.`\n );\n }\n\n const allow: boolean =\n declarative === true ||\n declarative === ContentScriptDeclarative.Required ||\n method === RelayMethod.Messaging;\n\n const permissions: Permissions | undefined =\n method === RelayMethod.Messaging\n ? undefined\n : {\n origins: !declarative || declarative === ContentScriptDeclarative.Optional ? matches : [],\n permissions: [\"scripting\"],\n };\n\n this.set(name, {allow, permissions});\n }\n }\n\n public static getInstance(relays: RelayOptionsMap): RelayPermission {\n const current = globalThis[RelayPermissionGlobalKey] as RelayPermission | undefined;\n\n if (current) {\n return current;\n }\n\n const instance = new RelayPermission(relays);\n\n globalThis[RelayPermissionGlobalKey] = instance;\n\n return instance.start();\n }\n\n public start(): this {\n if (this.started) {\n return this;\n }\n\n this.started = true;\n\n const checkPermissions = (): void => {\n void this.check().catch(error => console.error(error));\n };\n\n onPermissionsAdded(checkPermissions);\n onPermissionsRemoved(checkPermissions);\n checkPermissions();\n\n return this;\n }\n\n public set(name: string, value: Partial<RelayPermissionValue>): this {\n const relayPermissions = this.get(name) || {allow: false, permissions: {}};\n\n this.permissions.set(name, {...relayPermissions, ...value});\n\n return this;\n }\n\n public get(name: string): RelayPermissionValue | undefined {\n return this.permissions.get(name);\n }\n\n public has(name: string): boolean {\n return this.permissions.has(name);\n }\n\n public allow(name: string): boolean {\n return this.get(name)?.allow ?? false;\n }\n\n public async contains(name: string): Promise<boolean> {\n const relayPermissions = this.get(name);\n\n if (!relayPermissions) {\n throw new Error(`RelayPermission, relay \"${name}\" not found`);\n }\n\n if (!relayPermissions.permissions) {\n return true;\n }\n\n const allow = await containsPermissions(relayPermissions.permissions);\n\n this.set(name, {allow});\n\n return allow;\n }\n\n public async request(name: string): Promise<boolean> {\n const relayPermissions = this.get(name);\n\n if (!relayPermissions) {\n throw new Error(`RelayPermission, relay \"${name}\" not found`);\n }\n\n if (!relayPermissions.permissions) {\n return true;\n }\n\n const allow = await requestPermissions(relayPermissions.permissions);\n\n this.set(name, {allow});\n\n return allow;\n }\n\n private async check(): Promise<void> {\n await Promise.allSettled([...this.permissions.keys()].map(name => this.contains(name)));\n }\n}\n"],"mappings":"AAAA,SAAQ,qBAAqB,oBAAoB,sBAAsB,0BAAyB;AAEhG,SAAQ,mBAAmC;AAC3C,SAAQ,gCAA+B;AAShC,MAAM,2BAA2B;AAExC,MAAO,gBAA8B;AAAA,EACzB,cAAc,oBAAI,IAAkC;AAAA,EACpD,UAAU;AAAA,EAEV,YAAY,QAAyB;AACzC,SAAK,UAAU,MAAM;AAAA,EACzB;AAAA,EAEQ,UAAU,QAA+B;AAC7C,eAAW,CAAC,MAAM,EAAC,aAAa,QAAQ,QAAO,CAAC,KAAK,QAAQ;AACzD,UAAI,gBAAgB,SAAS,WAAW,YAAY,WAAW;AAC3D,gBAAQ;AAAA,UACJ,UAAU,IAAI;AAAA,QAClB;AAAA,MACJ;AAEA,YAAM,QACF,gBAAgB,QAChB,gBAAgB,yBAAyB,YACzC,WAAW,YAAY;AAE3B,YAAM,cACF,WAAW,YAAY,YACjB,SACA;AAAA,QACI,SAAS,CAAC,eAAe,gBAAgB,yBAAyB,WAAW,UAAU,CAAC;AAAA,QACxF,aAAa,CAAC,WAAW;AAAA,MAC7B;AAEV,WAAK,IAAI,MAAM,EAAC,OAAO,YAAW,CAAC;AAAA,IACvC;AAAA,EACJ;AAAA,EAEA,OAAc,YAAY,QAA0C;AAChE,UAAM,UAAU,WAAW,wBAAwB;AAEnD,QAAI,SAAS;AACT,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,IAAI,gBAAgB,MAAM;AAE3C,eAAW,wBAAwB,IAAI;AAEvC,WAAO,SAAS,MAAM;AAAA,EAC1B;AAAA,EAEO,QAAc;AACjB,QAAI,KAAK,SAAS;AACd,aAAO;AAAA,IACX;AAEA,SAAK,UAAU;AAEf,UAAM,mBAAmB,MAAY;AACjC,WAAK,KAAK,MAAM,EAAE,MAAM,WAAS,QAAQ,MAAM,KAAK,CAAC;AAAA,IACzD;AAEA,uBAAmB,gBAAgB;AACnC,yBAAqB,gBAAgB;AACrC,qBAAiB;AAEjB,WAAO;AAAA,EACX;AAAA,EAEO,IAAI,MAAc,OAA4C;AACjE,UAAM,mBAAmB,KAAK,IAAI,IAAI,KAAK,EAAC,OAAO,OAAO,aAAa,CAAC,EAAC;AAEzE,SAAK,YAAY,IAAI,MAAM,EAAC,GAAG,kBAAkB,GAAG,MAAK,CAAC;AAE1D,WAAO;AAAA,EACX;AAAA,EAEO,IAAI,MAAgD;AACvD,WAAO,KAAK,YAAY,IAAI,IAAI;AAAA,EACpC;AAAA,EAEO,IAAI,MAAuB;AAC9B,WAAO,KAAK,YAAY,IAAI,IAAI;AAAA,EACpC;AAAA,EAEO,MAAM,MAAuB;AA/FxC;AAgGQ,aAAO,UAAK,IAAI,IAAI,MAAb,mBAAgB,UAAS;AAAA,EACpC;AAAA,EAEA,MAAa,SAAS,MAAgC;AAClD,UAAM,mBAAmB,KAAK,IAAI,IAAI;AAEtC,QAAI,CAAC,kBAAkB;AACnB,YAAM,IAAI,MAAM,2BAA2B,IAAI,aAAa;AAAA,IAChE;AAEA,QAAI,CAAC,iBAAiB,aAAa;AAC/B,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,MAAM,oBAAoB,iBAAiB,WAAW;AAEpE,SAAK,IAAI,MAAM,EAAC,MAAK,CAAC;AAEtB,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,QAAQ,MAAgC;AACjD,UAAM,mBAAmB,KAAK,IAAI,IAAI;AAEtC,QAAI,CAAC,kBAAkB;AACnB,YAAM,IAAI,MAAM,2BAA2B,IAAI,aAAa;AAAA,IAChE;AAEA,QAAI,CAAC,iBAAiB,aAAa;AAC/B,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,MAAM,mBAAmB,iBAAiB,WAAW;AAEnE,SAAK,IAAI,MAAM,EAAC,MAAK,CAAC;AAEtB,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,QAAuB;AACjC,UAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,EAAE,IAAI,UAAQ,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,EAC1F;AACJ;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type RelayBatchOptions, type RelayCallOptions } from "../../types/relay.js";
|
|
2
|
+
export default abstract class RelayAdapter {
|
|
3
|
+
protected readonly name: string;
|
|
4
|
+
protected readonly target: RelayCallOptions;
|
|
5
|
+
protected constructor(name: string, target: RelayCallOptions);
|
|
6
|
+
protected isBatchTarget(target: RelayCallOptions): target is RelayBatchOptions;
|
|
7
|
+
abstract invoke(args: any[], path?: string): Promise<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RelayAllFrames } from "./../../types/relay.js";
|
|
2
|
+
class RelayAdapter {
|
|
3
|
+
constructor(name, target) {
|
|
4
|
+
this.name = name;
|
|
5
|
+
this.target = target;
|
|
6
|
+
}
|
|
7
|
+
name;
|
|
8
|
+
target;
|
|
9
|
+
isBatchTarget(target) {
|
|
10
|
+
return target.allFrames === true || target.allFrames === RelayAllFrames.Any || target.allFrames === RelayAllFrames.All || target.frameIds !== void 0 || target.documentIds !== void 0;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
RelayAdapter as default
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=RelayAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/relay/adapters/RelayAdapter.ts"],"sourcesContent":["import {RelayAllFrames, type RelayBatchOptions, type RelayCallOptions} from \"@typing/relay\";\n\nexport default abstract class RelayAdapter {\n protected constructor(\n protected readonly name: string,\n protected readonly target: RelayCallOptions\n ) {}\n\n protected isBatchTarget(target: RelayCallOptions): target is RelayBatchOptions {\n return (\n target.allFrames === true ||\n target.allFrames === RelayAllFrames.Any ||\n target.allFrames === RelayAllFrames.All ||\n target.frameIds !== undefined ||\n target.documentIds !== undefined\n );\n }\n\n public abstract invoke(args: any[], path?: string): Promise<any>;\n}\n"],"mappings":"AAAA,SAAQ,sBAAoE;AAE5E,MAAO,aAAoC;AAAA,EAC7B,YACa,MACA,QACrB;AAFqB;AACA;AAAA,EACpB;AAAA,EAFoB;AAAA,EACA;AAAA,EAGb,cAAc,QAAuD;AAC3E,WACI,OAAO,cAAc,QACrB,OAAO,cAAc,eAAe,OACpC,OAAO,cAAc,eAAe,OACpC,OAAO,aAAa,UACpB,OAAO,gBAAgB;AAAA,EAE/B;AAGJ;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type RelayCallOptions } from "../../types/relay.js";
|
|
2
|
+
import RelayAdapter from "./RelayAdapter.js";
|
|
3
|
+
export default class RelayMessagingAdapter extends RelayAdapter {
|
|
4
|
+
private readonly discovery;
|
|
5
|
+
private readonly message;
|
|
6
|
+
constructor(name: string, target: RelayCallOptions);
|
|
7
|
+
invoke(args: any[], path?: string): Promise<any>;
|
|
8
|
+
private scalarTarget;
|
|
9
|
+
private batchTargets;
|
|
10
|
+
private messageOptions;
|
|
11
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isRemoteMessageError } from "./../../message/error.js";
|
|
2
|
+
import { RelayAllFrames, RelayFrameErrorKind } from "./../../types/relay.js";
|
|
3
|
+
import RelayDiscovery from "../discovery/RelayDiscovery.js";
|
|
4
|
+
import RelayMessage from "../RelayMessage.js";
|
|
5
|
+
import {
|
|
6
|
+
fulfilledRelayFrame,
|
|
7
|
+
messageErrorKind,
|
|
8
|
+
rejectedRelayFrame,
|
|
9
|
+
RelayFrameTimeoutError,
|
|
10
|
+
sortRelayFrameResults,
|
|
11
|
+
withRelayTimeout
|
|
12
|
+
} from "../result.js";
|
|
13
|
+
import RelayAdapter from "./RelayAdapter.js";
|
|
14
|
+
class RelayMessagingAdapter extends RelayAdapter {
|
|
15
|
+
discovery = new RelayDiscovery();
|
|
16
|
+
message;
|
|
17
|
+
constructor(name, target) {
|
|
18
|
+
super(name, target);
|
|
19
|
+
this.message = new RelayMessage(name);
|
|
20
|
+
}
|
|
21
|
+
async invoke(args, path) {
|
|
22
|
+
if (!this.isBatchTarget(this.target)) {
|
|
23
|
+
const target = this.scalarTarget();
|
|
24
|
+
return withRelayTimeout(
|
|
25
|
+
this.message.send({ path, args }, this.messageOptions(target)),
|
|
26
|
+
this.target.timeoutMs
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
if (this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any) {
|
|
30
|
+
const target = { tabId: this.target.tabId, allFrames: RelayAllFrames.Any };
|
|
31
|
+
try {
|
|
32
|
+
const result = await withRelayTimeout(
|
|
33
|
+
this.message.send({ path, args }, { tabId: this.target.tabId }),
|
|
34
|
+
this.target.timeoutMs
|
|
35
|
+
);
|
|
36
|
+
return [fulfilledRelayFrame(target, result)];
|
|
37
|
+
} catch (error) {
|
|
38
|
+
const kind = error instanceof RelayFrameTimeoutError ? RelayFrameErrorKind.Timeout : isRemoteMessageError(error) ? RelayFrameErrorKind.Remote : messageErrorKind(error);
|
|
39
|
+
return [rejectedRelayFrame(target, error, kind)];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const targets = await this.batchTargets();
|
|
43
|
+
const results = await Promise.all(
|
|
44
|
+
targets.map(async (target) => {
|
|
45
|
+
try {
|
|
46
|
+
const result = await withRelayTimeout(
|
|
47
|
+
this.message.send({ path, args }, this.messageOptions(target)),
|
|
48
|
+
this.target.timeoutMs
|
|
49
|
+
);
|
|
50
|
+
return fulfilledRelayFrame(target, result);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
const kind = error instanceof RelayFrameTimeoutError ? RelayFrameErrorKind.Timeout : isRemoteMessageError(error) ? RelayFrameErrorKind.Remote : messageErrorKind(error);
|
|
53
|
+
return rejectedRelayFrame(target, error, kind);
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
);
|
|
57
|
+
return sortRelayFrameResults(results);
|
|
58
|
+
}
|
|
59
|
+
scalarTarget() {
|
|
60
|
+
if (this.target.frameId !== void 0) {
|
|
61
|
+
return { tabId: this.target.tabId, frameId: this.target.frameId };
|
|
62
|
+
}
|
|
63
|
+
if (this.target.documentId !== void 0) {
|
|
64
|
+
return { tabId: this.target.tabId, documentId: this.target.documentId };
|
|
65
|
+
}
|
|
66
|
+
return { tabId: this.target.tabId, frameId: 0 };
|
|
67
|
+
}
|
|
68
|
+
async batchTargets() {
|
|
69
|
+
if (this.target.allFrames === RelayAllFrames.All) {
|
|
70
|
+
return this.discovery.discover(this.target.tabId);
|
|
71
|
+
}
|
|
72
|
+
if (this.target.frameIds !== void 0) {
|
|
73
|
+
return this.target.frameIds.map((frameId) => ({ tabId: this.target.tabId, frameId }));
|
|
74
|
+
}
|
|
75
|
+
return (this.target.documentIds ?? []).map((documentId) => ({ tabId: this.target.tabId, documentId }));
|
|
76
|
+
}
|
|
77
|
+
messageOptions(target) {
|
|
78
|
+
if (target.frameId !== void 0) {
|
|
79
|
+
return {
|
|
80
|
+
tabId: target.tabId,
|
|
81
|
+
frameId: target.frameId,
|
|
82
|
+
...target.documentId === void 0 ? {} : { documentId: target.documentId }
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return { tabId: target.tabId, documentId: target.documentId };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
RelayMessagingAdapter as default
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=RelayMessagingAdapter.js.map
|