adnbn 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/builders/locale/LocaleStructureValidator.js +7 -0
- package/dist/cli/builders/locale/LocaleStructureValidator.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/parser/ContentParser.d.ts +2 -2
- package/dist/cli/entrypoint/parser/ContentParser.js.map +1 -1
- package/dist/cli/entrypoint/parser/RelayParser.js +2 -1
- package/dist/cli/entrypoint/parser/RelayParser.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/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/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/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/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
|
@@ -2,12 +2,13 @@ import { createContext, useContext } from "react";
|
|
|
2
2
|
import { LocaleDir, Language } from "./../../../types/locale.js";
|
|
3
3
|
const DefaultLocale = {
|
|
4
4
|
lang: Language.English,
|
|
5
|
+
langs: /* @__PURE__ */ new Map(),
|
|
5
6
|
isRtl: false,
|
|
6
7
|
dir: LocaleDir.LeftToRight,
|
|
7
|
-
t(key) {
|
|
8
|
+
t(key, ..._args) {
|
|
8
9
|
return key;
|
|
9
10
|
},
|
|
10
|
-
choice(key) {
|
|
11
|
+
choice(key, _count, ..._args) {
|
|
11
12
|
return key;
|
|
12
13
|
},
|
|
13
14
|
change(_lang) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/locale/adapters/react/context.ts"],"sourcesContent":["import {createContext, useContext} from \"react\";\n\nimport {LocaleDir, Language, LocaleNonPluralKeys, LocaleSubstitutionArgs, LocalePluralKeys} from \"@typing/locale\";\n\nimport {LocaleNativeStructure} from \"@locale/providers\";\n\nexport interface LocaleContract<S extends object = LocaleNativeStructure> {\n lang: Language;\n\n dir: LocaleDir;\n\n isRtl: boolean;\n\n t<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n change(lang: Language): void;\n}\n\nexport const DefaultLocale: LocaleContract = {\n lang: Language.English,\n isRtl: false,\n dir: LocaleDir.LeftToRight,\n t(key
|
|
1
|
+
{"version":3,"sources":["../../../../src/locale/adapters/react/context.ts"],"sourcesContent":["import {createContext, useContext} from \"react\";\n\nimport {LocaleDir, Language, LocaleNonPluralKeys, LocaleSubstitutionArgs, LocalePluralKeys} from \"@typing/locale\";\n\nimport {LocaleNativeStructure} from \"@locale/providers\";\n\nexport interface LocaleContract<S extends object = LocaleNativeStructure> {\n lang: Language;\n\n langs: ReadonlyMap<Language, string>;\n\n dir: LocaleDir;\n\n isRtl: boolean;\n\n t<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n change(lang: Language): void;\n}\n\nexport const DefaultLocale: LocaleContract = {\n lang: Language.English,\n langs: new Map(),\n isRtl: false,\n dir: LocaleDir.LeftToRight,\n t(key, ..._args): string {\n return key;\n },\n choice(key, _count, ..._args): string {\n return key;\n },\n change(_lang: Language) {},\n};\n\nexport const LocaleContext = createContext<LocaleContract>(DefaultLocale);\n\nLocaleContext.displayName = \"LocaleContext\";\n\nexport const useLocale = () => useContext(LocaleContext);\n"],"mappings":"AAAA,SAAQ,eAAe,kBAAiB;AAExC,SAAQ,WAAW,gBAA8E;AAoB1F,MAAM,gBAAgC;AAAA,EACzC,MAAM,SAAS;AAAA,EACf,OAAO,oBAAI,IAAI;AAAA,EACf,OAAO;AAAA,EACP,KAAK,UAAU;AAAA,EACf,EAAE,QAAQ,OAAe;AACrB,WAAO;AAAA,EACX;AAAA,EACA,OAAO,KAAK,WAAW,OAAe;AAClC,WAAO;AAAA,EACX;AAAA,EACA,OAAO,OAAiB;AAAA,EAAC;AAC7B;AAEO,MAAM,gBAAgB,cAA8B,aAAa;AAExE,cAAc,cAAc;AAErB,MAAM,YAAY,MAAM,WAAW,aAAa;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/locale/helpers.ts"],"sourcesContent":["import {LocaleNativeStructure, NativeLocale} from \"@locale/providers\";\nimport {convertLocaleMessageKey, extractLocaleKey} from \"@locale/utils\";\nimport {LocaleNonPluralKeys, LocalePluralKeys, LocaleSubstitutionArgs} from \"@typing/locale\";\n\n/**\n * Translates a non-plural locale key.\n *\n * Substitutions are type-checked from the generated locale structure:\n * keys without placeholders do not accept substitutions, while keys with\n * placeholders require all declared substitution values.\n *\n * @example\n * ```ts\n * t(\"app.name\");\n * t(\"app.greeting\", {name: \"Alice\"});\n * ```\n *\n * @param key - The locale key to translate.\n * @param args\n * @returns The translated string.\n */\nexport const t = <K extends LocaleNonPluralKeys<LocaleNativeStructure>>(\n key: K,\n ...args: LocaleSubstitutionArgs<LocaleNativeStructure, K>\n): string => {\n return NativeLocale.getInstance().trans(key, ...args);\n};\n\n/**\n * Translates a plural locale key using the provided count.\n *\n * Substitutions are type-checked from the generated locale structure:\n * keys without placeholders do not accept substitutions, while keys with\n * placeholders require all declared substitution values.\n *\n * @example\n * ```ts\n * choice(\"cart.items\", count, {count});\n * ```\n *\n * @param key - The locale key to translate.\n * @param count - The count used to select the plural form.\n * @param args\n * @returns The translated string.\n */\nexport const choice = <K extends LocalePluralKeys<LocaleNativeStructure>>(\n key: K,\n count: number,\n ...args: LocaleSubstitutionArgs<LocaleNativeStructure, K>\n): string => {\n return NativeLocale.getInstance().choice(key, count, ...args);\n};\n\n/**\n * Converts a locale key to a browser message reference.\n *\n * This is useful for browser-managed extension fields that expect\n * `__MSG_name__` references instead of already translated text.\n *\n * A warning is logged when the key does not exist in the generated locale keys.\n *\n * @example\n * ```ts\n * key(\"app.name\"); // \"__MSG_app_name__\"\n * ```\n *\n * @param value - The locale key to convert.\n * @returns The browser message reference.\n */\nexport const key = (value: keyof LocaleNativeStructure & string): string => {\n const locale = NativeLocale.getInstance();\n\n if (!locale.keys().has(value)) {\n console.warn(`Locale key \"${value}\" not found in \"${locale.lang()}\" language.`);\n }\n\n return convertLocaleMessageKey(value);\n};\n\n/**\n * Resolves a string that may contain a locale marker.\n *\n * When the input contains a locale marker, the marker is extracted and translated.\n * Plain strings are returned unchanged.\n *\n * @example\n * ```ts\n * resolve(\"@app.name\");\n * resolve(\"Plain title\");\n * ```\n *\n * @param input - A plain string or a marked locale key string.\n * @returns The translated text when a marker is found, otherwise the original input.\n */\nexport const resolve = (input: string): string => {\n const localeKey = extractLocaleKey(input);\n\n if (localeKey) {\n
|
|
1
|
+
{"version":3,"sources":["../../src/locale/helpers.ts"],"sourcesContent":["import {LocaleNativeStructure, NativeLocale} from \"@locale/providers\";\nimport {convertLocaleMessageKey, extractLocaleKey} from \"@locale/utils\";\nimport {LocaleNonPluralKeys, LocalePluralKeys, LocaleSubstitutionArgs} from \"@typing/locale\";\n\n/**\n * Translates a non-plural locale key.\n *\n * Substitutions are type-checked from the generated locale structure:\n * keys without placeholders do not accept substitutions, while keys with\n * placeholders require all declared substitution values.\n *\n * @example\n * ```ts\n * t(\"app.name\");\n * t(\"app.greeting\", {name: \"Alice\"});\n * ```\n *\n * @param key - The locale key to translate.\n * @param args\n * @returns The translated string.\n */\nexport const t = <K extends LocaleNonPluralKeys<LocaleNativeStructure>>(\n key: K,\n ...args: LocaleSubstitutionArgs<LocaleNativeStructure, K>\n): string => {\n return NativeLocale.getInstance().trans(key, ...args);\n};\n\n/**\n * Translates a plural locale key using the provided count.\n *\n * Substitutions are type-checked from the generated locale structure:\n * keys without placeholders do not accept substitutions, while keys with\n * placeholders require all declared substitution values.\n *\n * @example\n * ```ts\n * choice(\"cart.items\", count, {count});\n * ```\n *\n * @param key - The locale key to translate.\n * @param count - The count used to select the plural form.\n * @param args\n * @returns The translated string.\n */\nexport const choice = <K extends LocalePluralKeys<LocaleNativeStructure>>(\n key: K,\n count: number,\n ...args: LocaleSubstitutionArgs<LocaleNativeStructure, K>\n): string => {\n return NativeLocale.getInstance().choice(key, count, ...args);\n};\n\n/**\n * Converts a locale key to a browser message reference.\n *\n * This is useful for browser-managed extension fields that expect\n * `__MSG_name__` references instead of already translated text.\n *\n * A warning is logged when the key does not exist in the generated locale keys.\n *\n * @example\n * ```ts\n * key(\"app.name\"); // \"__MSG_app_name__\"\n * ```\n *\n * @param value - The locale key to convert.\n * @returns The browser message reference.\n */\nexport const key = (value: keyof LocaleNativeStructure & string): string => {\n const locale = NativeLocale.getInstance();\n\n if (!locale.keys().has(value)) {\n console.warn(`Locale key \"${value}\" not found in \"${locale.lang()}\" language.`);\n }\n\n return convertLocaleMessageKey(value);\n};\n\n/**\n * Resolves a string that may contain a locale marker.\n *\n * When the input contains a locale marker, the marker is extracted and translated.\n * Plain strings are returned unchanged.\n *\n * @example\n * ```ts\n * resolve(\"@app.name\");\n * resolve(\"Plain title\");\n * ```\n *\n * @param input - A plain string or a marked locale key string.\n * @returns The translated text when a marker is found, otherwise the original input.\n */\nexport const resolve = (input: string): string => {\n const localeKey = extractLocaleKey(input);\n\n if (localeKey) {\n // Markers are runtime strings without substitutions; keep t() strict for typed callers.\n return (t as (key: string) => string)(localeKey);\n }\n\n return input;\n};\n"],"mappings":"AAAA,SAA+B,oBAAmB;AAClD,SAAQ,yBAAyB,wBAAuB;AAoBjD,MAAM,IAAI,CACbA,SACG,SACM;AACT,SAAO,aAAa,YAAY,EAAE,MAAMA,MAAK,GAAG,IAAI;AACxD;AAmBO,MAAM,SAAS,CAClBA,MACA,UACG,SACM;AACT,SAAO,aAAa,YAAY,EAAE,OAAOA,MAAK,OAAO,GAAG,IAAI;AAChE;AAkBO,MAAM,MAAM,CAAC,UAAwD;AACxE,QAAM,SAAS,aAAa,YAAY;AAExC,MAAI,CAAC,OAAO,KAAK,EAAE,IAAI,KAAK,GAAG;AAC3B,YAAQ,KAAK,eAAe,KAAK,mBAAmB,OAAO,KAAK,CAAC,aAAa;AAAA,EAClF;AAEA,SAAO,wBAAwB,KAAK;AACxC;AAiBO,MAAM,UAAU,CAAC,UAA0B;AAC9C,QAAM,YAAY,iBAAiB,KAAK;AAExC,MAAI,WAAW;AAEX,WAAQ,EAA8B,SAAS;AAAA,EACnD;AAEA,SAAO;AACX;","names":["key"]}
|
|
@@ -3,6 +3,8 @@ export default abstract class<S extends object = LocaleStructure> implements Loc
|
|
|
3
3
|
abstract lang(): Language;
|
|
4
4
|
abstract keys(): Set<keyof S>;
|
|
5
5
|
abstract languages(): Set<Language>;
|
|
6
|
+
/** Returns native names for this provider's languages, preserving their order. */
|
|
7
|
+
languageNames(): Map<Language, string>;
|
|
6
8
|
protected abstract value(key: keyof S & string): string | undefined;
|
|
7
9
|
trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;
|
|
8
10
|
choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Language,
|
|
3
|
+
LanguageNames,
|
|
3
4
|
LocaleValuesSeparator
|
|
4
5
|
} from "./../../types/locale.js";
|
|
5
6
|
class AbstractLocale_default {
|
|
7
|
+
/** Returns native names for this provider's languages, preserving their order. */
|
|
8
|
+
languageNames() {
|
|
9
|
+
return new Map([...this.languages()].map((language) => [language, LanguageNames[language]]));
|
|
10
|
+
}
|
|
6
11
|
trans(key, ...args) {
|
|
7
12
|
const [substitutions] = args;
|
|
8
13
|
return this.get(key, substitutions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/locale/providers/AbstractLocale.ts"],"sourcesContent":["import {\n Language,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleProvider,\n LocaleStructure,\n LocaleSubstitutionArgs,\n LocaleSubstitutionValue,\n LocaleValuesSeparator,\n} from \"@typing/locale\";\n\nexport default abstract class<S extends object = LocaleStructure> implements LocaleProvider<S> {\n public abstract lang(): Language;\n\n public abstract keys(): Set<keyof S>;\n\n public abstract languages(): Set<Language>;\n\n protected abstract value(key: keyof S & string): string | undefined;\n\n public trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string {\n const [substitutions] = args;\n\n return this.get(key, substitutions);\n }\n\n public choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string {\n const [substitutions] = args;\n const parts = this.get(key, substitutions).split(LocaleValuesSeparator);\n\n const idx = this.getPluralIndex(count);\n\n return parts[idx] ?? parts[0] ?? (key as string);\n }\n\n public get<K extends keyof S & string>(key: K, substitutions?: Record<string, LocaleSubstitutionValue>): string {\n const template = this.value(key);\n\n if (template === undefined) {\n console.warn(`Locale key \"${key}\" not found in \"${this.lang()}\" language.`);\n\n return key as string;\n }\n\n if (substitutions) {\n return template.replace(/{{(.*?)}}/g, (_, placeholder: string) => {\n const substitution = placeholder.trim();\n\n if (substitution in substitutions) {\n return substitutions[substitution]!.toString();\n }\n\n console.warn(\n `Locale substitution \"${substitution}\" not found for key \"${key}\" in \"${this.lang()}\" language.`\n );\n\n return substitution;\n });\n }\n\n return template;\n }\n\n private getPluralIndex(count: number): number {\n switch (this.lang()) {\n case Language.Indonesian:\n case Language.Japanese:\n case Language.Kannada:\n case Language.Korean:\n case Language.Malay:\n case Language.Thai:\n case Language.Turkish:\n case Language.Vietnamese:\n return 0;\n\n case Language.Bengali:\n case Language.Bulgarian:\n case Language.Catalan:\n case Language.Danish:\n case Language.German:\n case Language.Greek:\n case Language.English:\n case Language.EnglishAustralia:\n case Language.EnglishGreatBritain:\n case Language.EnglishUSA:\n case Language.Spanish:\n case Language.SpanishLatinAmericaAndCaribbean:\n case Language.Estonian:\n case Language.Persian:\n case Language.Finnish:\n case Language.Gujarati:\n case Language.Hebrew:\n case Language.Hungarian:\n case Language.Italian:\n case Language.Malayalam:\n case Language.Marathi:\n case Language.Dutch:\n case Language.Norwegian:\n case Language.Swedish:\n case Language.Swahili:\n case Language.Tamil:\n case Language.Telugu:\n case Language.ChineseChina:\n case Language.ChineseTaiwan:\n case Language.PortugueseBrazil:\n case Language.PortuguesePortugal:\n return count == 1 ? 0 : 1;\n\n case Language.Amharic:\n case Language.Filipino:\n case Language.French:\n case Language.Hindi:\n return count == 0 || count == 1 ? 0 : 1;\n\n case Language.Croatian:\n case Language.Russian:\n case Language.Serbian:\n case Language.Ukrainian:\n return count % 10 == 1 && count % 100 != 11\n ? 0\n : count % 10 >= 2 && count % 10 <= 4 && (count % 100 < 10 || count % 100 >= 20)\n ? 1\n : 2;\n\n case Language.Czech:\n case Language.Slovak:\n return count == 1 ? 0 : count >= 2 && count <= 4 ? 1 : 2;\n\n case Language.Lithuanian:\n return count % 10 == 1 && count % 100 != 11\n ? 0\n : count % 10 >= 2 && (count % 100 < 10 || count % 100 >= 20)\n ? 1\n : 2;\n\n case Language.Slovenian:\n return count % 100 == 1 ? 0 : count % 100 == 2 ? 1 : count % 100 == 3 || count % 100 == 4 ? 2 : 3;\n\n case Language.Latvian:\n return count == 0 ? 0 : count % 10 == 1 && count % 100 != 11 ? 1 : 2;\n\n case Language.Polish:\n return count == 1\n ? 0\n : count % 10 >= 2 && count % 10 <= 4 && (count % 100 < 12 || count % 100 > 14)\n ? 1\n : 2;\n\n case Language.Romanian:\n return count == 1 ? 0 : count == 0 || (count % 100 > 0 && count % 100 < 20) ? 1 : 2;\n\n case Language.Arabic:\n return count == 0\n ? 0\n : count == 1\n ? 1\n : count == 2\n ? 2\n : count % 100 >= 3 && count % 100 <= 10\n ? 3\n : count % 100 >= 11 && count % 100 <= 99\n ? 4\n : 5;\n\n default:\n return 0;\n }\n }\n}\n"],"mappings":"AAAA;AAAA,EACI;AAAA,EAOA;AAAA,OACG;AAEP,MAAO,uBAAwF;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/locale/providers/AbstractLocale.ts"],"sourcesContent":["import {\n Language,\n LanguageNames,\n LocaleNonPluralKeys,\n LocalePluralKeys,\n LocaleProvider,\n LocaleStructure,\n LocaleSubstitutionArgs,\n LocaleSubstitutionValue,\n LocaleValuesSeparator,\n} from \"@typing/locale\";\n\nexport default abstract class<S extends object = LocaleStructure> implements LocaleProvider<S> {\n public abstract lang(): Language;\n\n public abstract keys(): Set<keyof S>;\n\n public abstract languages(): Set<Language>;\n\n /** Returns native names for this provider's languages, preserving their order. */\n public languageNames(): Map<Language, string> {\n return new Map([...this.languages()].map(language => [language, LanguageNames[language]]));\n }\n\n protected abstract value(key: keyof S & string): string | undefined;\n\n public trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string {\n const [substitutions] = args;\n\n return this.get(key, substitutions);\n }\n\n public choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string {\n const [substitutions] = args;\n const parts = this.get(key, substitutions).split(LocaleValuesSeparator);\n\n const idx = this.getPluralIndex(count);\n\n return parts[idx] ?? parts[0] ?? (key as string);\n }\n\n public get<K extends keyof S & string>(key: K, substitutions?: Record<string, LocaleSubstitutionValue>): string {\n const template = this.value(key);\n\n if (template === undefined) {\n console.warn(`Locale key \"${key}\" not found in \"${this.lang()}\" language.`);\n\n return key as string;\n }\n\n if (substitutions) {\n return template.replace(/{{(.*?)}}/g, (_, placeholder: string) => {\n const substitution = placeholder.trim();\n\n if (substitution in substitutions) {\n return substitutions[substitution]!.toString();\n }\n\n console.warn(\n `Locale substitution \"${substitution}\" not found for key \"${key}\" in \"${this.lang()}\" language.`\n );\n\n return substitution;\n });\n }\n\n return template;\n }\n\n private getPluralIndex(count: number): number {\n switch (this.lang()) {\n case Language.Indonesian:\n case Language.Japanese:\n case Language.Kannada:\n case Language.Korean:\n case Language.Malay:\n case Language.Thai:\n case Language.Turkish:\n case Language.Vietnamese:\n return 0;\n\n case Language.Bengali:\n case Language.Bulgarian:\n case Language.Catalan:\n case Language.Danish:\n case Language.German:\n case Language.Greek:\n case Language.English:\n case Language.EnglishAustralia:\n case Language.EnglishGreatBritain:\n case Language.EnglishUSA:\n case Language.Spanish:\n case Language.SpanishLatinAmericaAndCaribbean:\n case Language.Estonian:\n case Language.Persian:\n case Language.Finnish:\n case Language.Gujarati:\n case Language.Hebrew:\n case Language.Hungarian:\n case Language.Italian:\n case Language.Malayalam:\n case Language.Marathi:\n case Language.Dutch:\n case Language.Norwegian:\n case Language.Swedish:\n case Language.Swahili:\n case Language.Tamil:\n case Language.Telugu:\n case Language.ChineseChina:\n case Language.ChineseTaiwan:\n case Language.PortugueseBrazil:\n case Language.PortuguesePortugal:\n return count == 1 ? 0 : 1;\n\n case Language.Amharic:\n case Language.Filipino:\n case Language.French:\n case Language.Hindi:\n return count == 0 || count == 1 ? 0 : 1;\n\n case Language.Croatian:\n case Language.Russian:\n case Language.Serbian:\n case Language.Ukrainian:\n return count % 10 == 1 && count % 100 != 11\n ? 0\n : count % 10 >= 2 && count % 10 <= 4 && (count % 100 < 10 || count % 100 >= 20)\n ? 1\n : 2;\n\n case Language.Czech:\n case Language.Slovak:\n return count == 1 ? 0 : count >= 2 && count <= 4 ? 1 : 2;\n\n case Language.Lithuanian:\n return count % 10 == 1 && count % 100 != 11\n ? 0\n : count % 10 >= 2 && (count % 100 < 10 || count % 100 >= 20)\n ? 1\n : 2;\n\n case Language.Slovenian:\n return count % 100 == 1 ? 0 : count % 100 == 2 ? 1 : count % 100 == 3 || count % 100 == 4 ? 2 : 3;\n\n case Language.Latvian:\n return count == 0 ? 0 : count % 10 == 1 && count % 100 != 11 ? 1 : 2;\n\n case Language.Polish:\n return count == 1\n ? 0\n : count % 10 >= 2 && count % 10 <= 4 && (count % 100 < 12 || count % 100 > 14)\n ? 1\n : 2;\n\n case Language.Romanian:\n return count == 1 ? 0 : count == 0 || (count % 100 > 0 && count % 100 < 20) ? 1 : 2;\n\n case Language.Arabic:\n return count == 0\n ? 0\n : count == 1\n ? 1\n : count == 2\n ? 2\n : count % 100 >= 3 && count % 100 <= 10\n ? 3\n : count % 100 >= 11 && count % 100 <= 99\n ? 4\n : 5;\n\n default:\n return 0;\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AbstractLocale from "./AbstractLocale.js";
|
|
2
|
-
import { Language, LocaleProvider
|
|
3
|
-
|
|
2
|
+
import { Language, LocaleProvider } from "../../types/locale.js";
|
|
3
|
+
/** Augmented by the generated .adnbn/locale.d.ts for the current app. */
|
|
4
|
+
export interface LocaleNativeStructure {
|
|
4
5
|
}
|
|
5
6
|
export default class NativeLocale<S extends object = LocaleNativeStructure> extends AbstractLocale<S> {
|
|
6
7
|
private static instance?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/locale/providers/NativeLocale.ts"],"sourcesContent":["import {getI18nMessage} from \"@addon-core/browser\";\n\nimport AbstractLocale from \"./AbstractLocale\";\n\nimport {convertLocaleKey, resolveLanguage} from \"@locale/utils\";\n\nimport {Language, LocaleCustomKeyForLanguage, LocaleProvider
|
|
1
|
+
{"version":3,"sources":["../../../src/locale/providers/NativeLocale.ts"],"sourcesContent":["import {getI18nMessage} from \"@addon-core/browser\";\n\nimport AbstractLocale from \"./AbstractLocale\";\n\nimport {convertLocaleKey, resolveLanguage} from \"@locale/utils\";\n\nimport {Language, LocaleCustomKeyForLanguage, LocaleProvider} from \"@typing/locale\";\n\n/** Augmented by the generated .adnbn/locale.d.ts for the current app. */\nexport interface LocaleNativeStructure {}\n\nexport default class NativeLocale<S extends object = LocaleNativeStructure> extends AbstractLocale<S> {\n private static instance?: LocaleProvider<LocaleNativeStructure>;\n\n public static getInstance(): LocaleProvider<LocaleNativeStructure> {\n return (NativeLocale.instance ??= new NativeLocale());\n }\n\n private readonly language?: Language;\n\n constructor() {\n super();\n\n /**\n Locale detection note:\n Chrome does NOT expose an API to get the effective translation locale.\n getUILanguage() returns browser UI language (e.g., es-MX),\n even if extension translations fall back to default_locale (e.g., en).\n To detect the actual language used by i18n, we read a locale marker\n from messages.json via chrome.i18n.getMessage().\n */\n const markerLang = getI18nMessage(LocaleCustomKeyForLanguage);\n const resolvedLang = resolveLanguage(markerLang);\n\n if (!resolvedLang) {\n console.warn(`[NativeLocale] Unsupported language detected: \"${markerLang}\".`);\n }\n\n if (markerLang && resolvedLang && markerLang !== resolvedLang) {\n console.info(`[NativeLocale] Language normalized: using \"${resolvedLang}\" instead of \"${markerLang}\".`);\n }\n\n this.language = resolvedLang;\n }\n\n public lang(): Language {\n if (!this.language) {\n throw new Error(\"[NativeLocale] Language is not defined. Failed to determine a supported locale.\");\n }\n\n return this.language;\n }\n\n public keys(): Set<keyof S> {\n try {\n // @ts-expect-error: __ADNBN_LOCALE_KEYS__ is a virtual variable generated by the bundler `src/cli/plugins/locale/index.ts`\n return new Set<string>(__ADNBN_LOCALE_KEYS__) as Set<keyof S>;\n } catch (e) {\n console.error(\"[NativeLocale] Failed to access locale keys. Ensure the bundler plugin is active.\", e);\n\n return new Set<keyof S>();\n }\n }\n\n public languages(): Set<Language> {\n try {\n // @ts-expect-error: __ADNBN_DEFINED_LOCALES__ is a virtual variable generated by the bundler `src/cli/plugins/locale/index.ts`\n return new Set<Language>(__ADNBN_DEFINED_LOCALES__);\n } catch (e) {\n console.error(\"[NativeLocale] Failed to access defined locales. Check virtual variables configuration.\", e);\n\n return new Set<Language>();\n }\n }\n\n protected value(key: Extract<keyof S, string>): string | undefined {\n const value = getI18nMessage(convertLocaleKey(key));\n\n // Native i18n returns an empty string for missing messages too; build keys distinguish valid empty translations.\n if (value === \"\" && !this.keys().has(key)) {\n return undefined;\n }\n\n return value;\n }\n}\n"],"mappings":"AAAA,SAAQ,sBAAqB;AAE7B,OAAO,oBAAoB;AAE3B,SAAQ,kBAAkB,uBAAsB;AAEhD,SAAkB,kCAAiD;AAKnE,MAAO,qBAA6E,eAAkB;AAAA,EAClG,OAAe;AAAA,EAEf,OAAc,cAAqD;AAC/D,WAAQ,aAAa,aAAb,aAAa,WAAa,IAAI,aAAa;AAAA,EACvD;AAAA,EAEiB;AAAA,EAEjB,cAAc;AACV,UAAM;AAUN,UAAM,aAAa,eAAe,0BAA0B;AAC5D,UAAM,eAAe,gBAAgB,UAAU;AAE/C,QAAI,CAAC,cAAc;AACf,cAAQ,KAAK,kDAAkD,UAAU,IAAI;AAAA,IACjF;AAEA,QAAI,cAAc,gBAAgB,eAAe,cAAc;AAC3D,cAAQ,KAAK,8CAA8C,YAAY,iBAAiB,UAAU,IAAI;AAAA,IAC1G;AAEA,SAAK,WAAW;AAAA,EACpB;AAAA,EAEO,OAAiB;AACpB,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,iFAAiF;AAAA,IACrG;AAEA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,OAAqB;AACxB,QAAI;AAEA,aAAO,IAAI,IAAY,qBAAqB;AAAA,IAChD,SAAS,GAAG;AACR,cAAQ,MAAM,qFAAqF,CAAC;AAEpG,aAAO,oBAAI,IAAa;AAAA,IAC5B;AAAA,EACJ;AAAA,EAEO,YAA2B;AAC9B,QAAI;AAEA,aAAO,IAAI,IAAc,yBAAyB;AAAA,IACtD,SAAS,GAAG;AACR,cAAQ,MAAM,2FAA2F,CAAC;AAE1G,aAAO,oBAAI,IAAc;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEU,MAAM,KAAmD;AAC/D,UAAM,QAAQ,eAAe,iBAAiB,GAAG,CAAC;AAGlD,QAAI,UAAU,MAAM,CAAC,KAAK,KAAK,EAAE,IAAI,GAAG,GAAG;AACvC,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AACJ;","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
|