adnbn 0.0.39 → 0.0.40

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 (53) 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/dist/message-DO3GF4T9.d.mts +0 -27
  53. package/dist/message-DO3GF4T9.d.ts +0 -27
@@ -6,6 +6,28 @@ var browser = () => {
6
6
  return chrome;
7
7
  };
8
8
 
9
+ // src/browser/utils.ts
10
+ function safeListener(listener) {
11
+ return (...args) => {
12
+ try {
13
+ const result = listener(...args);
14
+ if (result instanceof Promise) {
15
+ result.catch((err) => {
16
+ console.error("Listener async error:", err);
17
+ });
18
+ }
19
+ return result;
20
+ } catch (err) {
21
+ console.error("Listener sync error:", err);
22
+ }
23
+ };
24
+ }
25
+ function handleListener(target, callback) {
26
+ const listener = safeListener(callback);
27
+ target.addListener(listener);
28
+ return () => target.removeListener(listener);
29
+ }
30
+
9
31
  // src/browser/runtime.ts
10
32
  var runtime = () => browser().runtime;
11
33
  var backgroundPaths = [
@@ -32,6 +54,19 @@ var throwRuntimeError = () => {
32
54
  throw new Error(error.message);
33
55
  }
34
56
  };
57
+ var sendMessage = (message) => new Promise((resolve, reject) => {
58
+ runtime().sendMessage(message, (response) => {
59
+ try {
60
+ throwRuntimeError();
61
+ resolve(response);
62
+ } catch (e) {
63
+ reject(e);
64
+ }
65
+ });
66
+ });
67
+ var onMessage = (callback) => {
68
+ return handleListener(runtime().onMessage, callback);
69
+ };
35
70
 
36
71
  // src/types/service.ts
37
72
  var ServiceGlobalKey = "adnbnService";
@@ -74,7 +109,7 @@ var BaseService_default = class {
74
109
  }
75
110
  get() {
76
111
  if (!isBackground()) {
77
- throw new Error("BaseService.get() must be called from within the background context.");
112
+ throw new Error(`Service "${this.name}" can be getting only from background context.`);
78
113
  }
79
114
  return this.manager.get(this.name);
80
115
  }
@@ -82,6 +117,19 @@ var BaseService_default = class {
82
117
  this.manager.remove(this.name);
83
118
  }
84
119
  };
120
+
121
+ // src/browser/tab.ts
122
+ var tabs = () => browser().tabs;
123
+ var sendTabMessage = (tabId, message, options = {}) => new Promise((resolve, reject) => {
124
+ tabs().sendMessage(tabId, message, options, (response) => {
125
+ try {
126
+ throwRuntimeError();
127
+ resolve(response);
128
+ } catch (e) {
129
+ reject(e);
130
+ }
131
+ });
132
+ });
85
133
  var AbstractMessage = class {
86
134
  buildMessage(type, data) {
87
135
  return {
@@ -93,16 +141,16 @@ var AbstractMessage = class {
93
141
  }
94
142
  };
95
143
 
144
+ // src/types/message.ts
145
+ var MessageGlobalKey = "adnbnMessage";
146
+
96
147
  // src/message/MessageManager.ts
97
148
  var MessageManager = class _MessageManager {
98
149
  handlers = /* @__PURE__ */ new Set();
99
- isListenerAttached = false;
100
- static instance = null;
150
+ unsubscribe = null;
101
151
  static getInstance() {
102
- if (_MessageManager.instance === null) {
103
- _MessageManager.instance = new _MessageManager();
104
- }
105
- return _MessageManager.instance;
152
+ var _a;
153
+ return globalThis[_a = MessageGlobalKey] ?? (globalThis[_a] = new _MessageManager());
106
154
  }
107
155
  constructor() {
108
156
  this.listener = this.listener.bind(this);
@@ -120,12 +168,11 @@ var MessageManager = class _MessageManager {
120
168
  this.updateListener();
121
169
  }
122
170
  updateListener() {
123
- if (this.handlers.size > 0 && !this.isListenerAttached) {
124
- browser().runtime.onMessage.addListener(this.listener);
125
- this.isListenerAttached = true;
126
- } else if (this.handlers.size === 0 && this.isListenerAttached) {
127
- browser().runtime.onMessage.removeListener(this.listener);
128
- this.isListenerAttached = false;
171
+ if (this.handlers.size > 0 && !this.unsubscribe) {
172
+ this.unsubscribe = onMessage(this.listener);
173
+ } else if (this.handlers.size === 0 && this.unsubscribe) {
174
+ this.unsubscribe();
175
+ this.unsubscribe = null;
129
176
  }
130
177
  }
131
178
  listener(message, sender, sendResponse) {
@@ -199,34 +246,24 @@ var GeneralHandler = class extends AbstractHandler {
199
246
  };
200
247
 
201
248
  // src/message/providers/Message.ts
202
- var Message = class extends AbstractMessage {
203
- manager = MessageManager.getInstance();
249
+ var Message = class _Message extends AbstractMessage {
250
+ static instance = null;
251
+ static getInstance() {
252
+ return this.instance ?? (this.instance = new _Message());
253
+ }
254
+ get manager() {
255
+ return MessageManager.getInstance();
256
+ }
204
257
  send(type, data, options) {
205
258
  const message = this.buildMessage(type, data);
206
- if (typeof options === "number" || typeof options === "object") {
207
- const tabId = typeof options === "number" ? options : options.tabId;
208
- const frameId = typeof options === "object" && options.frameId !== void 0 ? options.frameId : void 0;
209
- return new Promise((resolve, reject) => {
210
- browser().tabs.sendMessage(tabId, message, { frameId }, (response) => {
211
- try {
212
- throwRuntimeError();
213
- resolve(response);
214
- } catch (e) {
215
- reject(e);
216
- }
217
- });
218
- });
259
+ if (options) {
260
+ if (typeof options === "number") {
261
+ return sendTabMessage(options, message);
262
+ }
263
+ const { tabId, ...other } = options;
264
+ return sendTabMessage(tabId, message, other);
219
265
  }
220
- return new Promise((resolve, reject) => {
221
- browser().runtime.sendMessage(message, (response) => {
222
- try {
223
- throwRuntimeError();
224
- resolve(response);
225
- } catch (e) {
226
- reject(e);
227
- }
228
- });
229
- });
266
+ return sendMessage(message);
230
267
  }
231
268
  watch(arg1, arg2) {
232
269
  let handler;
@@ -275,7 +312,7 @@ var ProxyService_default = class extends BaseService_default {
275
312
  }
276
313
  get() {
277
314
  if (isBackground()) {
278
- throw new Error("ProxyService.get() cannot be called in the background");
315
+ throw new Error(`You are trying to get proxy service "${this.name}" from background. You can get original service instead`);
279
316
  }
280
317
  return this.createProxy();
281
318
  }
@@ -310,7 +347,7 @@ var RegisterService_default = class extends ProxyService_default {
310
347
  }
311
348
  get() {
312
349
  if (!isBackground()) {
313
- throw new Error("RegisterService.get() must be called from within the background context.");
350
+ throw new Error(`Service "${this.name}" can be getting only from background context.`);
314
351
  }
315
352
  return this.manager.get(this.name);
316
353
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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/service/index.ts"],"names":["args"],"mappings":"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","file":"index.js","sourcesContent":["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 {BaseService, ProxyService, RegisterService} from \"./providers\";\n\nimport {ServiceDictionary, ServiceName, ServiceProxyTarget, ServiceTarget} from \"@typing/service\";\n\nexport {\n type ServiceDictionary,\n type ServiceName,\n type ServiceTarget,\n type ServiceProxyTarget,\n RegisterService,\n ProxyService\n};\n\nexport const getService = <N extends ServiceName>(name: N): ServiceDictionary[N] => {\n return new BaseService(name).get();\n}\n"]}
1
+ {"version":3,"sources":["../../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/service/index.ts"],"names":["args"],"mappings":"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","file":"index.js","sourcesContent":["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 {BaseService, ProxyService, RegisterService} from \"./providers\";\n\nimport {ServiceDictionary, ServiceName, ServiceProxyTarget, ServiceTarget} from \"@typing/service\";\n\nexport {\n type ServiceDictionary,\n type ServiceName,\n type ServiceTarget,\n type ServiceProxyTarget,\n RegisterService,\n ProxyService\n};\n\nexport const getService = <N extends ServiceName>(name: N): ServiceDictionary[N] => {\n return new BaseService(name).get();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/browser/browser.ts","../../src/browser/runtime.ts","../../src/storage/providers/AbstractStorage.ts","../../src/storage/providers/Storage.ts","../../src/storage/providers/SecureStorage.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["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 {browser} from '@browser/browser'\nimport {throwRuntimeError} from '@browser/runtime'\nimport {StorageProvider, StorageState, StorageWatchOptions} from '@typing/storage'\n\nconst storage = browser().storage;\n\ntype AreaName = chrome.storage.AreaName\ntype StorageArea = chrome.storage.StorageArea;\ntype StorageChange = chrome.storage.StorageChange;\ntype onChangedListener = Parameters<typeof chrome.storage.onChanged.addListener>[0];\n\nexport interface StorageOptions {\n area?: AreaName,\n namespace?: string,\n}\n\nexport default abstract class AbstractStorage<T extends StorageState> implements StorageProvider<T> {\n private storage: StorageArea;\n private readonly area: AreaName;\n protected readonly namespace?: string;\n protected separator: string = ':';\n\n public abstract clear(): Promise<void>;\n\n protected abstract getFullKey(key: keyof T): string;\n\n protected abstract getNamespaceOfKey(key: string): string | undefined;\n\n protected abstract handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>): void\n\n protected constructor({area, namespace}: StorageOptions = {}) {\n this.area = area ?? \"local\";\n this.storage = storage[this.area];\n this.namespace = namespace?.trim() ? namespace?.trim() : undefined;\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n return new Promise((resolve, reject) => {\n this.storage.set({[this.getFullKey(key)]: value}, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const fullKey = this.getFullKey(key);\n return new Promise((resolve, reject) => {\n this.storage.get(fullKey, (result) => {\n try {\n throwRuntimeError()\n resolve(result[fullKey]);\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async getAll<P extends T>(): Promise<P> {\n return new Promise((resolve, reject) => {\n this.storage.get(null, (result) => {\n try {\n throwRuntimeError()\n\n const formattedResult = {} as P;\n\n for (const [key, value] of Object.entries(result)) {\n if (this.isKeyValid(key)) {\n formattedResult[this.getOriginalKey(key)] = value;\n }\n }\n\n resolve(formattedResult);\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n\n public async remove<K extends keyof T>(keys: K | K[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullKeys = Array.isArray(keys)\n ? keys.map(key => this.getFullKey(key))\n : this.getFullKey(keys);\n\n this.storage.remove(fullKeys, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n public watch<P extends T>(options: StorageWatchOptions<P>): () => void {\n const listener: onChangedListener = (changes: Record<string, StorageChange>, area: AreaName) => {\n if (area !== this.area) return;\n\n Object.entries(changes).forEach(async ([key, change]) => {\n if (this.isKeyValid(key)) {\n this.handleChange(key, change, options);\n }\n });\n };\n\n storage.onChanged.addListener(listener);\n\n return () => storage.onChanged.removeListener(listener);\n };\n\n protected isKeyValid(key: string): boolean {\n return this.getNamespaceOfKey(key) === this.namespace;\n }\n\n protected async triggerChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const {newValue, oldValue} = changes;\n const originalKey = this.getOriginalKey(key)\n\n if (typeof options === \"function\") {\n options(newValue, oldValue);\n } else if (options[originalKey]) {\n options[originalKey]?.(newValue, oldValue);\n }\n };\n\n protected getOriginalKey(key: string): keyof T {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length > 1 ? fullKeyParts[fullKeyParts.length - 1] : key;\n }\n\n}\n","import {StorageState, StorageWatchOptions} from '@typing/storage'\n\nimport AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport default class Storage<T extends StorageState> extends AbstractStorage<T> {\n static Sync<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'sync', namespace});\n }\n\n static Local<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'local', namespace});\n }\n\n static Session<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'session', namespace});\n }\n\n static Managed<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'managed', namespace});\n }\n\n constructor(options: StorageOptions = {}) {\n super(options)\n }\n\n public async clear(): Promise<void> {\n const allValues = await this.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n const parts = key.split(this.separator);\n\n return (parts.length === 1 || (parts.length === 2 && parts[0] === this.namespace))\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n await this.triggerChange(key, changes, options)\n };\n\n protected getFullKey(key: keyof T): string {\n return this.namespace ? `${this.namespace}${this.separator}${key.toString()}` : key.toString();\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 2 ? fullKeyParts[0] : undefined;\n }\n}\n","import AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\nimport {StorageState, StorageWatchOptions} from \"@typing/storage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport interface SecureStorageOptions extends StorageOptions {\n secureKey?: string;\n}\n\nexport default class SecureStorage<T extends StorageState> extends AbstractStorage<T> {\n private readonly secureKey: string;\n\n private cryptoKey: CryptoKey | null = null;\n\n static Sync<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'sync', ...options});\n }\n\n static Local<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'local', ...options});\n }\n\n static Session<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'session', ...options});\n }\n\n static Managed<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'managed', ...options});\n }\n\n constructor({secureKey, ...options}: SecureStorageOptions = {}) {\n super(options)\n this.secureKey = secureKey?.trim() || 'SecureKey';\n }\n\n private async generateCryptoKey(): Promise<CryptoKey> {\n if (this.cryptoKey) return this.cryptoKey;\n\n const hash = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(this.secureKey));\n const key = await crypto.subtle.importKey(\n \"raw\",\n hash.slice(0, 32),\n {name: \"AES-GCM\"},\n false,\n [\"encrypt\", \"decrypt\"]\n );\n this.cryptoKey = key;\n return key;\n }\n\n private async encrypt(data: any): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoded = new TextEncoder().encode(JSON.stringify(data));\n const cryptoKey = await this.generateCryptoKey();\n const cipher = await crypto.subtle.encrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n encoded\n );\n return `${btoa(String.fromCharCode(...new Uint8Array(iv)))}:${btoa(String.fromCharCode(...new Uint8Array(cipher)))}`;\n }\n\n private async decrypt(data: string): Promise<any> {\n const [ivStr, cipherStr] = data.split(\":\");\n const iv = new Uint8Array(atob(ivStr).split(\"\").map(c => c.charCodeAt(0)));\n const cipher = new Uint8Array(atob(cipherStr).split(\"\").map(c => c.charCodeAt(0)));\n const cryptoKey = await this.generateCryptoKey();\n const decrypted = await crypto.subtle.decrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n cipher\n );\n return JSON.parse(new TextDecoder().decode(decrypted));\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n if (value === undefined) return;\n const encryptedValue = await this.encrypt(value);\n return super.set(key, encryptedValue as T[K]);\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const encryptedValue = await super.get(key) as string;\n return encryptedValue ? this.decrypt(encryptedValue) : undefined;\n }\n\n public async getAll<P extends T>(): Promise<P> {\n const encryptedValues = await super.getAll<P>();\n\n const decryptedValues: Partial<Record<keyof P, any>> = {};\n\n for (const [key, value] of Object.entries(encryptedValues)) {\n decryptedValues[key as keyof P] = value ? await this.decrypt(value.toString()) : undefined;\n }\n\n return decryptedValues as P;\n }\n\n public async clear(): Promise<void> {\n const allValues = await super.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n return key.startsWith(`secure${this.separator}`);\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const newValue = changes.newValue !== undefined ? await this.decrypt(changes.newValue) : undefined;\n const oldValue = changes.oldValue !== undefined ? await this.decrypt(changes.oldValue) : undefined;\n\n await this.triggerChange(key, {newValue, oldValue}, options)\n };\n\n protected getFullKey(key: keyof T): string {\n const parts: string[] = ['secure'];\n\n this.namespace && parts.push(this.namespace);\n\n return [...parts, key.toString()].join(this.separator);\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 3 ? fullKeyParts[1] : undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/browser/browser.ts","../../src/browser/runtime.ts","../../src/storage/providers/AbstractStorage.ts","../../src/storage/providers/Storage.ts","../../src/storage/providers/SecureStorage.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const browser = (): typeof chrome => {\n return chrome;\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 {browser} from '@browser/browser'\nimport {throwRuntimeError} from '@browser/runtime'\nimport {StorageProvider, StorageState, StorageWatchOptions} from '@typing/storage'\n\nconst storage = browser().storage;\n\ntype AreaName = chrome.storage.AreaName\ntype StorageArea = chrome.storage.StorageArea;\ntype StorageChange = chrome.storage.StorageChange;\ntype onChangedListener = Parameters<typeof chrome.storage.onChanged.addListener>[0];\n\nexport interface StorageOptions {\n area?: AreaName,\n namespace?: string,\n}\n\nexport default abstract class AbstractStorage<T extends StorageState> implements StorageProvider<T> {\n private storage: StorageArea;\n private readonly area: AreaName;\n protected readonly namespace?: string;\n protected separator: string = ':';\n\n public abstract clear(): Promise<void>;\n\n protected abstract getFullKey(key: keyof T): string;\n\n protected abstract getNamespaceOfKey(key: string): string | undefined;\n\n protected abstract handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>): void\n\n protected constructor({area, namespace}: StorageOptions = {}) {\n this.area = area ?? \"local\";\n this.storage = storage[this.area];\n this.namespace = namespace?.trim() ? namespace?.trim() : undefined;\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n return new Promise((resolve, reject) => {\n this.storage.set({[this.getFullKey(key)]: value}, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const fullKey = this.getFullKey(key);\n return new Promise((resolve, reject) => {\n this.storage.get(fullKey, (result) => {\n try {\n throwRuntimeError()\n resolve(result[fullKey]);\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async getAll<P extends T>(): Promise<P> {\n return new Promise((resolve, reject) => {\n this.storage.get(null, (result) => {\n try {\n throwRuntimeError()\n\n const formattedResult = {} as P;\n\n for (const [key, value] of Object.entries(result)) {\n if (this.isKeyValid(key)) {\n formattedResult[this.getOriginalKey(key)] = value;\n }\n }\n\n resolve(formattedResult);\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n\n public async remove<K extends keyof T>(keys: K | K[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullKeys = Array.isArray(keys)\n ? keys.map(key => this.getFullKey(key))\n : this.getFullKey(keys);\n\n this.storage.remove(fullKeys, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n public watch<P extends T>(options: StorageWatchOptions<P>): () => void {\n const listener: onChangedListener = (changes: Record<string, StorageChange>, area: AreaName) => {\n if (area !== this.area) return;\n\n Object.entries(changes).forEach(async ([key, change]) => {\n if (this.isKeyValid(key)) {\n this.handleChange(key, change, options);\n }\n });\n };\n\n storage.onChanged.addListener(listener);\n\n return () => storage.onChanged.removeListener(listener);\n };\n\n protected isKeyValid(key: string): boolean {\n return this.getNamespaceOfKey(key) === this.namespace;\n }\n\n protected async triggerChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const {newValue, oldValue} = changes;\n const originalKey = this.getOriginalKey(key)\n\n if (typeof options === \"function\") {\n options(newValue, oldValue);\n } else if (options[originalKey]) {\n options[originalKey]?.(newValue, oldValue);\n }\n };\n\n protected getOriginalKey(key: string): keyof T {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length > 1 ? fullKeyParts[fullKeyParts.length - 1] : key;\n }\n\n}\n","import {StorageState, StorageWatchOptions} from '@typing/storage'\n\nimport AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport default class Storage<T extends StorageState> extends AbstractStorage<T> {\n static Sync<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'sync', namespace});\n }\n\n static Local<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'local', namespace});\n }\n\n static Session<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'session', namespace});\n }\n\n static Managed<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'managed', namespace});\n }\n\n constructor(options: StorageOptions = {}) {\n super(options)\n }\n\n public async clear(): Promise<void> {\n const allValues = await this.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n const parts = key.split(this.separator);\n\n return (parts.length === 1 || (parts.length === 2 && parts[0] === this.namespace))\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n await this.triggerChange(key, changes, options)\n };\n\n protected getFullKey(key: keyof T): string {\n return this.namespace ? `${this.namespace}${this.separator}${key.toString()}` : key.toString();\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 2 ? fullKeyParts[0] : undefined;\n }\n}\n","import AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\nimport {StorageState, StorageWatchOptions} from \"@typing/storage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport interface SecureStorageOptions extends StorageOptions {\n secureKey?: string;\n}\n\nexport default class SecureStorage<T extends StorageState> extends AbstractStorage<T> {\n private readonly secureKey: string;\n\n private cryptoKey: CryptoKey | null = null;\n\n static Sync<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'sync', ...options});\n }\n\n static Local<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'local', ...options});\n }\n\n static Session<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'session', ...options});\n }\n\n static Managed<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'managed', ...options});\n }\n\n constructor({secureKey, ...options}: SecureStorageOptions = {}) {\n super(options)\n this.secureKey = secureKey?.trim() || 'SecureKey';\n }\n\n private async generateCryptoKey(): Promise<CryptoKey> {\n if (this.cryptoKey) return this.cryptoKey;\n\n const hash = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(this.secureKey));\n const key = await crypto.subtle.importKey(\n \"raw\",\n hash.slice(0, 32),\n {name: \"AES-GCM\"},\n false,\n [\"encrypt\", \"decrypt\"]\n );\n this.cryptoKey = key;\n return key;\n }\n\n private async encrypt(data: any): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoded = new TextEncoder().encode(JSON.stringify(data));\n const cryptoKey = await this.generateCryptoKey();\n const cipher = await crypto.subtle.encrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n encoded\n );\n return `${btoa(String.fromCharCode(...new Uint8Array(iv)))}:${btoa(String.fromCharCode(...new Uint8Array(cipher)))}`;\n }\n\n private async decrypt(data: string): Promise<any> {\n const [ivStr, cipherStr] = data.split(\":\");\n const iv = new Uint8Array(atob(ivStr).split(\"\").map(c => c.charCodeAt(0)));\n const cipher = new Uint8Array(atob(cipherStr).split(\"\").map(c => c.charCodeAt(0)));\n const cryptoKey = await this.generateCryptoKey();\n const decrypted = await crypto.subtle.decrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n cipher\n );\n return JSON.parse(new TextDecoder().decode(decrypted));\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n if (value === undefined) return;\n const encryptedValue = await this.encrypt(value);\n return super.set(key, encryptedValue as T[K]);\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const encryptedValue = await super.get(key) as string;\n return encryptedValue ? this.decrypt(encryptedValue) : undefined;\n }\n\n public async getAll<P extends T>(): Promise<P> {\n const encryptedValues = await super.getAll<P>();\n\n const decryptedValues: Partial<Record<keyof P, any>> = {};\n\n for (const [key, value] of Object.entries(encryptedValues)) {\n decryptedValues[key as keyof P] = value ? await this.decrypt(value.toString()) : undefined;\n }\n\n return decryptedValues as P;\n }\n\n public async clear(): Promise<void> {\n const allValues = await super.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n return key.startsWith(`secure${this.separator}`);\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const newValue = changes.newValue !== undefined ? await this.decrypt(changes.newValue) : undefined;\n const oldValue = changes.oldValue !== undefined ? await this.decrypt(changes.oldValue) : undefined;\n\n await this.triggerChange(key, {newValue, oldValue}, options)\n };\n\n protected getFullKey(key: keyof T): string {\n const parts: string[] = ['secure'];\n\n this.namespace && parts.push(this.namespace);\n\n return [...parts, key.toString()].join(this.separator);\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 3 ? fullKeyParts[1] : undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/browser/browser.ts","../../src/browser/runtime.ts","../../src/storage/providers/AbstractStorage.ts","../../src/storage/providers/Storage.ts","../../src/storage/providers/SecureStorage.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["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 {browser} from '@browser/browser'\nimport {throwRuntimeError} from '@browser/runtime'\nimport {StorageProvider, StorageState, StorageWatchOptions} from '@typing/storage'\n\nconst storage = browser().storage;\n\ntype AreaName = chrome.storage.AreaName\ntype StorageArea = chrome.storage.StorageArea;\ntype StorageChange = chrome.storage.StorageChange;\ntype onChangedListener = Parameters<typeof chrome.storage.onChanged.addListener>[0];\n\nexport interface StorageOptions {\n area?: AreaName,\n namespace?: string,\n}\n\nexport default abstract class AbstractStorage<T extends StorageState> implements StorageProvider<T> {\n private storage: StorageArea;\n private readonly area: AreaName;\n protected readonly namespace?: string;\n protected separator: string = ':';\n\n public abstract clear(): Promise<void>;\n\n protected abstract getFullKey(key: keyof T): string;\n\n protected abstract getNamespaceOfKey(key: string): string | undefined;\n\n protected abstract handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>): void\n\n protected constructor({area, namespace}: StorageOptions = {}) {\n this.area = area ?? \"local\";\n this.storage = storage[this.area];\n this.namespace = namespace?.trim() ? namespace?.trim() : undefined;\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n return new Promise((resolve, reject) => {\n this.storage.set({[this.getFullKey(key)]: value}, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const fullKey = this.getFullKey(key);\n return new Promise((resolve, reject) => {\n this.storage.get(fullKey, (result) => {\n try {\n throwRuntimeError()\n resolve(result[fullKey]);\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async getAll<P extends T>(): Promise<P> {\n return new Promise((resolve, reject) => {\n this.storage.get(null, (result) => {\n try {\n throwRuntimeError()\n\n const formattedResult = {} as P;\n\n for (const [key, value] of Object.entries(result)) {\n if (this.isKeyValid(key)) {\n formattedResult[this.getOriginalKey(key)] = value;\n }\n }\n\n resolve(formattedResult);\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n\n public async remove<K extends keyof T>(keys: K | K[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullKeys = Array.isArray(keys)\n ? keys.map(key => this.getFullKey(key))\n : this.getFullKey(keys);\n\n this.storage.remove(fullKeys, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n public watch<P extends T>(options: StorageWatchOptions<P>): () => void {\n const listener: onChangedListener = (changes: Record<string, StorageChange>, area: AreaName) => {\n if (area !== this.area) return;\n\n Object.entries(changes).forEach(async ([key, change]) => {\n if (this.isKeyValid(key)) {\n this.handleChange(key, change, options);\n }\n });\n };\n\n storage.onChanged.addListener(listener);\n\n return () => storage.onChanged.removeListener(listener);\n };\n\n protected isKeyValid(key: string): boolean {\n return this.getNamespaceOfKey(key) === this.namespace;\n }\n\n protected async triggerChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const {newValue, oldValue} = changes;\n const originalKey = this.getOriginalKey(key)\n\n if (typeof options === \"function\") {\n options(newValue, oldValue);\n } else if (options[originalKey]) {\n options[originalKey]?.(newValue, oldValue);\n }\n };\n\n protected getOriginalKey(key: string): keyof T {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length > 1 ? fullKeyParts[fullKeyParts.length - 1] : key;\n }\n\n}\n","import {StorageState, StorageWatchOptions} from '@typing/storage'\n\nimport AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport default class Storage<T extends StorageState> extends AbstractStorage<T> {\n static Sync<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'sync', namespace});\n }\n\n static Local<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'local', namespace});\n }\n\n static Session<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'session', namespace});\n }\n\n static Managed<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'managed', namespace});\n }\n\n constructor(options: StorageOptions = {}) {\n super(options)\n }\n\n public async clear(): Promise<void> {\n const allValues = await this.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n const parts = key.split(this.separator);\n\n return (parts.length === 1 || (parts.length === 2 && parts[0] === this.namespace))\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n await this.triggerChange(key, changes, options)\n };\n\n protected getFullKey(key: keyof T): string {\n return this.namespace ? `${this.namespace}${this.separator}${key.toString()}` : key.toString();\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 2 ? fullKeyParts[0] : undefined;\n }\n}\n","import AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\nimport {StorageState, StorageWatchOptions} from \"@typing/storage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport interface SecureStorageOptions extends StorageOptions {\n secureKey?: string;\n}\n\nexport default class SecureStorage<T extends StorageState> extends AbstractStorage<T> {\n private readonly secureKey: string;\n\n private cryptoKey: CryptoKey | null = null;\n\n static Sync<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'sync', ...options});\n }\n\n static Local<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'local', ...options});\n }\n\n static Session<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'session', ...options});\n }\n\n static Managed<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'managed', ...options});\n }\n\n constructor({secureKey, ...options}: SecureStorageOptions = {}) {\n super(options)\n this.secureKey = secureKey?.trim() || 'SecureKey';\n }\n\n private async generateCryptoKey(): Promise<CryptoKey> {\n if (this.cryptoKey) return this.cryptoKey;\n\n const hash = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(this.secureKey));\n const key = await crypto.subtle.importKey(\n \"raw\",\n hash.slice(0, 32),\n {name: \"AES-GCM\"},\n false,\n [\"encrypt\", \"decrypt\"]\n );\n this.cryptoKey = key;\n return key;\n }\n\n private async encrypt(data: any): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoded = new TextEncoder().encode(JSON.stringify(data));\n const cryptoKey = await this.generateCryptoKey();\n const cipher = await crypto.subtle.encrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n encoded\n );\n return `${btoa(String.fromCharCode(...new Uint8Array(iv)))}:${btoa(String.fromCharCode(...new Uint8Array(cipher)))}`;\n }\n\n private async decrypt(data: string): Promise<any> {\n const [ivStr, cipherStr] = data.split(\":\");\n const iv = new Uint8Array(atob(ivStr).split(\"\").map(c => c.charCodeAt(0)));\n const cipher = new Uint8Array(atob(cipherStr).split(\"\").map(c => c.charCodeAt(0)));\n const cryptoKey = await this.generateCryptoKey();\n const decrypted = await crypto.subtle.decrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n cipher\n );\n return JSON.parse(new TextDecoder().decode(decrypted));\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n if (value === undefined) return;\n const encryptedValue = await this.encrypt(value);\n return super.set(key, encryptedValue as T[K]);\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const encryptedValue = await super.get(key) as string;\n return encryptedValue ? this.decrypt(encryptedValue) : undefined;\n }\n\n public async getAll<P extends T>(): Promise<P> {\n const encryptedValues = await super.getAll<P>();\n\n const decryptedValues: Partial<Record<keyof P, any>> = {};\n\n for (const [key, value] of Object.entries(encryptedValues)) {\n decryptedValues[key as keyof P] = value ? await this.decrypt(value.toString()) : undefined;\n }\n\n return decryptedValues as P;\n }\n\n public async clear(): Promise<void> {\n const allValues = await super.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n return key.startsWith(`secure${this.separator}`);\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const newValue = changes.newValue !== undefined ? await this.decrypt(changes.newValue) : undefined;\n const oldValue = changes.oldValue !== undefined ? await this.decrypt(changes.oldValue) : undefined;\n\n await this.triggerChange(key, {newValue, oldValue}, options)\n };\n\n protected getFullKey(key: keyof T): string {\n const parts: string[] = ['secure'];\n\n this.namespace && parts.push(this.namespace);\n\n return [...parts, key.toString()].join(this.separator);\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 3 ? fullKeyParts[1] : undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/browser/browser.ts","../../src/browser/runtime.ts","../../src/storage/providers/AbstractStorage.ts","../../src/storage/providers/Storage.ts","../../src/storage/providers/SecureStorage.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const browser = (): typeof chrome => {\n return chrome;\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 {browser} from '@browser/browser'\nimport {throwRuntimeError} from '@browser/runtime'\nimport {StorageProvider, StorageState, StorageWatchOptions} from '@typing/storage'\n\nconst storage = browser().storage;\n\ntype AreaName = chrome.storage.AreaName\ntype StorageArea = chrome.storage.StorageArea;\ntype StorageChange = chrome.storage.StorageChange;\ntype onChangedListener = Parameters<typeof chrome.storage.onChanged.addListener>[0];\n\nexport interface StorageOptions {\n area?: AreaName,\n namespace?: string,\n}\n\nexport default abstract class AbstractStorage<T extends StorageState> implements StorageProvider<T> {\n private storage: StorageArea;\n private readonly area: AreaName;\n protected readonly namespace?: string;\n protected separator: string = ':';\n\n public abstract clear(): Promise<void>;\n\n protected abstract getFullKey(key: keyof T): string;\n\n protected abstract getNamespaceOfKey(key: string): string | undefined;\n\n protected abstract handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>): void\n\n protected constructor({area, namespace}: StorageOptions = {}) {\n this.area = area ?? \"local\";\n this.storage = storage[this.area];\n this.namespace = namespace?.trim() ? namespace?.trim() : undefined;\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n return new Promise((resolve, reject) => {\n this.storage.set({[this.getFullKey(key)]: value}, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const fullKey = this.getFullKey(key);\n return new Promise((resolve, reject) => {\n this.storage.get(fullKey, (result) => {\n try {\n throwRuntimeError()\n resolve(result[fullKey]);\n } catch (e) {\n reject(e)\n }\n });\n });\n }\n\n public async getAll<P extends T>(): Promise<P> {\n return new Promise((resolve, reject) => {\n this.storage.get(null, (result) => {\n try {\n throwRuntimeError()\n\n const formattedResult = {} as P;\n\n for (const [key, value] of Object.entries(result)) {\n if (this.isKeyValid(key)) {\n formattedResult[this.getOriginalKey(key)] = value;\n }\n }\n\n resolve(formattedResult);\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n\n public async remove<K extends keyof T>(keys: K | K[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullKeys = Array.isArray(keys)\n ? keys.map(key => this.getFullKey(key))\n : this.getFullKey(keys);\n\n this.storage.remove(fullKeys, () => {\n try {\n throwRuntimeError()\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n\n public watch<P extends T>(options: StorageWatchOptions<P>): () => void {\n const listener: onChangedListener = (changes: Record<string, StorageChange>, area: AreaName) => {\n if (area !== this.area) return;\n\n Object.entries(changes).forEach(async ([key, change]) => {\n if (this.isKeyValid(key)) {\n this.handleChange(key, change, options);\n }\n });\n };\n\n storage.onChanged.addListener(listener);\n\n return () => storage.onChanged.removeListener(listener);\n };\n\n protected isKeyValid(key: string): boolean {\n return this.getNamespaceOfKey(key) === this.namespace;\n }\n\n protected async triggerChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const {newValue, oldValue} = changes;\n const originalKey = this.getOriginalKey(key)\n\n if (typeof options === \"function\") {\n options(newValue, oldValue);\n } else if (options[originalKey]) {\n options[originalKey]?.(newValue, oldValue);\n }\n };\n\n protected getOriginalKey(key: string): keyof T {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length > 1 ? fullKeyParts[fullKeyParts.length - 1] : key;\n }\n\n}\n","import {StorageState, StorageWatchOptions} from '@typing/storage'\n\nimport AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport default class Storage<T extends StorageState> extends AbstractStorage<T> {\n static Sync<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'sync', namespace});\n }\n\n static Local<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'local', namespace});\n }\n\n static Session<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'session', namespace});\n }\n\n static Managed<T extends StorageState>(namespace?: string): Storage<T> {\n return new Storage<T>({area: 'managed', namespace});\n }\n\n constructor(options: StorageOptions = {}) {\n super(options)\n }\n\n public async clear(): Promise<void> {\n const allValues = await this.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n const parts = key.split(this.separator);\n\n return (parts.length === 1 || (parts.length === 2 && parts[0] === this.namespace))\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n await this.triggerChange(key, changes, options)\n };\n\n protected getFullKey(key: keyof T): string {\n return this.namespace ? `${this.namespace}${this.separator}${key.toString()}` : key.toString();\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 2 ? fullKeyParts[0] : undefined;\n }\n}\n","import AbstractStorage, {StorageOptions} from \"./AbstractStorage\";\n\nimport {StorageState, StorageWatchOptions} from \"@typing/storage\";\n\ntype StorageChange = chrome.storage.StorageChange;\n\nexport interface SecureStorageOptions extends StorageOptions {\n secureKey?: string;\n}\n\nexport default class SecureStorage<T extends StorageState> extends AbstractStorage<T> {\n private readonly secureKey: string;\n\n private cryptoKey: CryptoKey | null = null;\n\n static Sync<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'sync', ...options});\n }\n\n static Local<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'local', ...options});\n }\n\n static Session<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'session', ...options});\n }\n\n static Managed<T extends StorageState>(options: Omit<SecureStorageOptions, 'area'>): SecureStorage<T> {\n return new SecureStorage<T>({area: 'managed', ...options});\n }\n\n constructor({secureKey, ...options}: SecureStorageOptions = {}) {\n super(options)\n this.secureKey = secureKey?.trim() || 'SecureKey';\n }\n\n private async generateCryptoKey(): Promise<CryptoKey> {\n if (this.cryptoKey) return this.cryptoKey;\n\n const hash = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(this.secureKey));\n const key = await crypto.subtle.importKey(\n \"raw\",\n hash.slice(0, 32),\n {name: \"AES-GCM\"},\n false,\n [\"encrypt\", \"decrypt\"]\n );\n this.cryptoKey = key;\n return key;\n }\n\n private async encrypt(data: any): Promise<string> {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoded = new TextEncoder().encode(JSON.stringify(data));\n const cryptoKey = await this.generateCryptoKey();\n const cipher = await crypto.subtle.encrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n encoded\n );\n return `${btoa(String.fromCharCode(...new Uint8Array(iv)))}:${btoa(String.fromCharCode(...new Uint8Array(cipher)))}`;\n }\n\n private async decrypt(data: string): Promise<any> {\n const [ivStr, cipherStr] = data.split(\":\");\n const iv = new Uint8Array(atob(ivStr).split(\"\").map(c => c.charCodeAt(0)));\n const cipher = new Uint8Array(atob(cipherStr).split(\"\").map(c => c.charCodeAt(0)));\n const cryptoKey = await this.generateCryptoKey();\n const decrypted = await crypto.subtle.decrypt(\n {name: \"AES-GCM\", iv},\n cryptoKey,\n cipher\n );\n return JSON.parse(new TextDecoder().decode(decrypted));\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n if (value === undefined) return;\n const encryptedValue = await this.encrypt(value);\n return super.set(key, encryptedValue as T[K]);\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n const encryptedValue = await super.get(key) as string;\n return encryptedValue ? this.decrypt(encryptedValue) : undefined;\n }\n\n public async getAll<P extends T>(): Promise<P> {\n const encryptedValues = await super.getAll<P>();\n\n const decryptedValues: Partial<Record<keyof P, any>> = {};\n\n for (const [key, value] of Object.entries(encryptedValues)) {\n decryptedValues[key as keyof P] = value ? await this.decrypt(value.toString()) : undefined;\n }\n\n return decryptedValues as P;\n }\n\n public async clear(): Promise<void> {\n const allValues = await super.getAll();\n\n await this.remove(Object.keys(allValues));\n }\n\n protected isKeyValid(key: string): boolean {\n if (!super.isKeyValid(key)) return false;\n\n return key.startsWith(`secure${this.separator}`);\n }\n\n protected async handleChange<P extends T>(key: string, changes: StorageChange, options: StorageWatchOptions<P>) {\n const newValue = changes.newValue !== undefined ? await this.decrypt(changes.newValue) : undefined;\n const oldValue = changes.oldValue !== undefined ? await this.decrypt(changes.oldValue) : undefined;\n\n await this.triggerChange(key, {newValue, oldValue}, options)\n };\n\n protected getFullKey(key: keyof T): string {\n const parts: string[] = ['secure'];\n\n this.namespace && parts.push(this.namespace);\n\n return [...parts, key.toString()].join(this.separator);\n }\n\n protected getNamespaceOfKey(key: string): string | undefined {\n const fullKeyParts = key.split(this.separator);\n return fullKeyParts.length === 3 ? fullKeyParts[1] : undefined;\n }\n}\n"]}