adnbn 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/cli/builders/app/build.d.ts +7 -0
  2. package/dist/cli/builders/app/build.js +58 -0
  3. package/dist/cli/builders/app/build.js.map +1 -0
  4. package/dist/cli/builders/app/index.d.ts +6 -1
  5. package/dist/cli/builders/app/index.js +49 -14
  6. package/dist/cli/builders/app/index.js.map +1 -1
  7. package/dist/cli/builders/app/{command.d.ts → watch.d.ts} +0 -1
  8. package/dist/cli/builders/app/{command.js → watch.js} +1 -26
  9. package/dist/cli/builders/app/watch.js.map +1 -0
  10. package/dist/cli/builders/manifest/ManifestBase.d.ts +5 -1
  11. package/dist/cli/builders/manifest/ManifestBase.js +16 -0
  12. package/dist/cli/builders/manifest/ManifestBase.js.map +1 -1
  13. package/dist/cli/builders/manifest/ManifestV2.js +3 -15
  14. package/dist/cli/builders/manifest/ManifestV2.js.map +1 -1
  15. package/dist/cli/builders/manifest/ManifestV3.js +3 -15
  16. package/dist/cli/builders/manifest/ManifestV3.js.map +1 -1
  17. package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js +4 -0
  18. package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js.map +1 -1
  19. package/dist/cli/index.js +16 -3
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/plugins/action.d.ts +2 -0
  22. package/dist/cli/plugins/action.js +13 -0
  23. package/dist/cli/plugins/action.js.map +1 -0
  24. package/dist/cli/plugins/index.d.ts +1 -0
  25. package/dist/cli/plugins/index.js +52 -50
  26. package/dist/cli/plugins/index.js.map +1 -1
  27. package/dist/cli/plugins/offscreen/index.js +2 -4
  28. package/dist/cli/plugins/offscreen/index.js.map +1 -1
  29. package/dist/cli/plugins/style/index.js +34 -31
  30. package/dist/cli/plugins/style/index.js.map +1 -1
  31. package/dist/cli/plugins/style/rebase.d.ts +14 -0
  32. package/dist/cli/plugins/style/rebase.js +63 -0
  33. package/dist/cli/plugins/style/rebase.js.map +1 -0
  34. package/dist/cli/plugins/style/utils.d.ts +5 -1
  35. package/dist/cli/plugins/style/utils.js +21 -8
  36. package/dist/cli/plugins/style/utils.js.map +1 -1
  37. package/dist/cli/plugins/typescript/TypescriptConfig.js +2 -2
  38. package/dist/cli/plugins/typescript/TypescriptConfig.js.map +1 -1
  39. package/dist/cli/resolvers/bundler.js +9 -1
  40. package/dist/cli/resolvers/bundler.js.map +1 -1
  41. package/dist/cli/resolvers/config.js +5 -1
  42. package/dist/cli/resolvers/config.js.map +1 -1
  43. package/dist/cli/utils/path.js +1 -1
  44. package/dist/cli/utils/path.js.map +1 -1
  45. package/dist/entry/relay/Builder.d.ts +4 -3
  46. package/dist/entry/relay/Builder.js.map +1 -1
  47. package/dist/entry/relay/index.d.ts +4 -3
  48. package/dist/entry/relay/index.js.map +1 -1
  49. package/dist/locale/adapters/react/hooks/use-locale.js +1 -1
  50. package/dist/locale/adapters/react/hooks/use-locale.js.map +1 -1
  51. package/dist/locale/adapters/react/hooks/use-native-locale.js +1 -1
  52. package/dist/locale/adapters/react/hooks/use-native-locale.js.map +1 -1
  53. package/dist/locale/index.d.ts +1 -0
  54. package/dist/locale/index.js +3 -1
  55. package/dist/locale/index.js.map +1 -1
  56. package/dist/locale/{providers → observers}/ObservableLocale.js +2 -2
  57. package/dist/locale/observers/ObservableLocale.js.map +1 -0
  58. package/dist/locale/observers/index.d.ts +1 -0
  59. package/dist/locale/observers/index.js +5 -0
  60. package/dist/locale/observers/index.js.map +1 -0
  61. package/dist/locale/providers/index.d.ts +0 -1
  62. package/dist/locale/providers/index.js +1 -3
  63. package/dist/locale/providers/index.js.map +1 -1
  64. package/dist/main/config.d.ts +1 -0
  65. package/dist/main/config.js.map +1 -1
  66. package/dist/main/relay.d.ts +1 -0
  67. package/dist/main/relay.js +2 -0
  68. package/dist/main/relay.js.map +1 -1
  69. package/dist/message/adapters/react/index.d.ts +1 -1
  70. package/dist/message/adapters/react/index.js +1 -1
  71. package/dist/message/adapters/react/index.js.map +1 -1
  72. package/dist/message/adapters/react/{useMessageHandler.js → use-message-handler.js} +6 -4
  73. package/dist/message/adapters/react/use-message-handler.js.map +1 -0
  74. package/dist/message/handlers/MapHandler.js +2 -1
  75. package/dist/message/handlers/MapHandler.js.map +1 -1
  76. package/dist/message/handlers/SingleHandler.js +2 -1
  77. package/dist/message/handlers/SingleHandler.js.map +1 -1
  78. package/dist/message/providers/Message.js +1 -1
  79. package/dist/message/providers/Message.js.map +1 -1
  80. package/dist/relay/RelayPermission.js +8 -2
  81. package/dist/relay/RelayPermission.js.map +1 -1
  82. package/dist/relay/adapters/RelayScriptingAdapter.d.ts +1 -0
  83. package/dist/relay/adapters/RelayScriptingAdapter.js +30 -64
  84. package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -1
  85. package/dist/relay/adapters/invoke-relay.d.ts +3 -0
  86. package/dist/relay/adapters/invoke-relay.js +69 -0
  87. package/dist/relay/adapters/invoke-relay.js.map +1 -0
  88. package/dist/relay/adapters/scripting-response.d.ts +12 -0
  89. package/dist/relay/adapters/scripting-response.js +1 -0
  90. package/dist/relay/adapters/scripting-response.js.map +1 -0
  91. package/dist/relay/result.d.ts +3 -0
  92. package/dist/relay/result.js +7 -0
  93. package/dist/relay/result.js.map +1 -1
  94. package/dist/types/action.d.ts +8 -0
  95. package/dist/types/action.js +1 -0
  96. package/dist/types/action.js.map +1 -0
  97. package/dist/types/config.d.ts +17 -1
  98. package/dist/types/content/definition.d.ts +2 -1
  99. package/dist/types/manifest.d.ts +3 -0
  100. package/dist/types/manifest.js.map +1 -1
  101. package/dist/types/popup.d.ts +2 -1
  102. package/dist/types/sidebar.d.ts +2 -1
  103. package/dist/types/sidebar.js.map +1 -1
  104. package/package.json +18 -31
  105. package/dist/cli/builders/app/command.js.map +0 -1
  106. package/dist/locale/providers/ObservableLocale.js.map +0 -1
  107. package/dist/message/adapters/react/useMessageHandler.js.map +0 -1
  108. package/scripts/clean-dist.js +0 -7
  109. package/scripts/copy-dts.js +0 -29
  110. package/scripts/merge-coverage.mjs +0 -12
  111. package/scripts/pre-commit.mjs +0 -22
  112. package/scripts/test-inventory.mjs +0 -38
  113. package/scripts/test-run.mjs +0 -25
  114. /package/dist/locale/{providers → observers}/ObservableLocale.d.ts +0 -0
  115. /package/dist/message/adapters/react/{useMessageHandler.d.ts → use-message-handler.d.ts} +0 -0
@@ -1,4 +1,3 @@
1
1
  export { default as AbstractLocale } from "./AbstractLocale.js";
2
2
  export { default as DynamicLocale } from "./DynamicLocale.js";
3
3
  export { default as NativeLocale } from "./NativeLocale.js";
4
- export { default as ObservableLocale } from "./ObservableLocale.js";
@@ -1,11 +1,9 @@
1
1
  import { default as default2 } from "./AbstractLocale.js";
2
2
  import { default as default3 } from "./DynamicLocale.js";
3
3
  import { default as default4 } from "./NativeLocale.js";
4
- import { default as default5 } from "./ObservableLocale.js";
5
4
  export {
6
5
  default2 as AbstractLocale,
7
6
  default3 as DynamicLocale,
8
- default4 as NativeLocale,
9
- default5 as ObservableLocale
7
+ default4 as NativeLocale
10
8
  };
11
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/locale/providers/index.ts"],"sourcesContent":["export {default as AbstractLocale} from \"./AbstractLocale\";\nexport {default as DynamicLocale} from \"./DynamicLocale\";\nexport {default as NativeLocale} from \"./NativeLocale\";\nexport {default as ObservableLocale} from \"./ObservableLocale\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAAgC;AACxC,SAAmB,WAAXA,gBAA+B;AACvC,SAAmB,WAAXA,gBAA8B;AACtC,SAAmB,WAAXA,gBAAkC;","names":["default"]}
1
+ {"version":3,"sources":["../../../src/locale/providers/index.ts"],"sourcesContent":["export {default as AbstractLocale} from \"./AbstractLocale\";\nexport {default as DynamicLocale} from \"./DynamicLocale\";\nexport {default as NativeLocale} from \"./NativeLocale\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAAgC;AACxC,SAAmB,WAAXA,gBAA+B;AACvC,SAAmB,WAAXA,gBAA8B;","names":["default"]}
@@ -1,3 +1,4 @@
1
1
  import type { Config, ConfigDefinition, ReadonlyConfig, UserConfig } from "../types/config.js";
2
+ export type { ActionOptions } from "../types/action.js";
2
3
  export type { Config, ReadonlyConfig, ConfigDefinition, UserConfig };
3
4
  export declare const defineConfig: (config: ConfigDefinition) => ConfigDefinition;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/main/config.ts"],"sourcesContent":["import type {Config, ConfigDefinition, ReadonlyConfig, UserConfig} from \"@typing/config\";\n\nexport type {Config, ReadonlyConfig, ConfigDefinition, UserConfig};\n\nexport const defineConfig = (config: ConfigDefinition): ConfigDefinition => {\n return config;\n};\n"],"mappings":"AAIO,MAAM,eAAe,CAAC,WAA+C;AACxE,SAAO;AACX;","names":[]}
1
+ {"version":3,"sources":["../../src/main/config.ts"],"sourcesContent":["import type {Config, ConfigDefinition, ReadonlyConfig, UserConfig} from \"@typing/config\";\n\nexport type {ActionOptions} from \"@typing/action\";\nexport type {Config, ReadonlyConfig, ConfigDefinition, UserConfig};\n\nexport const defineConfig = (config: ConfigDefinition): ConfigDefinition => {\n return config;\n};\n"],"mappings":"AAKO,MAAM,eAAe,CAAC,WAA+C;AACxE,SAAO;AACX;","names":[]}
@@ -3,6 +3,7 @@ import type { ContentScriptIsolation } from "../types/content/index.js";
3
3
  import { RelayDefinition, RelayAllFrames, RelayFrameErrorKind, RelayMethod, type RelayBatchOptions, type RelayBatchProxyTarget, type RelayName, type RelayProxyTarget, type RelayScalarOptions } from "../types/relay.js";
4
4
  export { RelayAllFrames, RelayFrameErrorKind, RelayMethod };
5
5
  export { RelayDiscoveryError } from "../relay/discovery/RelayDiscovery.js";
6
+ export { RelayProtocolError } from "../relay/result.js";
6
7
  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
8
  export declare const defineRelay: <T extends TransportType, Data = undefined, const Isolation extends `${ContentScriptIsolation}` = "none">(options: RelayDefinition<T, Data, Isolation>) => RelayDefinition<T, Data, Isolation>;
8
9
  export declare function getRelay<N extends RelayName>(name: N, params: number | RelayScalarOptions): RelayProxyTarget<N>;
@@ -7,6 +7,7 @@ import {
7
7
  RelayMethod
8
8
  } from "./../types/relay.js";
9
9
  import { RelayDiscoveryError } from "./../relay/discovery/RelayDiscovery.js";
10
+ import { RelayProtocolError } from "./../relay/result.js";
10
11
  const defineRelay = (options) => {
11
12
  return options;
12
13
  };
@@ -32,6 +33,7 @@ export {
32
33
  RelayDiscoveryError,
33
34
  RelayFrameErrorKind,
34
35
  RelayMethod,
36
+ RelayProtocolError,
35
37
  defineRelay,
36
38
  getRelay
37
39
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/main/relay.ts"],"sourcesContent":["import RelayPermission from \"@relay/RelayPermission\";\nimport {ProxyRelay, type ProxyRelayParams} from \"@relay/providers\";\nimport {options as relayOptions} from \"#adnbn/relay\";\n\nimport type {TransportType} from \"@typing/transport\";\nimport type {ContentScriptIsolation} from \"@typing/content\";\n\nimport {\n RelayDefinition,\n RelayAllFrames,\n RelayFrameErrorKind,\n RelayMethod,\n RelayOptionsMap,\n type RelayBatchOptions,\n type RelayBatchProxyTarget,\n type RelayName,\n type RelayProxyTarget,\n type RelayScalarOptions,\n} from \"@typing/relay\";\n\nexport {RelayAllFrames, RelayFrameErrorKind, RelayMethod};\nexport {RelayDiscoveryError} from \"@relay/discovery/RelayDiscovery\";\n\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 = <\n T extends TransportType,\n Data = undefined,\n const Isolation extends `${ContentScriptIsolation}` = \"none\",\n>(\n options: RelayDefinition<T, Data, Isolation>\n): RelayDefinition<T, Data, Isolation> => {\n return options;\n};\n\nconst getRelayOptionsMap = (): RelayOptionsMap => {\n const relays: RelayOptionsMap = new Map();\n\n try {\n Object.entries(relayOptions).forEach(([name, options]) => relays.set(name, options));\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;AAChD,SAAQ,WAAW,oBAAmB;AAKtC;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,OAOG;AAGP,SAAQ,2BAA0B;AA0B3B,MAAM,cAAc,CAKvB,YACsC;AACtC,SAAO;AACX;AAEA,MAAM,qBAAqB,MAAuB;AAC9C,QAAM,SAA0B,oBAAI,IAAI;AAExC,MAAI;AACA,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM,OAAO,IAAI,MAAM,OAAO,CAAC;AAAA,EACvF,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":[]}
1
+ {"version":3,"sources":["../../src/main/relay.ts"],"sourcesContent":["import RelayPermission from \"@relay/RelayPermission\";\nimport {ProxyRelay, type ProxyRelayParams} from \"@relay/providers\";\nimport {options as relayOptions} from \"#adnbn/relay\";\n\nimport type {TransportType} from \"@typing/transport\";\nimport type {ContentScriptIsolation} from \"@typing/content\";\n\nimport {\n RelayDefinition,\n RelayAllFrames,\n RelayFrameErrorKind,\n RelayMethod,\n RelayOptionsMap,\n type RelayBatchOptions,\n type RelayBatchProxyTarget,\n type RelayName,\n type RelayProxyTarget,\n type RelayScalarOptions,\n} from \"@typing/relay\";\n\nexport {RelayAllFrames, RelayFrameErrorKind, RelayMethod};\nexport {RelayDiscoveryError} from \"@relay/discovery/RelayDiscovery\";\nexport {RelayProtocolError} from \"@relay/result\";\n\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 = <\n T extends TransportType,\n Data = undefined,\n const Isolation extends `${ContentScriptIsolation}` = \"none\",\n>(\n options: RelayDefinition<T, Data, Isolation>\n): RelayDefinition<T, Data, Isolation> => {\n return options;\n};\n\nconst getRelayOptionsMap = (): RelayOptionsMap => {\n const relays: RelayOptionsMap = new Map();\n\n try {\n Object.entries(relayOptions).forEach(([name, options]) => relays.set(name, options));\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;AAChD,SAAQ,WAAW,oBAAmB;AAKtC;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,OAOG;AAGP,SAAQ,2BAA0B;AAClC,SAAQ,0BAAyB;AA0B1B,MAAM,cAAc,CAKvB,YACsC;AACtC,SAAO;AACX;AAEA,MAAM,qBAAqB,MAAuB;AAC9C,QAAM,SAA0B,oBAAI,IAAI;AAExC,MAAI;AACA,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM,OAAO,IAAI,MAAM,OAAO,CAAC;AAAA,EACvF,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":[]}
@@ -1 +1 @@
1
- export { default as useMessageHandler } from "./useMessageHandler.js";
1
+ export { default as useMessageHandler } from "./use-message-handler.js";
@@ -1,4 +1,4 @@
1
- import { default as default2 } from "./useMessageHandler.js";
1
+ import { default as default2 } from "./use-message-handler.js";
2
2
  export {
3
3
  default2 as useMessageHandler
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/message/adapters/react/index.ts"],"sourcesContent":["export {default as useMessageHandler} from \"./useMessageHandler\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAAmC;","names":["default"]}
1
+ {"version":3,"sources":["../../../../src/message/adapters/react/index.ts"],"sourcesContent":["export {default as useMessageHandler} from \"./use-message-handler\";\n"],"mappings":"AAAA,SAAmB,WAAXA,gBAAmC;","names":["default"]}
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect, useRef } from "react";
1
+ import { useCallback, useLayoutEffect, useRef } from "react";
2
2
  import { Message } from "./../../../message/providers/index.js";
3
3
  function useMessageHandler(type, handler) {
4
4
  const messageRef = useRef(null);
@@ -6,15 +6,17 @@ function useMessageHandler(type, handler) {
6
6
  messageRef.current = Message.getInstance();
7
7
  }
8
8
  const handlerRef = useRef(handler);
9
- handlerRef.current = handler;
9
+ useLayoutEffect(() => {
10
+ handlerRef.current = handler;
11
+ }, [handler]);
10
12
  const stableWrapper = useCallback((data, sender) => {
11
13
  return handlerRef.current(data, sender);
12
14
  }, []);
13
- useEffect(() => {
15
+ useLayoutEffect(() => {
14
16
  return messageRef.current.watch(type, stableWrapper);
15
17
  }, [type, stableWrapper]);
16
18
  }
17
19
  export {
18
20
  useMessageHandler as default
19
21
  };
20
- //# sourceMappingURL=useMessageHandler.js.map
22
+ //# sourceMappingURL=use-message-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/message/adapters/react/use-message-handler.ts"],"sourcesContent":["import {useCallback, useLayoutEffect, useRef} from \"react\";\nimport {MessageDictionary, MessageTargetHandler, MessageType} from \"@typing/message\";\n\nimport {Message} from \"@message/providers\";\n\nexport default function useMessageHandler<K extends MessageType<T>, T extends MessageDictionary = MessageDictionary>(\n type: K,\n handler: MessageTargetHandler<T, K>\n): void {\n const messageRef = useRef<Message<T> | null>(null);\n\n if (!messageRef.current) {\n messageRef.current = Message.getInstance<T>();\n }\n\n const handlerRef = useRef(handler);\n\n useLayoutEffect(() => {\n // A suspended or abandoned render must not replace the active handler.\n handlerRef.current = handler;\n }, [handler]);\n\n const stableWrapper = useCallback<MessageTargetHandler<T, K>>((data, sender) => {\n return handlerRef.current(data, sender);\n }, []);\n\n useLayoutEffect(() => {\n return messageRef.current!.watch(type, stableWrapper);\n }, [type, stableWrapper]);\n}\n"],"mappings":"AAAA,SAAQ,aAAa,iBAAiB,cAAa;AAGnD,SAAQ,eAAc;AAEP,SAAR,kBACH,MACA,SACI;AACJ,QAAM,aAAa,OAA0B,IAAI;AAEjD,MAAI,CAAC,WAAW,SAAS;AACrB,eAAW,UAAU,QAAQ,YAAe;AAAA,EAChD;AAEA,QAAM,aAAa,OAAO,OAAO;AAEjC,kBAAgB,MAAM;AAElB,eAAW,UAAU;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,gBAAgB,YAAwC,CAAC,MAAM,WAAW;AAC5E,WAAO,WAAW,QAAQ,MAAM,MAAM;AAAA,EAC1C,GAAG,CAAC,CAAC;AAEL,kBAAgB,MAAM;AAClB,WAAO,WAAW,QAAS,MAAM,MAAM,aAAa;AAAA,EACxD,GAAG,CAAC,MAAM,aAAa,CAAC;AAC5B;","names":[]}
@@ -9,7 +9,8 @@ class MapHandler extends AbstractHandler {
9
9
  const handler = this.map[type];
10
10
  if (handler) {
11
11
  if (typeof handler === "function") {
12
- return handler(data, sender) || null;
12
+ const result = handler(data, sender);
13
+ return result === void 0 ? null : result;
13
14
  } else {
14
15
  throw new Error(`Handler for type "${type}" in object of handlers must be a function`);
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/message/handlers/MapHandler.ts"],"sourcesContent":["import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageDictionary,\n MessageMapHandler,\n MessageResponse,\n MessageSender,\n MessageType,\n} from \"@typing/message\";\n\nexport default class MapHandler<T extends MessageDictionary> extends AbstractHandler<T> {\n constructor(private map: MessageMapHandler<T>) {\n super();\n }\n\n public run(\n type: MessageType<T>,\n data: MessageData<T, MessageType<T>>,\n sender: MessageSender\n ): MessageResponse<T, MessageType<T>> | undefined | null {\n const handler = this.map[type];\n\n if (handler) {\n if (typeof handler === \"function\") {\n return handler(data, sender) || null;\n } else {\n throw new Error(`Handler for type \"${type}\" in object of handlers must be a function`);\n }\n }\n }\n}\n"],"mappings":"AAAA,OAAO,qBAAqB;AAU5B,MAAO,mBAA8D,gBAAmB;AAAA,EACpF,YAAoB,KAA2B;AAC3C,UAAM;AADU;AAAA,EAEpB;AAAA,EAFoB;AAAA,EAIb,IACH,MACA,MACA,QACqD;AACrD,UAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,QAAI,SAAS;AACT,UAAI,OAAO,YAAY,YAAY;AAC/B,eAAO,QAAQ,MAAM,MAAM,KAAK;AAAA,MACpC,OAAO;AACH,cAAM,IAAI,MAAM,qBAAqB,IAAI,4CAA4C;AAAA,MACzF;AAAA,IACJ;AAAA,EACJ;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/message/handlers/MapHandler.ts"],"sourcesContent":["import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageDictionary,\n MessageMapHandler,\n MessageResponse,\n MessageSender,\n MessageType,\n} from \"@typing/message\";\n\nexport default class MapHandler<T extends MessageDictionary> extends AbstractHandler<T> {\n constructor(private map: MessageMapHandler<T>) {\n super();\n }\n\n public run(\n type: MessageType<T>,\n data: MessageData<T, MessageType<T>>,\n sender: MessageSender\n ): MessageResponse<T, MessageType<T>> | undefined | null {\n const handler = this.map[type];\n\n if (handler) {\n if (typeof handler === \"function\") {\n const result = handler(data, sender);\n\n return result === undefined ? null : result;\n } else {\n throw new Error(`Handler for type \"${type}\" in object of handlers must be a function`);\n }\n }\n }\n}\n"],"mappings":"AAAA,OAAO,qBAAqB;AAU5B,MAAO,mBAA8D,gBAAmB;AAAA,EACpF,YAAoB,KAA2B;AAC3C,UAAM;AADU;AAAA,EAEpB;AAAA,EAFoB;AAAA,EAIb,IACH,MACA,MACA,QACqD;AACrD,UAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,QAAI,SAAS;AACT,UAAI,OAAO,YAAY,YAAY;AAC/B,cAAM,SAAS,QAAQ,MAAM,MAAM;AAEnC,eAAO,WAAW,SAAY,OAAO;AAAA,MACzC,OAAO;AACH,cAAM,IAAI,MAAM,qBAAqB,IAAI,4CAA4C;AAAA,MACzF;AAAA,IACJ;AAAA,EACJ;AACJ;","names":[]}
@@ -9,7 +9,8 @@ class SingleHandler extends AbstractHandler {
9
9
  handler;
10
10
  run(type, data, sender) {
11
11
  if (type === this.messageType) {
12
- return this.handler(data, sender) || null;
12
+ const result = this.handler(data, sender);
13
+ return result === void 0 ? null : result;
13
14
  }
14
15
  }
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/message/handlers/SingleHandler.ts"],"sourcesContent":["import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageDictionary,\n MessageResponse,\n MessageSender,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\n\nexport default class SingleHandler<T extends MessageDictionary> extends AbstractHandler<T> {\n constructor(\n private messageType: MessageType<T>,\n private handler: MessageTargetHandler<T, MessageType<T>>\n ) {\n super();\n }\n\n public run(\n type: MessageType<T>,\n data: MessageData<T, MessageType<T>>,\n sender: MessageSender\n ): MessageResponse<T, MessageType<T>> | undefined | null {\n if (type === this.messageType) {\n return this.handler(data, sender) || null;\n }\n }\n}\n"],"mappings":"AAAA,OAAO,qBAAqB;AAU5B,MAAO,sBAAiE,gBAAmB;AAAA,EACvF,YACY,aACA,SACV;AACE,UAAM;AAHE;AACA;AAAA,EAGZ;AAAA,EAJY;AAAA,EACA;AAAA,EAKL,IACH,MACA,MACA,QACqD;AACrD,QAAI,SAAS,KAAK,aAAa;AAC3B,aAAO,KAAK,QAAQ,MAAM,MAAM,KAAK;AAAA,IACzC;AAAA,EACJ;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/message/handlers/SingleHandler.ts"],"sourcesContent":["import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageDictionary,\n MessageResponse,\n MessageSender,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\n\nexport default class SingleHandler<T extends MessageDictionary> extends AbstractHandler<T> {\n constructor(\n private messageType: MessageType<T>,\n private handler: MessageTargetHandler<T, MessageType<T>>\n ) {\n super();\n }\n\n public run(\n type: MessageType<T>,\n data: MessageData<T, MessageType<T>>,\n sender: MessageSender\n ): MessageResponse<T, MessageType<T>> | undefined | null {\n if (type === this.messageType) {\n const result = this.handler(data, sender);\n\n return result === undefined ? null : result;\n }\n }\n}\n"],"mappings":"AAAA,OAAO,qBAAqB;AAU5B,MAAO,sBAAiE,gBAAmB;AAAA,EACvF,YACY,aACA,SACV;AACE,UAAM;AAHE;AACA;AAAA,EAGZ;AAAA,EAJY;AAAA,EACA;AAAA,EAKL,IACH,MACA,MACA,QACqD;AACrD,QAAI,SAAS,KAAK,aAAa;AAC3B,YAAM,SAAS,KAAK,QAAQ,MAAM,MAAM;AAExC,aAAO,WAAW,SAAY,OAAO;AAAA,IACzC;AAAA,EACJ;AACJ;","names":[]}
@@ -78,7 +78,7 @@ class Message extends AbstractMessage {
78
78
  return false;
79
79
  }
80
80
  if (response.ok) {
81
- return "payload" in response;
81
+ return true;
82
82
  }
83
83
  return this.isSerializedError(response.error);
84
84
  }
@@ -1 +1 @@
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
+ {"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 // JSON serialization omits payload when a successful handler returns undefined.\n return true;\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,4 +1,10 @@
1
- import { containsPermissions, onPermissionsAdded, onPermissionsRemoved, requestPermissions } from "@addon-core/browser";
1
+ import {
2
+ containsPermissions,
3
+ getManifestVersion,
4
+ onPermissionsAdded,
5
+ onPermissionsRemoved,
6
+ requestPermissions
7
+ } from "@addon-core/browser";
2
8
  import { RelayMethod } from "./../types/relay.js";
3
9
  import { ContentScriptDeclarative } from "./../types/content/index.js";
4
10
  const RelayPermissionGlobalKey = "adnbnRelayPermission";
@@ -18,7 +24,7 @@ class RelayPermission {
18
24
  const allow = declarative === true || declarative === ContentScriptDeclarative.Required || method === RelayMethod.Messaging;
19
25
  const permissions = method === RelayMethod.Messaging ? void 0 : {
20
26
  origins: !declarative || declarative === ContentScriptDeclarative.Optional ? matches : [],
21
- permissions: ["scripting"]
27
+ permissions: getManifestVersion() === 3 ? ["scripting"] : []
22
28
  };
23
29
  this.set(name, { allow, permissions });
24
30
  }
@@ -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 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":"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","names":[]}
1
+ {"version":3,"sources":["../../src/relay/RelayPermission.ts"],"sourcesContent":["import {\n containsPermissions,\n getManifestVersion,\n onPermissionsAdded,\n onPermissionsRemoved,\n requestPermissions,\n} 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: getManifestVersion() === 3 ? [\"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":"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","names":[]}
@@ -6,6 +6,7 @@ export default class RelayScriptingAdapter extends RelayAdapter {
6
6
  private get injectScript();
7
7
  invoke(args: any[], path?: string): Promise<any>;
8
8
  private normalize;
9
+ private isResponse;
9
10
  private resultTarget;
10
11
  private unwrap;
11
12
  private injectScriptOptions;
@@ -5,8 +5,15 @@ import {
5
5
  RelayFrameErrorKind,
6
6
  RelayGlobalKey
7
7
  } from "./../../types/relay.js";
8
- import { fulfilledRelayFrame, injectScriptErrorKind, rejectedRelayFrame, sortRelayFrameResults } from "../result.js";
8
+ import {
9
+ RelayProtocolError,
10
+ fulfilledRelayFrame,
11
+ injectScriptErrorKind,
12
+ rejectedRelayFrame,
13
+ sortRelayFrameResults
14
+ } from "../result.js";
9
15
  import RelayAdapter from "./RelayAdapter.js";
16
+ import { invokeRelay } from "./invoke-relay.js";
10
17
  class RelayScriptingAdapter extends RelayAdapter {
11
18
  _injectScript;
12
19
  constructor(name, target) {
@@ -16,68 +23,6 @@ class RelayScriptingAdapter extends RelayAdapter {
16
23
  return this._injectScript ?? (this._injectScript = injectScriptFactory(this.injectScriptOptions()));
17
24
  }
18
25
  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
26
  const scriptArgs = [
82
27
  this.name,
83
28
  path ?? null,
@@ -85,7 +30,7 @@ class RelayScriptingAdapter extends RelayAdapter {
85
30
  RelayGlobalKey,
86
31
  !this.isAnyFramesTarget()
87
32
  ];
88
- const outcomes = await this.injectScript.run(func, scriptArgs);
33
+ const outcomes = await this.injectScript.run(invokeRelay, scriptArgs);
89
34
  const results = this.normalize(outcomes);
90
35
  if (this.isAnyFramesTarget()) {
91
36
  const result = results.find((result2) => result2.status === "fulfilled") ?? results[0];
@@ -108,6 +53,13 @@ class RelayScriptingAdapter extends RelayAdapter {
108
53
  if (!outcome.success) {
109
54
  return rejectedRelayFrame(target, outcome.error, injectScriptErrorKind(outcome.error.kind));
110
55
  }
56
+ if (!this.isResponse(outcome.value)) {
57
+ const error = new RelayProtocolError(this.name);
58
+ if (!this.isBatchTarget(this.target)) {
59
+ throw error;
60
+ }
61
+ return rejectedRelayFrame(target, error, RelayFrameErrorKind.Execution);
62
+ }
111
63
  if (!outcome.value.ok) {
112
64
  return rejectedRelayFrame(target, outcome.value.error, RelayFrameErrorKind.Remote);
113
65
  }
@@ -115,6 +67,20 @@ class RelayScriptingAdapter extends RelayAdapter {
115
67
  })
116
68
  );
117
69
  }
70
+ isResponse(value) {
71
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
72
+ return false;
73
+ }
74
+ const response = value;
75
+ if (response.ok === true) {
76
+ return response.hasResult === false ? !Object.hasOwn(response, "result") : response.hasResult === true && Object.hasOwn(response, "result");
77
+ }
78
+ if (response.ok !== false || typeof response.error !== "object" || response.error === null || Array.isArray(response.error)) {
79
+ return false;
80
+ }
81
+ const error = response.error;
82
+ return typeof error.name === "string" && typeof error.message === "string" && (error.stack === void 0 || typeof error.stack === "string");
83
+ }
118
84
  resultTarget(target) {
119
85
  if (target.allFrames === true) {
120
86
  return {
@@ -1 +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"]}
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 {\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 {\n RelayProtocolError,\n fulfilledRelayFrame,\n injectScriptErrorKind,\n rejectedRelayFrame,\n sortRelayFrameResults,\n} from \"../result\";\nimport RelayAdapter from \"./RelayAdapter\";\nimport {invokeRelay} from \"./invoke-relay\";\nimport type {RelayInvocationResult} from \"./scripting-response\";\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 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(invokeRelay, 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<unknown>[]): 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 (!this.isResponse(outcome.value)) {\n const error = new RelayProtocolError(this.name);\n\n if (!this.isBatchTarget(this.target)) {\n throw error;\n }\n\n return rejectedRelayFrame(target, error, RelayFrameErrorKind.Execution);\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 isResponse(value: unknown): value is RelayInvocationResult {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const response = value as Record<string, unknown>;\n\n if (response.ok === true) {\n return response.hasResult === false\n ? !Object.hasOwn(response, \"result\")\n : response.hasResult === true && Object.hasOwn(response, \"result\");\n }\n\n if (\n response.ok !== false ||\n typeof response.error !== \"object\" ||\n response.error === null ||\n Array.isArray(response.error)\n ) {\n return false;\n }\n\n const error = response.error as Record<string, unknown>;\n\n return (\n typeof error.name === \"string\" &&\n typeof error.message === \"string\" &&\n (error.stack === undefined || typeof error.stack === \"string\")\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":["result"]}
@@ -0,0 +1,3 @@
1
+ import type { JsonValue } from "@addon-core/inject-script";
2
+ import type { RelayInvocationResult } from "./scripting-response.js";
3
+ export declare const invokeRelay: (name: string, path: string | null, args: JsonValue[], key: string, retryManager: boolean) => Promise<RelayInvocationResult>;
@@ -0,0 +1,69 @@
1
+ const invokeRelay = (name, path, args, key, retryManager) => {
2
+ const serialize = (error) => {
3
+ if (error instanceof Error) {
4
+ return {
5
+ name: error.name,
6
+ message: error.message,
7
+ ...error.stack ? { stack: error.stack } : {}
8
+ };
9
+ }
10
+ if (typeof error === "object" && error !== null) {
11
+ const record = error;
12
+ return {
13
+ name: typeof record.name === "string" ? record.name : "Error",
14
+ message: typeof record.message === "string" ? record.message : (() => {
15
+ try {
16
+ return JSON.stringify(error) ?? String(error);
17
+ } catch {
18
+ return String(error);
19
+ }
20
+ })(),
21
+ ...typeof record.stack === "string" ? { stack: record.stack } : {}
22
+ };
23
+ }
24
+ return { name: "Error", message: String(error) };
25
+ };
26
+ const invoke = (manager2) => {
27
+ try {
28
+ return Promise.resolve(manager2.property(name, { path, args })).then(
29
+ (result) => result === void 0 ? { ok: true, hasResult: false } : { ok: true, hasResult: true, result },
30
+ (error) => ({ ok: false, error: serialize(error) })
31
+ );
32
+ } catch (error) {
33
+ return Promise.resolve({ ok: false, error: serialize(error) });
34
+ }
35
+ };
36
+ const manager = globalThis[key];
37
+ if (manager) {
38
+ return invoke(manager);
39
+ }
40
+ if (!retryManager) {
41
+ return Promise.resolve({ ok: false, error: serialize(new Error("Relay manager not found.")) });
42
+ }
43
+ return new Promise((resolve) => {
44
+ const maxAttempts = 10;
45
+ const delay = 300;
46
+ let attempts = 1;
47
+ const findManager = () => {
48
+ const delayedManager = globalThis[key];
49
+ if (delayedManager) {
50
+ resolve(invoke(delayedManager));
51
+ return;
52
+ }
53
+ attempts++;
54
+ if (attempts >= maxAttempts) {
55
+ resolve({
56
+ ok: false,
57
+ error: serialize(new Error(`Relay manager not found after ${maxAttempts} attempts.`))
58
+ });
59
+ return;
60
+ }
61
+ setTimeout(findManager, delay);
62
+ };
63
+ setTimeout(findManager, delay);
64
+ });
65
+ };
66
+ export {
67
+ invokeRelay
68
+ };
69
+ //# sourceMappingURL=invoke-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/relay/adapters/invoke-relay.ts"],"sourcesContent":["import type {JsonValue} from \"@addon-core/inject-script\";\nimport type {MessageError} from \"@typing/message\";\nimport type {RelayInvocationResult} from \"./scripting-response\";\n\n// Serialized by scripting.executeScript: all runtime dependencies must stay inside this function.\nexport const invokeRelay = (\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.resolve({ok: false, error: serialize(new Error(\"Relay manager not found.\"))});\n }\n\n return new Promise<RelayInvocationResult>(resolve => {\n const maxAttempts = 10;\n const delay = 300;\n // The synchronous lookup above is the first attempt.\n let attempts = 1;\n\n const findManager = () => {\n const delayedManager = globalThis[key];\n\n if (delayedManager) {\n resolve(invoke(delayedManager));\n\n return;\n }\n\n attempts++;\n\n if (attempts >= maxAttempts) {\n resolve({\n ok: false,\n error: serialize(new Error(`Relay manager not found after ${maxAttempts} attempts.`)),\n });\n\n return;\n }\n\n setTimeout(findManager, delay);\n };\n\n setTimeout(findManager, delay);\n });\n};\n"],"mappings":"AAKO,MAAM,cAAc,CACvB,MACA,MACA,MACA,KACA,iBACiC;AACjC,QAAM,YAAY,CAAC,UAAiC;AAChD,QAAI,iBAAiB,OAAO;AACxB,aAAO;AAAA,QACH,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,QAAQ,EAAC,OAAO,MAAM,MAAK,IAAI,CAAC;AAAA,MAC9C;AAAA,IACJ;AAEA,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,YAAM,SAAS;AAEf,aAAO;AAAA,QACH,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,QACtD,SACI,OAAO,OAAO,YAAY,WACpB,OAAO,WACN,MAAM;AACH,cAAI;AACA,mBAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAAA,UAChD,QAAQ;AACJ,mBAAO,OAAO,KAAK;AAAA,UACvB;AAAA,QACJ,GAAG;AAAA,QACb,GAAI,OAAO,OAAO,UAAU,WAAW,EAAC,OAAO,OAAO,MAAK,IAAI,CAAC;AAAA,MACpE;AAAA,IACJ;AAEA,WAAO,EAAC,MAAM,SAAS,SAAS,OAAO,KAAK,EAAC;AAAA,EACjD;AAEA,QAAM,SAAS,CAACA,aAAiD;AAC7D,QAAI;AACA,aAAO,QAAQ,QAAQA,SAAQ,SAAS,MAAM,EAAC,MAAM,KAAI,CAAC,CAAC,EAAE;AAAA,QACzD,YACI,WAAW,SACL,EAAC,IAAI,MAAe,WAAW,MAAc,IAC7C,EAAC,IAAI,MAAe,WAAW,MAAe,OAAM;AAAA,QAC9D,YAAU,EAAC,IAAI,OAAgB,OAAO,UAAU,KAAK,EAAC;AAAA,MAC1D;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,QAAQ,QAAQ,EAAC,IAAI,OAAgB,OAAO,UAAU,KAAK,EAAC,CAAC;AAAA,IACxE;AAAA,EACJ;AAEA,QAAM,UAAU,WAAW,GAAG;AAE9B,MAAI,SAAS;AAET,WAAO,OAAO,OAAO;AAAA,EACzB;AAEA,MAAI,CAAC,cAAc;AACf,WAAO,QAAQ,QAAQ,EAAC,IAAI,OAAO,OAAO,UAAU,IAAI,MAAM,0BAA0B,CAAC,EAAC,CAAC;AAAA,EAC/F;AAEA,SAAO,IAAI,QAA+B,aAAW;AACjD,UAAM,cAAc;AACpB,UAAM,QAAQ;AAEd,QAAI,WAAW;AAEf,UAAM,cAAc,MAAM;AACtB,YAAM,iBAAiB,WAAW,GAAG;AAErC,UAAI,gBAAgB;AAChB,gBAAQ,OAAO,cAAc,CAAC;AAE9B;AAAA,MACJ;AAEA;AAEA,UAAI,YAAY,aAAa;AACzB,gBAAQ;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO,UAAU,IAAI,MAAM,iCAAiC,WAAW,YAAY,CAAC;AAAA,QACxF,CAAC;AAED;AAAA,MACJ;AAEA,iBAAW,aAAa,KAAK;AAAA,IACjC;AAEA,eAAW,aAAa,KAAK;AAAA,EACjC,CAAC;AACL;","names":["manager"]}
@@ -0,0 +1,12 @@
1
+ import type { MessageError } from "../../types/message.js";
2
+ export type RelayInvocationResult = {
3
+ ok: true;
4
+ hasResult: false;
5
+ } | {
6
+ ok: true;
7
+ hasResult: true;
8
+ result: any;
9
+ } | {
10
+ ok: false;
11
+ error: MessageError;
12
+ };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=scripting-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -4,6 +4,9 @@ export declare class RelayFrameTimeoutError extends Error {
4
4
  readonly timeoutMs: number;
5
5
  constructor(timeoutMs: number);
6
6
  }
7
+ export declare class RelayProtocolError extends Error {
8
+ constructor(relayName: string);
9
+ }
7
10
  export declare const fulfilledRelayFrame: <T>(target: RelayResultTarget, result: T) => RelayFrameResult<T>;
8
11
  export declare const rejectedRelayFrame: <T>(target: RelayResultTarget, error: unknown, kind: RelayFrameErrorKind) => RelayFrameResult<T>;
9
12
  export declare const messageErrorKind: (error: unknown) => RelayFrameErrorKind;