adnbn 0.0.39 → 0.0.41

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 (54) hide show
  1. package/dist/browser/index.cjs +122 -76
  2. package/dist/browser/index.cjs.map +1 -1
  3. package/dist/browser/index.d.mts +6 -1
  4. package/dist/browser/index.d.ts +6 -1
  5. package/dist/browser/index.js +120 -77
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/cli/index.cjs +39 -32
  8. package/dist/cli/index.cjs.map +1 -1
  9. package/dist/entry/command/index.cjs +24 -4
  10. package/dist/entry/command/index.cjs.map +1 -1
  11. package/dist/entry/command/index.js +24 -4
  12. package/dist/entry/command/index.js.map +1 -1
  13. package/dist/entry/service/index.cjs +77 -40
  14. package/dist/entry/service/index.cjs.map +1 -1
  15. package/dist/entry/service/index.js +77 -40
  16. package/dist/entry/service/index.js.map +1 -1
  17. package/dist/index.cjs +76 -39
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.js +76 -39
  20. package/dist/index.js.map +1 -1
  21. package/dist/message/index.cjs +75 -37
  22. package/dist/message/index.cjs.map +1 -1
  23. package/dist/message/index.d.mts +12 -10
  24. package/dist/message/index.d.ts +12 -10
  25. package/dist/message/index.js +75 -38
  26. package/dist/message/index.js.map +1 -1
  27. package/dist/message/react.cjs +74 -37
  28. package/dist/message/react.cjs.map +1 -1
  29. package/dist/message/react.d.mts +2 -2
  30. package/dist/message/react.d.ts +2 -2
  31. package/dist/message/react.js +74 -37
  32. package/dist/message/react.js.map +1 -1
  33. package/dist/message-CXzpmlXD.d.mts +28 -0
  34. package/dist/message-CXzpmlXD.d.ts +28 -0
  35. package/dist/relay/index.cjs +73 -68
  36. package/dist/relay/index.cjs.map +1 -1
  37. package/dist/relay/index.d.mts +34 -20
  38. package/dist/relay/index.d.ts +34 -20
  39. package/dist/relay/index.js +72 -66
  40. package/dist/relay/index.js.map +1 -1
  41. package/dist/service/index.cjs +77 -40
  42. package/dist/service/index.cjs.map +1 -1
  43. package/dist/service/index.d.mts +2 -2
  44. package/dist/service/index.d.ts +2 -2
  45. package/dist/service/index.js +77 -40
  46. package/dist/service/index.js.map +1 -1
  47. package/dist/storage/index.cjs.map +1 -1
  48. package/dist/storage/index.js.map +1 -1
  49. package/dist/storage/react.cjs.map +1 -1
  50. package/dist/storage/react.js.map +1 -1
  51. package/package.json +6 -5
  52. package/types/client.d.ts +148 -125
  53. package/dist/message-DO3GF4T9.d.mts +0 -27
  54. package/dist/message-DO3GF4T9.d.ts +0 -27
@@ -25,6 +25,28 @@ var browser = () => {
25
25
  return chrome;
26
26
  };
27
27
 
28
+ // src/browser/utils.ts
29
+ function safeListener(listener) {
30
+ return (...args) => {
31
+ try {
32
+ const result = listener(...args);
33
+ if (result instanceof Promise) {
34
+ result.catch((err) => {
35
+ console.error("Listener async error:", err);
36
+ });
37
+ }
38
+ return result;
39
+ } catch (err) {
40
+ console.error("Listener sync error:", err);
41
+ }
42
+ };
43
+ }
44
+ function handleListener(target, callback) {
45
+ const listener = safeListener(callback);
46
+ target.addListener(listener);
47
+ return () => target.removeListener(listener);
48
+ }
49
+
28
50
  // src/browser/runtime.ts
29
51
  var runtime = () => browser().runtime;
30
52
  var backgroundPaths = [
@@ -51,6 +73,19 @@ var throwRuntimeError = () => {
51
73
  throw new Error(error.message);
52
74
  }
53
75
  };
76
+ var sendMessage = (message) => new Promise((resolve, reject) => {
77
+ runtime().sendMessage(message, (response) => {
78
+ try {
79
+ throwRuntimeError();
80
+ resolve(response);
81
+ } catch (e) {
82
+ reject(e);
83
+ }
84
+ });
85
+ });
86
+ var onMessage = (callback) => {
87
+ return handleListener(runtime().onMessage, callback);
88
+ };
54
89
 
55
90
  // src/types/service.ts
56
91
  var ServiceGlobalKey = "adnbnService";
@@ -93,7 +128,7 @@ var BaseService_default = class {
93
128
  }
94
129
  get() {
95
130
  if (!isBackground()) {
96
- throw new Error("BaseService.get() must be called from within the background context.");
131
+ throw new Error(`Service "${this.name}" can be getting only from background context.`);
97
132
  }
98
133
  return this.manager.get(this.name);
99
134
  }
@@ -101,6 +136,19 @@ var BaseService_default = class {
101
136
  this.manager.remove(this.name);
102
137
  }
103
138
  };
139
+
140
+ // src/browser/tab.ts
141
+ var tabs = () => browser().tabs;
142
+ var sendTabMessage = (tabId, message, options = {}) => new Promise((resolve, reject) => {
143
+ tabs().sendMessage(tabId, message, options, (response) => {
144
+ try {
145
+ throwRuntimeError();
146
+ resolve(response);
147
+ } catch (e) {
148
+ reject(e);
149
+ }
150
+ });
151
+ });
104
152
  var AbstractMessage = class {
105
153
  buildMessage(type, data) {
106
154
  return {
@@ -112,16 +160,16 @@ var AbstractMessage = class {
112
160
  }
113
161
  };
114
162
 
163
+ // src/types/message.ts
164
+ var MessageGlobalKey = "adnbnMessage";
165
+
115
166
  // src/message/MessageManager.ts
116
167
  var MessageManager = class _MessageManager {
117
168
  handlers = /* @__PURE__ */ new Set();
118
- isListenerAttached = false;
119
- static instance = null;
169
+ unsubscribe = null;
120
170
  static getInstance() {
121
- if (_MessageManager.instance === null) {
122
- _MessageManager.instance = new _MessageManager();
123
- }
124
- return _MessageManager.instance;
171
+ var _a;
172
+ return globalThis[_a = MessageGlobalKey] ?? (globalThis[_a] = new _MessageManager());
125
173
  }
126
174
  constructor() {
127
175
  this.listener = this.listener.bind(this);
@@ -139,12 +187,11 @@ var MessageManager = class _MessageManager {
139
187
  this.updateListener();
140
188
  }
141
189
  updateListener() {
142
- if (this.handlers.size > 0 && !this.isListenerAttached) {
143
- browser().runtime.onMessage.addListener(this.listener);
144
- this.isListenerAttached = true;
145
- } else if (this.handlers.size === 0 && this.isListenerAttached) {
146
- browser().runtime.onMessage.removeListener(this.listener);
147
- this.isListenerAttached = false;
190
+ if (this.handlers.size > 0 && !this.unsubscribe) {
191
+ this.unsubscribe = onMessage(this.listener);
192
+ } else if (this.handlers.size === 0 && this.unsubscribe) {
193
+ this.unsubscribe();
194
+ this.unsubscribe = null;
148
195
  }
149
196
  }
150
197
  listener(message, sender, sendResponse) {
@@ -218,34 +265,24 @@ var GeneralHandler = class extends AbstractHandler {
218
265
  };
219
266
 
220
267
  // src/message/providers/Message.ts
221
- var Message = class extends AbstractMessage {
222
- manager = MessageManager.getInstance();
268
+ var Message = class _Message extends AbstractMessage {
269
+ static instance = null;
270
+ static getInstance() {
271
+ return this.instance ?? (this.instance = new _Message());
272
+ }
273
+ get manager() {
274
+ return MessageManager.getInstance();
275
+ }
223
276
  send(type, data, options) {
224
277
  const message = this.buildMessage(type, data);
225
- if (typeof options === "number" || typeof options === "object") {
226
- const tabId = typeof options === "number" ? options : options.tabId;
227
- const frameId = typeof options === "object" && options.frameId !== void 0 ? options.frameId : void 0;
228
- return new Promise((resolve, reject) => {
229
- browser().tabs.sendMessage(tabId, message, { frameId }, (response) => {
230
- try {
231
- throwRuntimeError();
232
- resolve(response);
233
- } catch (e) {
234
- reject(e);
235
- }
236
- });
237
- });
278
+ if (options) {
279
+ if (typeof options === "number") {
280
+ return sendTabMessage(options, message);
281
+ }
282
+ const { tabId, ...other } = options;
283
+ return sendTabMessage(tabId, message, other);
238
284
  }
239
- return new Promise((resolve, reject) => {
240
- browser().runtime.sendMessage(message, (response) => {
241
- try {
242
- throwRuntimeError();
243
- resolve(response);
244
- } catch (e) {
245
- reject(e);
246
- }
247
- });
248
- });
285
+ return sendMessage(message);
249
286
  }
250
287
  watch(arg1, arg2) {
251
288
  let handler;
@@ -294,7 +331,7 @@ var ProxyService_default = class extends BaseService_default {
294
331
  }
295
332
  get() {
296
333
  if (isBackground()) {
297
- throw new Error("ProxyService.get() cannot be called in the background");
334
+ throw new Error(`You are trying to get proxy service "${this.name}" from background. You can get original service instead`);
298
335
  }
299
336
  return this.createProxy();
300
337
  }
@@ -329,7 +366,7 @@ var RegisterService_default = class extends ProxyService_default {
329
366
  }
330
367
  get() {
331
368
  if (!isBackground()) {
332
- throw new Error("RegisterService.get() must be called from within the background context.");
369
+ throw new Error(`Service "${this.name}" can be getting only from background context.`);
333
370
  }
334
371
  return this.manager.get(this.name);
335
372
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/entry/core/Builder.ts","../../../src/browser/browser.ts","../../../src/browser/runtime.ts","../../../src/types/service.ts","../../../src/service/ServiceManager.ts","../../../src/service/providers/BaseService.ts","../../../src/message/providers/AbstractMessage.ts","../../../src/message/MessageManager.ts","../../../src/message/handlers/AbstractHandler.ts","../../../src/message/handlers/SingleHandler.ts","../../../src/message/handlers/MapHandler.ts","../../../src/message/handlers/GeneralHandler.ts","../../../src/message/providers/Message.ts","../../../src/service/providers/ProxyService.ts","../../../src/service/providers/RegisterService.ts","../../../src/entry/service/resolvers/definition.ts","../../../src/entry/service/Builder.ts","../../../src/entry/service/index.ts"],"names":["nanoid","args","get","Builder_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import {EntrypointBuilder, EntrypointBuilderClass} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointBuilder {\n public abstract build(): Promise<void>;\n\n public abstract destroy(): Promise<void>;\n\n public static resolver(this: new (definition: any) => EntrypointBuilder) {\n return (definition: EntrypointBuilderClass<typeof this>): void => {\n new this(definition).build().catch(e => {\n console.error('Failed to build entrypoint:', e);\n });\n };\n }\n}","export const browser = (): typeof chrome => {\n return chrome;\n}","import {browser} from \"./browser\";\nimport {ManifestVersion} from \"@typing/manifest\";\n\ntype Manifest = chrome.runtime.Manifest;\ntype PlatformInfo = chrome.runtime.PlatformInfo;\ntype ContextFilter = chrome.runtime.ContextFilter;\ntype ExtensionContext = chrome.runtime.ExtensionContext;\n\nconst runtime = () => browser().runtime;\n\nconst backgroundPaths = [\n '/_generated_background_page.view',\n];\n\nexport const getId = (): string => runtime().id;\n\nexport const getUrl = (path: string) => runtime().getURL(path);\n\nexport const getManifest = (): Manifest => runtime().getManifest();\n\nexport const getManifestVersion = (): ManifestVersion => getManifest().manifest_version;\n\nexport const getRuntimeContexts = (filter: ContextFilter) => new Promise<ExtensionContext[]>((resolve, reject) => {\n runtime().getContexts(filter, contexts => {\n try {\n throwRuntimeError();\n\n resolve(contexts);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getPlatformInfo = (): Promise<PlatformInfo> => new Promise<PlatformInfo>((resolve, reject) => {\n runtime().getPlatformInfo((platformInfo) => {\n try {\n throwRuntimeError();\n\n resolve(platformInfo);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const isManifestVersion3 = (): boolean => getManifestVersion() === 3;\n\nexport const isBackground = (): boolean => {\n if (!getId()) {\n return false;\n }\n\n const manifest = getManifest();\n\n if (!manifest.background) {\n return false;\n }\n\n if (manifest.manifest_version === 3) {\n return typeof window === \"undefined\";\n }\n\n return window !== undefined && backgroundPaths.includes(location.pathname);\n}\n\nexport const throwRuntimeError = (): void => {\n const error = runtime().lastError;\n\n if (error) {\n throw new Error(error.message);\n }\n}\n\nexport const onRuntimeInstalled = (callback: Parameters<typeof chrome.runtime.onInstalled.addListener>[0]): () => void => {\n runtime().onInstalled.addListener(callback);\n\n return () => runtime().onInstalled.removeListener(callback);\n}\n","import {Required} from \"utility-types\";\n\nimport {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {BackgroundConfig} from \"@typing/background\";\nimport {Awaiter, DeepAsyncProxy} from \"@typing/helpers\";\n\nexport const ServiceGlobalKey = 'adnbnService';\n\nexport type ServiceType = ((...args: any[]) => Promise<any>) | { [key: string]: any | ServiceType };\n\nexport interface ServiceDictionary {\n [key: string]: any;\n}\n\nexport type ServiceName = Extract<keyof ServiceDictionary, string>;\n\nexport type ServiceTarget<T extends ServiceDictionary, K extends keyof T> = T[K];\n\nexport type ServiceProxyTarget<T extends ServiceDictionary, K extends keyof T> = DeepAsyncProxy<T[K]>;\n\nexport interface ServiceManager {\n add<K extends ServiceName>(\n name: K,\n instance: ServiceDictionary[K]\n ): this;\n\n get<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined;\n\n has(name: ServiceName): boolean;\n\n remove<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined;\n\n clear(): this;\n}\n\nexport interface ServiceConfig extends BackgroundConfig {\n name: string;\n}\n\nexport type ServiceOptions = ServiceConfig & EntrypointOptions;\n\nexport type ServiceEntrypointOptions = Partial<ServiceOptions>;\n\nexport type ServiceInitGetter<T extends ServiceType> = (options: ServiceOptions) => T;\n\nexport type ServiceMainHandler<T extends ServiceType> = (service: T, options: ServiceOptions) => Awaiter<void>;\n\nexport type ServiceDefinition<T extends ServiceType> = ServiceEntrypointOptions & {\n init?: ServiceInitGetter<T>;\n main?: ServiceMainHandler<T>;\n};\n\nexport type ServiceUnresolvedDefinition<T extends ServiceType> = Partial<ServiceDefinition<T>>;\n\nexport type ServiceResolvedDefinition<T extends ServiceType> = Required<ServiceDefinition<T>, 'name' | 'init'>;\n\nexport type ServiceBuilder = EntrypointBuilder;\n","import {\n ServiceDictionary,\n ServiceGlobalKey,\n ServiceManager as ServiceManagerContract,\n ServiceName\n} from \"@typing/service\";\n\nexport default class ServiceManager implements ServiceManagerContract {\n private services = new Map<\n ServiceName,\n ServiceDictionary[ServiceName]\n >();\n\n public static getInstance(): ServiceManagerContract {\n return globalThis[ServiceGlobalKey] ??= new ServiceManager();\n }\n\n public add<K extends ServiceName>(\n name: K,\n instance: ServiceDictionary[K]\n ): this {\n this.services.set(name, instance);\n\n return this;\n }\n\n public get<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined {\n return this.services.get(name) as ServiceDictionary[K] | undefined;\n }\n\n public has(name: ServiceName): boolean {\n return this.services.has(name);\n }\n\n public remove<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined {\n const service = this.get(name);\n\n this.services.delete(name);\n\n return service;\n }\n\n public clear(): this {\n this.services.clear();\n\n return this;\n }\n}","import {isBackground} from \"@browser/runtime\";\n\nimport ServiceManager from \"../ServiceManager\";\n\nimport {ServiceDictionary, ServiceManager as ServiceManagerContract, ServiceName} from \"@typing/service\";\n\nexport default class<N extends ServiceName, T = ServiceDictionary[N]> {\n constructor(protected readonly name: N) {\n }\n\n protected get manager(): ServiceManagerContract {\n return ServiceManager.getInstance();\n }\n\n public get(): T {\n if (!isBackground()) {\n throw new Error('BaseService.get() must be called from within the background context.');\n }\n\n return this.manager.get(this.name);\n }\n\n public destroy(): void {\n this.manager.remove(this.name);\n }\n}\n","import {nanoid} from 'nanoid';\nimport {\n MessageBody,\n MessageData,\n MessageGeneralHandler,\n MessageTargetHandler,\n MessageMap,\n MessageMapHandler,\n MessageProvider,\n MessageResponse,\n MessageType\n} from '@typing/message'\n\nexport default abstract class AbstractMessage<T extends MessageMap, TOptions> implements MessageProvider<T, TOptions> {\n public abstract send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: TOptions): Promise<MessageResponse<T, K>>;\n\n public abstract watch<K extends MessageType<T>>(type: K, handler: MessageTargetHandler<T, K>): () => void;\n\n public abstract watch(map: MessageMapHandler<T>): () => void;\n\n public abstract watch<K extends MessageType<T>>(general: MessageGeneralHandler<T, K>): () => void;\n\n protected buildMessage<K extends MessageType<T>>(type: K, data: MessageData<T, K>): MessageBody<T, K> {\n return {\n id: nanoid(),\n type,\n data,\n timestamp: Date.now(),\n };\n }\n}\n","import {browser} from '@browser/browser'\n\nimport {MessageBody, MessageHandler, MessageMap, MessageSender, MessageType} from '@typing/message';\n\nexport default class MessageManager<T extends MessageMap> {\n private handlers: Set<MessageHandler<T>> = new Set()\n private isListenerAttached = false;\n\n private static instance: MessageManager<MessageMap> | null = null;\n\n public static getInstance<T extends MessageMap>(): MessageManager<T> {\n if (MessageManager.instance === null) {\n MessageManager.instance = new MessageManager<T>();\n }\n return MessageManager.instance;\n }\n\n constructor() {\n this.listener = this.listener.bind(this);\n }\n\n public add(handler: MessageHandler<T>) {\n this.handlers.add(handler);\n this.updateListener();\n }\n\n public remove(handler: MessageHandler<T>) {\n this.handlers.delete(handler);\n this.updateListener();\n }\n\n public clear() {\n this.handlers = new Set();\n this.updateListener();\n }\n\n private updateListener() {\n if (this.handlers.size > 0 && !this.isListenerAttached) {\n browser().runtime.onMessage.addListener(this.listener);\n this.isListenerAttached = true;\n } else if (this.handlers.size === 0 && this.isListenerAttached) {\n browser().runtime.onMessage.removeListener(this.listener);\n this.isListenerAttached = false;\n }\n }\n\n private listener<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n sender: MessageSender,\n sendResponse: (response?: any) => void\n ): boolean | void {\n if (!message || typeof message !== 'object' || !message.type) return;\n\n const results: Promise<any>[] = [];\n\n for (const handler of this.handlers) {\n try {\n const result = handler.run(message.type, message.data, sender);\n if (result !== undefined) {\n results.push(Promise.resolve(result));\n }\n } catch (err) {\n console.error('Message handler error:', err);\n }\n }\n\n if (results.length > 1) {\n throw new Error(`Message type \"${message.type}\" has multiple handlers returning a response. Only one response is allowed.`)\n }\n\n if (results.length === 1) {\n results[0].then(sendResponse);\n return true;\n }\n };\n}\n","import {MessageHandler, MessageData, MessageMap, MessageResponse, MessageSender, MessageType} from \"@typing/message\";\n\nexport default abstract class AbstractHandler<T extends MessageMap> implements MessageHandler<T> {\n\n public abstract run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined\n}\n","import AbstractHandler from \"./AbstractHandler\";\nimport {MessageData, MessageTargetHandler, MessageMap, MessageResponse, MessageSender, MessageType} from \"@typing/message\";\n\nexport default class SingleHandler<T extends MessageMap> extends AbstractHandler<T> {\n\n constructor(private messageType: MessageType<T>, private handler: MessageTargetHandler<T, MessageType<T>>) {\n super();\n }\n\n public run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined {\n if (type === this.messageType) {\n return this.handler(data, sender);\n }\n }\n}\n","import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageMap,\n MessageMapHandler,\n MessageResponse,\n MessageSender,\n MessageType\n} from \"@typing/message\";\n\nexport default class MapHandler<T extends MessageMap> extends AbstractHandler<T> {\n\n constructor(private map: MessageMapHandler<T>) {\n super();\n }\n\n public run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined {\n const handler = this.map[type];\n if (handler) {\n if (typeof handler === \"function\") {\n return handler(data, sender);\n } else {\n throw new Error(`Handler for type \"${type}\" in object of handlers must be a function`)\n }\n }\n }\n}\n","import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageGeneralHandler,\n MessageMap,\n MessageResponse,\n MessageSender,\n MessageType\n} from \"@typing/message\";\n\nexport default class GeneralHandler<T extends MessageMap, K extends MessageType<T>> extends AbstractHandler<T> {\n\n constructor(private generalHandler: MessageGeneralHandler<T, K>) {\n super();\n }\n\n public run(type: K, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined {\n return this.generalHandler(type, data, sender);\n }\n}\n","import {browser} from '@browser/browser'\nimport {throwRuntimeError} from \"@browser/runtime\";\nimport {\n MessageData,\n MessageGeneralHandler,\n MessageHandler,\n MessageMap,\n MessageMapHandler,\n MessageResponse,\n MessageTargetHandler,\n MessageType\n} from '@typing/message';\n\nimport AbstractMessage from './AbstractMessage';\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport type MessageSendOptions = number | { tabId: number; frameId?: number };\n\nexport default class Message<T extends MessageMap> extends AbstractMessage<T, MessageSendOptions> {\n protected manager = MessageManager.getInstance<T>();\n\n public send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: MessageSendOptions): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n\n if (typeof options === 'number' || typeof options === 'object') {\n const tabId = typeof options === 'number' ? options : options.tabId;\n const frameId = typeof options === 'object' && options.frameId !== undefined ? options.frameId : undefined;\n\n return new Promise((resolve, reject) => {\n browser().tabs.sendMessage(tabId, message, {frameId}, (response) => {\n try {\n throwRuntimeError()\n resolve(response);\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n return new Promise((resolve, reject) => {\n browser().runtime.sendMessage(message, (response) => {\n try {\n throwRuntimeError()\n resolve(response);\n } catch (e) {\n reject(e)\n }\n });\n });\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\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","import {isBackground} from \"@browser/runtime\";\nimport {Message, MessageSendOptions} from \"@message/providers\";\n\nimport BaseService from \"./BaseService\";\n\nimport {ServiceDictionary, ServiceName} from \"@typing/service\";\nimport {MessageMap, MessageProvider} from \"@typing/message\";\nimport {DeepAsyncProxy} from \"@typing/helpers\";\n\nexport default class<N extends ServiceName, T = DeepAsyncProxy<ServiceDictionary[N]>> extends BaseService<N, T> {\n private _message?: MessageProvider<MessageMap, MessageSendOptions>;\n\n protected readonly messageKey: string;\n\n constructor(name: N) {\n super(name);\n\n this.messageKey = `service.${this.name}`;\n }\n\n protected get message(): MessageProvider<MessageMap, MessageSendOptions> {\n return this._message ??= new Message();\n }\n\n private createProxy(path?: string): T {\n const wrapped = () => {\n }\n\n const proxy = new Proxy(wrapped, {\n apply: async (_target, _thisArg, args) => {\n return this.message.send(this.messageKey, {path, args});\n },\n\n get: (_target, propertyName, receiver) => {\n if (propertyName === '__proxy' || typeof propertyName !== 'string') {\n return Reflect.get(wrapped, propertyName, receiver);\n }\n\n const newPath = path == null ? propertyName : `${path}.${String(propertyName)}`;\n\n return this.createProxy(newPath);\n },\n });\n\n // @ts-expect-error — Adding a hidden property\n proxy.__proxy = true;\n\n return proxy as unknown as T;\n }\n\n public get(): T {\n if (isBackground()) {\n throw new Error('ProxyService.get() cannot be called in the background');\n }\n\n return this.createProxy();\n }\n}\n","import get from 'get-value';\n\nimport ProxyService from \"./ProxyService\";\n\nimport {isBackground} from \"@browser/runtime\";\n\nimport type {ServiceDictionary, ServiceName} from \"@typing/service\";\n\nexport default class<\n N extends ServiceName,\n T extends object = ServiceDictionary[N],\n A extends any[] = []\n> extends ProxyService<N, T> {\n constructor(name: N, protected readonly init: (...args: A) => T) {\n super(name)\n }\n\n public register(...args: A): T {\n if (this.manager.has(this.name)) {\n throw new Error(`A service with the name \"${this.name}\" already exists. The service name must be unique.`);\n }\n\n const service = this.init(...args);\n\n this.manager.add(this.name, service);\n\n this.message.watch(this.messageKey, async ({path, args}) => {\n try {\n const property = path == null ? service : get(service, path);\n\n if (property === undefined) {\n throw new Error(`Property not found at path \"${path}\" in service \"${this.name}\"`);\n }\n\n if (typeof property === 'function') {\n return await property.apply(service, args);\n }\n\n return property\n\n } catch (error) {\n console.error('RegisterService.register()', error);\n\n throw error;\n }\n });\n\n return service;\n }\n\n public get(): T {\n if (!isBackground()) {\n throw new Error('RegisterService.get() must be called from within the background context.');\n }\n\n return this.manager.get(this.name);\n }\n}\n","import {ServiceDefinition, ServiceInitGetter, ServiceType} from \"@typing/service\";\n\nexport const isValidServiceDefinition = <T extends ServiceType>(definition: any): definition is ServiceDefinition<T> => {\n return definition && typeof definition === 'object' && definition.constructor === Object;\n}\n\nexport const isValidServiceInitFunction = <T extends ServiceType>(init: any): init is ServiceInitGetter<T> => {\n return init && typeof init === 'function';\n}\n\nexport const isValidServiceMainFunction = <T extends ServiceType>(main: any): main is ServiceInitGetter<T> => {\n return main && typeof main === 'function';\n}\n\nexport const isValidServiceName = (name: any): name is string => {\n return name && typeof name === 'string' && name.trim().length > 0;\n}","import Builder from \"@entry/core/Builder\";\n\nimport {RegisterService} from \"@service/providers\";\n\nimport {isValidServiceInitFunction, isValidServiceMainFunction, isValidServiceName} from \"./resolvers\";\n\nimport {\n ServiceBuilder,\n ServiceName,\n ServiceOptions,\n ServiceResolvedDefinition,\n ServiceType,\n ServiceUnresolvedDefinition\n} from \"@typing/service\";\n\nexport default class<T extends ServiceType = ServiceType> extends Builder implements ServiceBuilder {\n protected readonly definition: ServiceResolvedDefinition<T>;\n\n protected service?: RegisterService<ServiceName, T, [ServiceOptions]>;\n\n public constructor(definition: ServiceUnresolvedDefinition<T>) {\n super();\n\n const {name, init} = definition;\n\n if (!isValidServiceInitFunction(init)) {\n throw new Error('The service entrypoint must export a init function');\n }\n\n if (!isValidServiceName(name)) {\n throw new Error('The service entrypoint must export a name string');\n }\n\n this.definition = {\n ...definition,\n name,\n init,\n };\n }\n\n public async build(): Promise<void> {\n const {name, init, main, ...definition} = this.definition;\n\n const options: ServiceOptions = {\n name,\n ...definition,\n };\n\n this.service = new RegisterService(name, init);\n\n this.service.register(options);\n\n if (isValidServiceMainFunction(main)) {\n await main(this.service.get(), options);\n }\n }\n\n public async destroy(): Promise<void> {\n this.service?.destroy();\n\n this.service = undefined;\n }\n}","import Builder from \"./Builder\";\n\nexport * from \"./resolvers\";\n\nexport default Builder.resolver();"]}
1
+ {"version":3,"sources":["../../../src/entry/core/Builder.ts","../../../src/browser/browser.ts","../../../src/browser/utils.ts","../../../src/browser/runtime.ts","../../../src/types/service.ts","../../../src/service/ServiceManager.ts","../../../src/service/providers/BaseService.ts","../../../src/browser/tab.ts","../../../src/message/providers/AbstractMessage.ts","../../../src/types/message.ts","../../../src/message/MessageManager.ts","../../../src/message/handlers/AbstractHandler.ts","../../../src/message/handlers/SingleHandler.ts","../../../src/message/handlers/MapHandler.ts","../../../src/message/handlers/GeneralHandler.ts","../../../src/message/providers/Message.ts","../../../src/service/providers/ProxyService.ts","../../../src/service/providers/RegisterService.ts","../../../src/entry/service/resolvers/definition.ts","../../../src/entry/service/Builder.ts","../../../src/entry/service/index.ts"],"names":["nanoid","args","get","Builder_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import {EntrypointBuilder, EntrypointBuilderClass} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointBuilder {\n public abstract build(): Promise<void>;\n\n public abstract destroy(): Promise<void>;\n\n public static resolver(this: new (definition: any) => EntrypointBuilder) {\n return (definition: EntrypointBuilderClass<typeof this>): void => {\n new this(definition).build().catch(e => {\n console.error('Failed to build entrypoint:', e);\n });\n };\n }\n}","export const browser = (): typeof chrome => {\n return chrome;\n}","type Event<T extends Function> = chrome.events.Event<T>\n\nexport function safeListener<T extends (...args: any[]) => any>(listener: T): T {\n return ((...args: Parameters<T>): ReturnType<T> | void => {\n try {\n const result = listener(...args);\n\n if (result instanceof Promise) {\n result.catch(err => {\n console.error('Listener async error:', err);\n });\n }\n\n return result;\n } catch (err) {\n console.error('Listener sync error:', err);\n }\n }) as T;\n}\n\nexport function handleListener<T extends (...args: any[]) => void>(\n target: Event<T>,\n callback: T,\n): () => void {\n const listener = safeListener(callback);\n\n target.addListener(listener);\n\n return () => target.removeListener(listener);\n}","import {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\n\nimport {ManifestVersion} from \"@typing/manifest\";\nimport {MessageBody, MessageDictionary, MessageResponse, MessageType} from \"@typing/message\";\n\ntype Manifest = chrome.runtime.Manifest;\ntype PlatformInfo = chrome.runtime.PlatformInfo;\ntype ContextFilter = chrome.runtime.ContextFilter;\ntype ExtensionContext = chrome.runtime.ExtensionContext;\n\nconst runtime = () => browser().runtime;\n\nconst backgroundPaths = [\n '/_generated_background_page.view',\n];\n\nexport const getId = (): string => runtime().id;\n\nexport const getUrl = (path: string) => runtime().getURL(path);\n\nexport const getManifest = (): Manifest => runtime().getManifest();\n\nexport const getManifestVersion = (): ManifestVersion => getManifest().manifest_version;\n\nexport const getRuntimeContexts = (filter: ContextFilter) => new Promise<ExtensionContext[]>((resolve, reject) => {\n runtime().getContexts(filter, contexts => {\n try {\n throwRuntimeError();\n\n resolve(contexts);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getPlatformInfo = (): Promise<PlatformInfo> => new Promise<PlatformInfo>((resolve, reject) => {\n runtime().getPlatformInfo((platformInfo) => {\n try {\n throwRuntimeError();\n\n resolve(platformInfo);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const isManifestVersion3 = (): boolean => getManifestVersion() === 3;\n\nexport const isBackground = (): boolean => {\n if (!getId()) {\n return false;\n }\n\n const manifest = getManifest();\n\n if (!manifest.background) {\n return false;\n }\n\n if (manifest.manifest_version === 3) {\n return typeof window === \"undefined\";\n }\n\n return window !== undefined && backgroundPaths.includes(location.pathname);\n}\n\nexport const throwRuntimeError = (): void => {\n const error = runtime().lastError;\n\n if (error) {\n throw new Error(error.message);\n }\n}\n\nexport const sendMessage = <\n T extends MessageDictionary,\n K extends MessageType<T>\n>(\n message: MessageBody<T, K>\n): Promise<MessageResponse<T, K>> => new Promise<MessageResponse<T, K>>((resolve, reject) => {\n runtime().sendMessage(message, (response) => {\n try {\n throwRuntimeError();\n\n resolve(response);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const onRuntimeInstalled = (callback: Parameters<typeof chrome.runtime.onInstalled.addListener>[0]): () => void => {\n return handleListener(runtime().onInstalled, callback)\n}\n\nexport const onMessage = (callback: Parameters<typeof chrome.runtime.onMessage.addListener>[0]): () => void => {\n return handleListener(runtime().onMessage, callback)\n}\n","import {Required} from \"utility-types\";\n\nimport {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {BackgroundConfig} from \"@typing/background\";\nimport {Awaiter, DeepAsyncProxy} from \"@typing/helpers\";\n\nexport const ServiceGlobalKey = 'adnbnService';\n\nexport type ServiceType = ((...args: any[]) => Promise<any>) | { [key: string]: any | ServiceType };\n\nexport interface ServiceDictionary {\n [key: string]: any;\n}\n\nexport type ServiceName = Extract<keyof ServiceDictionary, string>;\n\nexport type ServiceTarget<T extends ServiceDictionary, K extends keyof T> = T[K];\n\nexport type ServiceProxyTarget<T extends ServiceDictionary, K extends keyof T> = DeepAsyncProxy<T[K]>;\n\nexport interface ServiceManager {\n add<K extends ServiceName>(\n name: K,\n instance: ServiceDictionary[K]\n ): this;\n\n get<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined;\n\n has(name: ServiceName): boolean;\n\n remove<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined;\n\n clear(): this;\n}\n\nexport interface ServiceConfig extends BackgroundConfig {\n name: string;\n}\n\nexport type ServiceOptions = ServiceConfig & EntrypointOptions;\n\nexport type ServiceEntrypointOptions = Partial<ServiceOptions>;\n\nexport type ServiceInitGetter<T extends ServiceType> = (options: ServiceOptions) => T;\n\nexport type ServiceMainHandler<T extends ServiceType> = (service: T, options: ServiceOptions) => Awaiter<void>;\n\nexport type ServiceDefinition<T extends ServiceType> = ServiceEntrypointOptions & {\n init?: ServiceInitGetter<T>;\n main?: ServiceMainHandler<T>;\n};\n\nexport type ServiceUnresolvedDefinition<T extends ServiceType> = Partial<ServiceDefinition<T>>;\n\nexport type ServiceResolvedDefinition<T extends ServiceType> = Required<ServiceDefinition<T>, 'name' | 'init'>;\n\nexport type ServiceBuilder = EntrypointBuilder;\n","import {\n ServiceDictionary,\n ServiceGlobalKey,\n ServiceManager as ServiceManagerContract,\n ServiceName\n} from \"@typing/service\";\n\nexport default class ServiceManager implements ServiceManagerContract {\n private services = new Map<\n ServiceName,\n ServiceDictionary[ServiceName]\n >();\n\n public static getInstance(): ServiceManagerContract {\n return globalThis[ServiceGlobalKey] ??= new ServiceManager();\n }\n\n public add<K extends ServiceName>(\n name: K,\n instance: ServiceDictionary[K]\n ): this {\n this.services.set(name, instance);\n\n return this;\n }\n\n public get<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined {\n return this.services.get(name) as ServiceDictionary[K] | undefined;\n }\n\n public has(name: ServiceName): boolean {\n return this.services.has(name);\n }\n\n public remove<K extends ServiceName>(\n name: K\n ): ServiceDictionary[K] | undefined {\n const service = this.get(name);\n\n this.services.delete(name);\n\n return service;\n }\n\n public clear(): this {\n this.services.clear();\n\n return this;\n }\n}","import {isBackground} from \"@browser/runtime\";\n\nimport ServiceManager from \"../ServiceManager\";\n\nimport {ServiceDictionary, ServiceManager as ServiceManagerContract, ServiceName} from \"@typing/service\";\n\nexport default class<N extends ServiceName, T = ServiceDictionary[N]> {\n constructor(protected readonly name: N) {\n }\n\n protected get manager(): ServiceManagerContract {\n return ServiceManager.getInstance();\n }\n\n public get(): T {\n if (!isBackground()) {\n throw new Error(`Service \"${this.name}\" can be getting only from background context.`);\n }\n\n return this.manager.get(this.name);\n }\n\n public destroy(): void {\n this.manager.remove(this.name);\n }\n}\n","import {browser} from \"./browser\";\nimport {handleListener} from \"./utils\";\nimport {throwRuntimeError} from \"./runtime\";\nimport {MessageBody, MessageDictionary, MessageResponse, MessageType} from \"@typing/message\";\n\ntype Tab = chrome.tabs.Tab;\n\ntype Window = chrome.windows.Window;\n\ntype ZoomSettings = chrome.tabs.ZoomSettings;\ntype InjectDetails = chrome.tabs.InjectDetails;\n\ntype QueryInfo = chrome.tabs.QueryInfo;\ntype HighlightInfo = chrome.tabs.HighlightInfo;\n\ntype GroupOptions = chrome.tabs.GroupOptions;\ntype CaptureVisibleTabOptions = chrome.tabs.CaptureVisibleTabOptions;\n\ntype MoveProperties = chrome.tabs.MoveProperties;\ntype UpdateProperties = chrome.tabs.UpdateProperties;\ntype CreateProperties = chrome.tabs.CreateProperties;\n\ntype MessageSendOptions = chrome.tabs.MessageSendOptions;\n\nconst tabs = () => browser().tabs;\n\n// =================================\n// ============ METHODS ============\n// =================================\nexport const captureVisibleTab = (windowId: number, options: CaptureVisibleTabOptions) => new Promise<string>((resolve, reject) => {\n tabs().captureVisibleTab(windowId, options, (dataUrl) => {\n try {\n throwRuntimeError();\n\n resolve(dataUrl);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const createTab = (properties: CreateProperties): Promise<Tab> => new Promise<Tab>((resolve, reject) => {\n tabs().create(properties, (tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const detectTabLanguage = (tabId: number) => new Promise<string>((resolve, reject) => {\n // For an unknown/undefined language, und is returned.\n tabs().detectLanguage(tabId, (language) => {\n try {\n throwRuntimeError();\n\n resolve(language);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const discardTab = (tabId: number) => new Promise<Tab>((resolve, reject) => {\n tabs().discard(tabId, (tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const duplicateTab = (tabId: number) => new Promise<Tab | undefined>((resolve, reject) => {\n tabs().duplicate(tabId, (tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getTab = (tabId: number) => new Promise<Tab>((resolve, reject) => {\n tabs().get(tabId, (tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getCurrentTab = () => new Promise<Tab | undefined>((resolve, reject) => {\n // Returns undefined if called from a non-tab context (for example, a background view or popup view)\n tabs().getCurrent((tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getTabZoom = (tabId: number) => new Promise<number>((resolve, reject) => {\n tabs().getZoom(tabId, (zoomFactor) => {\n try {\n throwRuntimeError();\n\n resolve(zoomFactor);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const getTabZoomSettings = (tabId: number) => new Promise<ZoomSettings>((resolve, reject) => {\n tabs().getZoomSettings(tabId, (zoomSettings) => {\n try {\n throwRuntimeError();\n\n resolve(zoomSettings);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const goTabBack = (tabId: number) => new Promise<void>((resolve, reject) => {\n tabs().goBack(tabId, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const goTabForward = (tabId: number) => new Promise<void>((resolve, reject) => {\n tabs().goForward(tabId, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const groupTabs = (options: GroupOptions) => new Promise<number>((resolve, reject) => {\n tabs().group(options, (tabs) => {\n try {\n throwRuntimeError();\n\n resolve(tabs);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const highlightTab = (highlightInfo: HighlightInfo) => new Promise<Window>((resolve, reject) => {\n tabs().highlight(highlightInfo, (window) => {\n try {\n throwRuntimeError();\n\n resolve(window);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const moveTab = (tabId: number, moveProperties: MoveProperties) => new Promise<Tab>((resolve, reject) => {\n tabs().move(tabId, moveProperties, (tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const moveTabs = (tabIds: number[], moveProperties: MoveProperties) => new Promise<Tab[]>((resolve, reject) => {\n tabs().move(tabIds, moveProperties, (tabs) => {\n try {\n throwRuntimeError();\n\n resolve(tabs);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const queryTabs = (queryInfo?: QueryInfo) => new Promise<Tab[]>((resolve, reject) => {\n tabs().query(queryInfo || {}, (tabs) => {\n try {\n throwRuntimeError();\n\n resolve(tabs);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const reloadTab = (tabId: number, bypassCache?: boolean | undefined) => new Promise<void>((resolve, reject) => {\n tabs().reload(tabId, {bypassCache}, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const removeTab = (tabId: number): Promise<void> => new Promise<void>((resolve, reject) => {\n tabs().remove(tabId, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const setTabZoom = (tabId: number, zoomFactor: number) => new Promise<void>((resolve, reject) => {\n tabs().setZoom(tabId, zoomFactor, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const setTabZoomSettings = (tabId: number, zoomSettings: ZoomSettings) => new Promise<void>((resolve, reject) => {\n tabs().setZoomSettings(tabId, zoomSettings, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const ungroupTab = (tabIds: number | number[]) => new Promise<void>((resolve, reject) => {\n tabs().ungroup(tabIds, () => {\n try {\n throwRuntimeError();\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const updateTab = (tabId: number, updateProperties: UpdateProperties) => new Promise<Tab | undefined>((resolve, reject) => {\n tabs().update(tabId, updateProperties, (tab) => {\n try {\n throwRuntimeError();\n\n resolve(tab);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const executeScriptTab = (tabId: number, details: InjectDetails) => new Promise<any[]>((resolve, reject) => {\n tabs().executeScript(tabId, details, (result) => {\n try {\n throwRuntimeError();\n\n resolve(result);\n } catch (e) {\n reject(e);\n }\n });\n});\n\nexport const sendTabMessage = <\n T extends MessageDictionary,\n K extends MessageType<T>\n>(\n tabId: number,\n message: MessageBody<T, K>,\n options: MessageSendOptions = {}\n): Promise<MessageResponse<T, K>> => new Promise<MessageResponse<T, K>>((resolve, reject) => {\n tabs().sendMessage(tabId, message, options, (response) => {\n try {\n throwRuntimeError();\n\n resolve(response);\n } catch (e) {\n reject(e);\n }\n });\n});\n\n// =================================\n// ======== CUSTOM METHODS =========\n// =================================\nexport const getTabUrl = async (tabId: number): Promise<string> => {\n const tab = await findTabById(tabId);\n\n if (!tab) {\n throw new Error(`Tab id \"${tabId}\" not exist`);\n }\n\n const {url} = tab;\n\n if (!url) {\n throw new Error(`URL not exist by tab id ${tabId}`);\n }\n\n return url;\n}\n\nexport const getActiveTab = async (): Promise<Tab> => {\n const tabs = await queryTabs({active: true, currentWindow: true})\n\n if (!tabs || !tabs[0]) {\n throw new Error('Tab not found');\n }\n\n return tabs[0];\n}\n\nexport const queryTabIds = async (queryInfo?: QueryInfo): Promise<number[]> => (await queryTabs(queryInfo)).reduce((ids, {id}) => {\n if (typeof id === 'number') {\n return [...ids, id];\n }\n\n return ids;\n}, [] as number[]);\n\nexport const findTab = (queryInfo?: QueryInfo): Promise<Tab | undefined> => queryTabs(queryInfo).then(tabs => tabs.length ? tabs[0] : undefined);\n\nexport const findTabById = (tabId: number): Promise<Tab | undefined> => getTab(tabId).then(tab => tab).catch(() => undefined);\n\nexport const updateTabAsSelected = (tabId: number) => updateTab(tabId, {highlighted: true});\n\nexport const updateTabAsActive = (tabId: number) => updateTab(tabId, {active: true});\n\nexport const openOrCreateTab = async (tab: Tab): Promise<void> => {\n const {id, url} = tab;\n\n if (id && url) {\n const existTab = await findTab({url});\n\n if (existTab && id && existTab.id === id) {\n await updateTabAsSelected(id);\n\n return;\n }\n }\n\n await createTab({url});\n}\n\n// =================================\n// ============ EVENTS =============\n// =================================\nexport const onTabActivated = (callback: Parameters<typeof chrome.tabs.onActivated.addListener>[0]): () => void => {\n return handleListener(tabs().onActivated, callback)\n}\n\nexport const onTabAttached = (callback: Parameters<typeof chrome.tabs.onAttached.addListener>[0]): () => void => {\n return handleListener(tabs().onAttached, callback)\n}\n\nexport const onTabCreated = (callback: Parameters<typeof chrome.tabs.onCreated.addListener>[0]): () => void => {\n return handleListener(tabs().onCreated, callback)\n}\n\nexport const onTabDetached = (callback: Parameters<typeof chrome.tabs.onDetached.addListener>[0]): () => void => {\n return handleListener(tabs().onDetached, callback)\n}\n\nexport const onTabHighlighted = (callback: Parameters<typeof chrome.tabs.onHighlighted.addListener>[0]): () => void => {\n return handleListener(tabs().onHighlighted, callback)\n};\n\nexport const onTabMoved = (callback: Parameters<typeof chrome.tabs.onMoved.addListener>[0]): () => void => {\n return handleListener(tabs().onMoved, callback)\n}\n\nexport const onTabRemoved = (callback: Parameters<typeof chrome.tabs.onRemoved.addListener>[0]): () => void => {\n return handleListener(tabs().onRemoved, callback)\n};\n\nexport const onTabReplaced = (callback: Parameters<typeof chrome.tabs.onReplaced.addListener>[0]): () => void => {\n return handleListener(tabs().onReplaced, callback)\n};\n\nexport const onTabUpdated = (callback: Parameters<typeof chrome.tabs.onUpdated.addListener>[0]): () => void => {\n return handleListener(tabs().onUpdated, callback)\n}\n\nexport const onTabZoomChange = (callback: Parameters<typeof chrome.tabs.onZoomChange.addListener>[0]): () => void => {\n return handleListener(tabs().onZoomChange, callback)\n}\n","import {nanoid} from 'nanoid';\nimport {\n MessageBody,\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageMapHandler,\n MessageProvider,\n MessageResponse,\n MessageTargetHandler,\n MessageType\n} from '@typing/message'\n\nexport default abstract class AbstractMessage<T extends MessageDictionary, TOptions> implements MessageProvider<T, TOptions> {\n public abstract send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: TOptions): Promise<MessageResponse<T, K>>;\n\n public abstract watch<K extends MessageType<T>>(type: K, handler: MessageTargetHandler<T, K>): () => void;\n\n public abstract watch(map: MessageMapHandler<T>): () => void;\n\n public abstract watch<K extends MessageType<T>>(general: MessageGeneralHandler<T, K>): () => void;\n\n protected buildMessage<K extends MessageType<T>>(type: K, data: MessageData<T, K>): MessageBody<T, K> {\n return {\n id: nanoid(),\n type,\n data,\n timestamp: Date.now(),\n };\n }\n}\n","export const MessageGlobalKey = 'adnbnMessage';\n\nexport type MessageSender = chrome.runtime.MessageSender;\n\nexport type MessageDictionary = Record<string, (data: any) => any>;\n\nexport type MessageType<T extends MessageDictionary> = Extract<keyof T, string>;\nexport type MessageData<T extends MessageDictionary, K extends MessageType<T>> = Parameters<T[K]>[0];\nexport type MessageResponse<T extends MessageDictionary, K extends MessageType<T>> = ReturnType<T[K]>;\n\nexport type MessageTargetHandler<T extends MessageDictionary, K extends MessageType<T>> = (data: MessageData<T, K>, sender: MessageSender) => MessageResponse<T, K>\nexport type MessageMapHandler<T extends MessageDictionary> = { [K in MessageType<T>]?: MessageTargetHandler<T, K> }\nexport type MessageGeneralHandler<T extends MessageDictionary, K extends MessageType<T>> = (type: K, data: MessageData<T, K>, sender: MessageSender) => any\n\nexport interface MessageBody<T extends MessageDictionary, K extends MessageType<T>> {\n id: string;\n type: K;\n data: MessageData<T, K>;\n timestamp: number;\n}\n\nexport interface MessageProvider<T extends MessageDictionary, TOptions = void> {\n send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: TOptions): Promise<MessageResponse<T, K>>;\n\n watch<K extends MessageType<T>>(type: K, handler: MessageTargetHandler<T, K>): () => void;\n\n watch(map: MessageMapHandler<T>): () => void;\n\n watch<K extends MessageType<T>>(general: MessageGeneralHandler<T, K>): () => void;\n}\n\nexport interface MessageHandler<T extends MessageDictionary> {\n run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined;\n}\n","import {onMessage} from '@browser/runtime'\n\nimport {\n MessageBody,\n MessageDictionary,\n MessageGlobalKey,\n MessageHandler,\n MessageSender,\n MessageType\n} from '@typing/message';\n\nexport default class MessageManager<T extends MessageDictionary> {\n private handlers: Set<MessageHandler<T>> = new Set()\n private unsubscribe: (() => void) | null = null;\n\n public static getInstance<T extends MessageDictionary>(): MessageManager<T> {\n return globalThis[MessageGlobalKey] ??= new MessageManager<T>();\n }\n\n constructor() {\n this.listener = this.listener.bind(this);\n }\n\n public add(handler: MessageHandler<T>) {\n this.handlers.add(handler);\n this.updateListener();\n }\n\n public remove(handler: MessageHandler<T>) {\n this.handlers.delete(handler);\n this.updateListener();\n }\n\n public clear() {\n this.handlers = new Set();\n this.updateListener();\n }\n\n private updateListener() {\n if (this.handlers.size > 0 && !this.unsubscribe) {\n this.unsubscribe = onMessage(this.listener);\n } else if (this.handlers.size === 0 && this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n }\n\n private listener<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n sender: MessageSender,\n sendResponse: (response?: any) => void\n ): boolean | void {\n if (!message || typeof message !== 'object' || !message.type) return;\n\n const results: Promise<any>[] = [];\n\n for (const handler of this.handlers) {\n try {\n const result = handler.run(message.type, message.data, sender);\n if (result !== undefined) {\n results.push(Promise.resolve(result));\n }\n } catch (err) {\n console.error('Message handler error:', err);\n }\n }\n\n if (results.length > 1) {\n throw new Error(`Message type \"${message.type}\" has multiple handlers returning a response. Only one response is allowed.`)\n }\n\n if (results.length === 1) {\n results[0].then(sendResponse);\n return true;\n }\n };\n}\n","import {\n MessageData,\n MessageDictionary,\n MessageHandler,\n MessageResponse,\n MessageSender,\n MessageType\n} from \"@typing/message\";\n\nexport default abstract class AbstractHandler<T extends MessageDictionary> implements MessageHandler<T> {\n\n public abstract run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined\n}\n","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\n constructor(private messageType: MessageType<T>, private handler: MessageTargetHandler<T, MessageType<T>>) {\n super();\n }\n\n public run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined {\n if (type === this.messageType) {\n return this.handler(data, sender);\n }\n }\n}\n","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\n constructor(private map: MessageMapHandler<T>) {\n super();\n }\n\n public run(type: MessageType<T>, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined {\n const handler = this.map[type];\n if (handler) {\n if (typeof handler === \"function\") {\n return handler(data, sender);\n } else {\n throw new Error(`Handler for type \"${type}\" in object of handlers must be a function`)\n }\n }\n }\n}\n","import AbstractHandler from \"./AbstractHandler\";\nimport {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageResponse,\n MessageSender,\n MessageType\n} from \"@typing/message\";\n\nexport default class GeneralHandler<T extends MessageDictionary, K extends MessageType<T>> extends AbstractHandler<T> {\n\n constructor(private generalHandler: MessageGeneralHandler<T, K>) {\n super();\n }\n\n public run(type: K, data: MessageData<T, MessageType<T>>, sender: MessageSender): MessageResponse<T, MessageType<T>> | undefined {\n return this.generalHandler(type, data, sender);\n }\n}\n","import {sendMessage} from \"@browser/runtime\";\nimport {sendTabMessage} from \"@browser/tab\";\nimport {\n MessageData,\n MessageDictionary,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResponse,\n MessageTargetHandler,\n MessageType\n} from '@typing/message';\n\nimport AbstractMessage from './AbstractMessage';\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport type MessageSendOptions = number | { tabId: number; frameId?: number; documentId?: string };\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 send<K extends MessageType<T>>(type: K, data: MessageData<T, K>, options?: MessageSendOptions): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n\n if (options) {\n if (typeof options === 'number') {\n return sendTabMessage(options, message)\n }\n\n const {tabId, ...other} = options;\n\n return sendTabMessage(tabId, message, other);\n\n }\n\n return sendMessage(message)\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\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","import {isBackground} from \"@browser/runtime\";\nimport {Message, MessageSendOptions} from \"@message/providers\";\n\nimport BaseService from \"./BaseService\";\n\nimport {ServiceDictionary, ServiceName} from \"@typing/service\";\nimport {MessageDictionary, MessageProvider} from \"@typing/message\";\nimport {DeepAsyncProxy} from \"@typing/helpers\";\n\nexport default class<N extends ServiceName, T = DeepAsyncProxy<ServiceDictionary[N]>> extends BaseService<N, T> {\n private _message?: MessageProvider<MessageDictionary, MessageSendOptions>;\n\n protected readonly messageKey: string;\n\n constructor(name: N) {\n super(name);\n\n this.messageKey = `service.${this.name}`;\n }\n\n protected get message(): MessageProvider<MessageDictionary, MessageSendOptions> {\n return this._message ??= new Message();\n }\n\n private createProxy(path?: string): T {\n const wrapped = () => {\n }\n\n const proxy = new Proxy(wrapped, {\n apply: async (_target, _thisArg, args) => {\n return this.message.send(this.messageKey, {path, args});\n },\n\n get: (_target, propertyName, receiver) => {\n if (propertyName === '__proxy' || typeof propertyName !== 'string') {\n return Reflect.get(wrapped, propertyName, receiver);\n }\n\n const newPath = path == null ? propertyName : `${path}.${String(propertyName)}`;\n\n return this.createProxy(newPath);\n },\n });\n\n // @ts-expect-error — Adding a hidden property\n proxy.__proxy = true;\n\n return proxy as unknown as T;\n }\n\n public get(): T {\n if (isBackground()) {\n throw new Error(`You are trying to get proxy service \"${this.name}\" from background. You can get original service instead`);\n }\n\n return this.createProxy();\n }\n}\n","import get from 'get-value';\n\nimport ProxyService from \"./ProxyService\";\n\nimport {isBackground} from \"@browser/runtime\";\n\nimport type {ServiceDictionary, ServiceName} from \"@typing/service\";\n\nexport default class<\n N extends ServiceName,\n T extends object = ServiceDictionary[N],\n A extends any[] = []\n> extends ProxyService<N, T> {\n constructor(name: N, protected readonly init: (...args: A) => T) {\n super(name)\n }\n\n public register(...args: A): T {\n if (this.manager.has(this.name)) {\n throw new Error(`A service with the name \"${this.name}\" already exists. The service name must be unique.`);\n }\n\n const service = this.init(...args);\n\n this.manager.add(this.name, service);\n\n this.message.watch(this.messageKey, async ({path, args}) => {\n try {\n const property = path == null ? service : get(service, path);\n\n if (property === undefined) {\n throw new Error(`Property not found at path \"${path}\" in service \"${this.name}\"`);\n }\n\n if (typeof property === 'function') {\n return await property.apply(service, args);\n }\n\n return property\n\n } catch (error) {\n console.error('RegisterService.register()', error);\n\n throw error;\n }\n });\n\n return service;\n }\n\n public get(): T {\n if (!isBackground()) {\n throw new Error(`Service \"${this.name}\" can be getting only from background context.`);\n }\n\n return this.manager.get(this.name);\n }\n}\n","import {ServiceDefinition, ServiceInitGetter, ServiceType} from \"@typing/service\";\n\nexport const isValidServiceDefinition = <T extends ServiceType>(definition: any): definition is ServiceDefinition<T> => {\n return definition && typeof definition === 'object' && definition.constructor === Object;\n}\n\nexport const isValidServiceInitFunction = <T extends ServiceType>(init: any): init is ServiceInitGetter<T> => {\n return init && typeof init === 'function';\n}\n\nexport const isValidServiceMainFunction = <T extends ServiceType>(main: any): main is ServiceInitGetter<T> => {\n return main && typeof main === 'function';\n}\n\nexport const isValidServiceName = (name: any): name is string => {\n return name && typeof name === 'string' && name.trim().length > 0;\n}","import Builder from \"@entry/core/Builder\";\n\nimport {RegisterService} from \"@service/providers\";\n\nimport {isValidServiceInitFunction, isValidServiceMainFunction, isValidServiceName} from \"./resolvers\";\n\nimport {\n ServiceBuilder,\n ServiceName,\n ServiceOptions,\n ServiceResolvedDefinition,\n ServiceType,\n ServiceUnresolvedDefinition\n} from \"@typing/service\";\n\nexport default class<T extends ServiceType = ServiceType> extends Builder implements ServiceBuilder {\n protected readonly definition: ServiceResolvedDefinition<T>;\n\n protected service?: RegisterService<ServiceName, T, [ServiceOptions]>;\n\n public constructor(definition: ServiceUnresolvedDefinition<T>) {\n super();\n\n const {name, init} = definition;\n\n if (!isValidServiceInitFunction(init)) {\n throw new Error('The service entrypoint must export a init function');\n }\n\n if (!isValidServiceName(name)) {\n throw new Error('The service entrypoint must export a name string');\n }\n\n this.definition = {\n ...definition,\n name,\n init,\n };\n }\n\n public async build(): Promise<void> {\n const {name, init, main, ...definition} = this.definition;\n\n const options: ServiceOptions = {\n name,\n ...definition,\n };\n\n this.service = new RegisterService(name, init);\n\n this.service.register(options);\n\n if (isValidServiceMainFunction(main)) {\n await main(this.service.get(), options);\n }\n }\n\n public async destroy(): Promise<void> {\n this.service?.destroy();\n\n this.service = undefined;\n }\n}","import Builder from \"./Builder\";\n\nexport * from \"./resolvers\";\n\nexport default Builder.resolver();"]}
@@ -17,6 +17,28 @@ var browser = () => {
17
17
  return chrome;
18
18
  };
19
19
 
20
+ // src/browser/utils.ts
21
+ function safeListener(listener) {
22
+ return (...args) => {
23
+ try {
24
+ const result = listener(...args);
25
+ if (result instanceof Promise) {
26
+ result.catch((err) => {
27
+ console.error("Listener async error:", err);
28
+ });
29
+ }
30
+ return result;
31
+ } catch (err) {
32
+ console.error("Listener sync error:", err);
33
+ }
34
+ };
35
+ }
36
+ function handleListener(target, callback) {
37
+ const listener = safeListener(callback);
38
+ target.addListener(listener);
39
+ return () => target.removeListener(listener);
40
+ }
41
+
20
42
  // src/browser/runtime.ts
21
43
  var runtime = () => browser().runtime;
22
44
  var backgroundPaths = [
@@ -43,6 +65,19 @@ var throwRuntimeError = () => {
43
65
  throw new Error(error.message);
44
66
  }
45
67
  };
68
+ var sendMessage = (message) => new Promise((resolve, reject) => {
69
+ runtime().sendMessage(message, (response) => {
70
+ try {
71
+ throwRuntimeError();
72
+ resolve(response);
73
+ } catch (e) {
74
+ reject(e);
75
+ }
76
+ });
77
+ });
78
+ var onMessage = (callback) => {
79
+ return handleListener(runtime().onMessage, callback);
80
+ };
46
81
 
47
82
  // src/types/service.ts
48
83
  var ServiceGlobalKey = "adnbnService";
@@ -85,7 +120,7 @@ var BaseService_default = class {
85
120
  }
86
121
  get() {
87
122
  if (!isBackground()) {
88
- throw new Error("BaseService.get() must be called from within the background context.");
123
+ throw new Error(`Service "${this.name}" can be getting only from background context.`);
89
124
  }
90
125
  return this.manager.get(this.name);
91
126
  }
@@ -93,6 +128,19 @@ var BaseService_default = class {
93
128
  this.manager.remove(this.name);
94
129
  }
95
130
  };
131
+
132
+ // src/browser/tab.ts
133
+ var tabs = () => browser().tabs;
134
+ var sendTabMessage = (tabId, message, options = {}) => new Promise((resolve, reject) => {
135
+ tabs().sendMessage(tabId, message, options, (response) => {
136
+ try {
137
+ throwRuntimeError();
138
+ resolve(response);
139
+ } catch (e) {
140
+ reject(e);
141
+ }
142
+ });
143
+ });
96
144
  var AbstractMessage = class {
97
145
  buildMessage(type, data) {
98
146
  return {
@@ -104,16 +152,16 @@ var AbstractMessage = class {
104
152
  }
105
153
  };
106
154
 
155
+ // src/types/message.ts
156
+ var MessageGlobalKey = "adnbnMessage";
157
+
107
158
  // src/message/MessageManager.ts
108
159
  var MessageManager = class _MessageManager {
109
160
  handlers = /* @__PURE__ */ new Set();
110
- isListenerAttached = false;
111
- static instance = null;
161
+ unsubscribe = null;
112
162
  static getInstance() {
113
- if (_MessageManager.instance === null) {
114
- _MessageManager.instance = new _MessageManager();
115
- }
116
- return _MessageManager.instance;
163
+ var _a;
164
+ return globalThis[_a = MessageGlobalKey] ?? (globalThis[_a] = new _MessageManager());
117
165
  }
118
166
  constructor() {
119
167
  this.listener = this.listener.bind(this);
@@ -131,12 +179,11 @@ var MessageManager = class _MessageManager {
131
179
  this.updateListener();
132
180
  }
133
181
  updateListener() {
134
- if (this.handlers.size > 0 && !this.isListenerAttached) {
135
- browser().runtime.onMessage.addListener(this.listener);
136
- this.isListenerAttached = true;
137
- } else if (this.handlers.size === 0 && this.isListenerAttached) {
138
- browser().runtime.onMessage.removeListener(this.listener);
139
- this.isListenerAttached = false;
182
+ if (this.handlers.size > 0 && !this.unsubscribe) {
183
+ this.unsubscribe = onMessage(this.listener);
184
+ } else if (this.handlers.size === 0 && this.unsubscribe) {
185
+ this.unsubscribe();
186
+ this.unsubscribe = null;
140
187
  }
141
188
  }
142
189
  listener(message, sender, sendResponse) {
@@ -210,34 +257,24 @@ var GeneralHandler = class extends AbstractHandler {
210
257
  };
211
258
 
212
259
  // src/message/providers/Message.ts
213
- var Message = class extends AbstractMessage {
214
- manager = MessageManager.getInstance();
260
+ var Message = class _Message extends AbstractMessage {
261
+ static instance = null;
262
+ static getInstance() {
263
+ return this.instance ?? (this.instance = new _Message());
264
+ }
265
+ get manager() {
266
+ return MessageManager.getInstance();
267
+ }
215
268
  send(type, data, options) {
216
269
  const message = this.buildMessage(type, data);
217
- if (typeof options === "number" || typeof options === "object") {
218
- const tabId = typeof options === "number" ? options : options.tabId;
219
- const frameId = typeof options === "object" && options.frameId !== void 0 ? options.frameId : void 0;
220
- return new Promise((resolve, reject) => {
221
- browser().tabs.sendMessage(tabId, message, { frameId }, (response) => {
222
- try {
223
- throwRuntimeError();
224
- resolve(response);
225
- } catch (e) {
226
- reject(e);
227
- }
228
- });
229
- });
270
+ if (options) {
271
+ if (typeof options === "number") {
272
+ return sendTabMessage(options, message);
273
+ }
274
+ const { tabId, ...other } = options;
275
+ return sendTabMessage(tabId, message, other);
230
276
  }
231
- return new Promise((resolve, reject) => {
232
- browser().runtime.sendMessage(message, (response) => {
233
- try {
234
- throwRuntimeError();
235
- resolve(response);
236
- } catch (e) {
237
- reject(e);
238
- }
239
- });
240
- });
277
+ return sendMessage(message);
241
278
  }
242
279
  watch(arg1, arg2) {
243
280
  let handler;
@@ -286,7 +323,7 @@ var ProxyService_default = class extends BaseService_default {
286
323
  }
287
324
  get() {
288
325
  if (isBackground()) {
289
- throw new Error("ProxyService.get() cannot be called in the background");
326
+ throw new Error(`You are trying to get proxy service "${this.name}" from background. You can get original service instead`);
290
327
  }
291
328
  return this.createProxy();
292
329
  }
@@ -321,7 +358,7 @@ var RegisterService_default = class extends ProxyService_default {
321
358
  }
322
359
  get() {
323
360
  if (!isBackground()) {
324
- throw new Error("RegisterService.get() must be called from within the background context.");
361
+ throw new Error(`Service "${this.name}" can be getting only from background context.`);
325
362
  }
326
363
  return this.manager.get(this.name);
327
364
  }