@mtcute/web 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/cjs/client.js.map +1 -1
  2. package/cjs/common-internals-web/base64.js.map +1 -0
  3. package/cjs/common-internals-web/hex.js.map +1 -0
  4. package/cjs/common-internals-web/logging.d.ts +2 -0
  5. package/cjs/{logging.js → common-internals-web/logging.js} +2 -2
  6. package/cjs/common-internals-web/logging.js.map +1 -0
  7. package/cjs/{encodings → common-internals-web}/utf8.js +1 -1
  8. package/cjs/common-internals-web/utf8.js.map +1 -0
  9. package/cjs/crypto.js +2 -0
  10. package/cjs/crypto.js.map +1 -1
  11. package/cjs/exit-hook.js.map +1 -1
  12. package/cjs/idb/driver.js +6 -4
  13. package/cjs/idb/driver.js.map +1 -1
  14. package/cjs/idb/index.d.ts +1 -1
  15. package/cjs/idb/index.js +6 -0
  16. package/cjs/idb/index.js.map +1 -1
  17. package/cjs/idb/repository/auth-keys.js +1 -0
  18. package/cjs/idb/repository/auth-keys.js.map +1 -1
  19. package/cjs/idb/repository/kv.js +1 -0
  20. package/cjs/idb/repository/kv.js.map +1 -1
  21. package/cjs/idb/repository/peers.js +1 -0
  22. package/cjs/idb/repository/peers.js.map +1 -1
  23. package/cjs/idb/repository/ref-messages.js +1 -0
  24. package/cjs/idb/repository/ref-messages.js.map +1 -1
  25. package/cjs/idb/utils.js.map +1 -1
  26. package/cjs/index.js +6 -0
  27. package/cjs/platform.d.ts +4 -4
  28. package/cjs/platform.js +4 -4
  29. package/cjs/platform.js.map +1 -1
  30. package/cjs/utils.d.ts +1 -0
  31. package/cjs/utils.js +24 -0
  32. package/cjs/utils.js.map +1 -0
  33. package/cjs/wasm.js.map +1 -1
  34. package/cjs/websocket.d.ts +3 -2
  35. package/cjs/websocket.js +24 -13
  36. package/cjs/websocket.js.map +1 -1
  37. package/cjs/worker.js +1 -0
  38. package/cjs/worker.js.map +1 -1
  39. package/esm/client.js.map +1 -1
  40. package/esm/common-internals-web/base64.js.map +1 -0
  41. package/esm/common-internals-web/hex.js.map +1 -0
  42. package/esm/common-internals-web/logging.d.ts +2 -0
  43. package/esm/{logging.js → common-internals-web/logging.js} +2 -2
  44. package/esm/common-internals-web/logging.js.map +1 -0
  45. package/esm/{encodings → common-internals-web}/utf8.js +1 -1
  46. package/esm/common-internals-web/utf8.js.map +1 -0
  47. package/esm/crypto.js +2 -0
  48. package/esm/crypto.js.map +1 -1
  49. package/esm/exit-hook.js.map +1 -1
  50. package/esm/idb/driver.js +6 -4
  51. package/esm/idb/driver.js.map +1 -1
  52. package/esm/idb/index.d.ts +1 -1
  53. package/esm/idb/index.js +6 -0
  54. package/esm/idb/index.js.map +1 -1
  55. package/esm/idb/repository/auth-keys.js +1 -0
  56. package/esm/idb/repository/auth-keys.js.map +1 -1
  57. package/esm/idb/repository/kv.js +1 -0
  58. package/esm/idb/repository/kv.js.map +1 -1
  59. package/esm/idb/repository/peers.js +1 -0
  60. package/esm/idb/repository/peers.js.map +1 -1
  61. package/esm/idb/repository/ref-messages.js +1 -0
  62. package/esm/idb/repository/ref-messages.js.map +1 -1
  63. package/esm/idb/utils.js.map +1 -1
  64. package/esm/platform.d.ts +4 -4
  65. package/esm/platform.js +4 -4
  66. package/esm/platform.js.map +1 -1
  67. package/esm/utils.d.ts +1 -0
  68. package/esm/utils.js +2 -0
  69. package/esm/utils.js.map +1 -0
  70. package/esm/wasm.js.map +1 -1
  71. package/esm/websocket.d.ts +3 -2
  72. package/esm/websocket.js +24 -13
  73. package/esm/websocket.js.map +1 -1
  74. package/esm/worker.js +1 -0
  75. package/esm/worker.js.map +1 -1
  76. package/index.d.ts +1 -0
  77. package/index.js +1 -0
  78. package/package.json +14 -4
  79. package/utils.d.ts +1 -0
  80. package/utils.js +1 -0
  81. package/cjs/encodings/base64.js.map +0 -1
  82. package/cjs/encodings/hex.js.map +0 -1
  83. package/cjs/encodings/utf8.js.map +0 -1
  84. package/cjs/logging.d.ts +0 -1
  85. package/cjs/logging.js.map +0 -1
  86. package/esm/encodings/base64.js.map +0 -1
  87. package/esm/encodings/hex.js.map +0 -1
  88. package/esm/encodings/utf8.js.map +0 -1
  89. package/esm/logging.d.ts +0 -1
  90. package/esm/logging.js.map +0 -1
  91. /package/cjs/{encodings → common-internals-web}/base64.d.ts +0 -0
  92. /package/cjs/{encodings → common-internals-web}/base64.js +0 -0
  93. /package/cjs/{encodings → common-internals-web}/hex.d.ts +0 -0
  94. /package/cjs/{encodings → common-internals-web}/hex.js +0 -0
  95. /package/cjs/{encodings → common-internals-web}/utf8.d.ts +0 -0
  96. /package/esm/{encodings → common-internals-web}/base64.d.ts +0 -0
  97. /package/esm/{encodings → common-internals-web}/base64.js +0 -0
  98. /package/esm/{encodings → common-internals-web}/hex.d.ts +0 -0
  99. /package/esm/{encodings → common-internals-web}/hex.js +0 -0
  100. /package/esm/{encodings → common-internals-web}/utf8.d.ts +0 -0
package/cjs/websocket.js CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.WebSocketTransport = exports.BaseWebSocketTransport = void 0;
7
7
  const events_1 = __importDefault(require("events"));
8
8
  const core_1 = require("@mtcute/core");
9
+ const utils_js_1 = require("@mtcute/core/utils.js");
9
10
  const subdomainsMap = {
10
11
  '1': 'pluto',
11
12
  '2': 'venus',
@@ -18,12 +19,17 @@ const subdomainsMap = {
18
19
  * Subclasses must provide packet codec in `_packetCodec` property
19
20
  */
20
21
  class BaseWebSocketTransport extends events_1.default {
22
+ _currentDc = null;
23
+ _state = core_1.TransportState.Idle;
24
+ _socket = null;
25
+ _crypto;
26
+ log;
27
+ packetCodecInitialized = false;
28
+ _baseDomain;
29
+ _subdomains;
30
+ _WebSocket;
21
31
  constructor({ ws = WebSocket, baseDomain = 'web.telegram.org', subdomains = subdomainsMap, } = {}) {
22
32
  super();
23
- this._currentDc = null;
24
- this._state = core_1.TransportState.Idle;
25
- this._socket = null;
26
- this.packetCodecInitialized = false;
27
33
  if (!ws) {
28
34
  throw new core_1.MtUnsupportedError('To use WebSocket transport with NodeJS, install `ws` package and pass it to constructor');
29
35
  }
@@ -34,7 +40,6 @@ class BaseWebSocketTransport extends events_1.default {
34
40
  this._baseDomain = baseDomain;
35
41
  this._subdomains = subdomains;
36
42
  this._WebSocket = ws;
37
- this.close = this.close.bind(this);
38
43
  }
39
44
  _updateLogPrefix() {
40
45
  if (this._currentDc) {
@@ -73,19 +78,28 @@ class BaseWebSocketTransport extends events_1.default {
73
78
  this._socket.addEventListener('message', (evt) => this._packetCodec.feed(new Uint8Array(evt.data)));
74
79
  this._socket.addEventListener('open', this.handleConnect.bind(this));
75
80
  this._socket.addEventListener('error', this.handleError.bind(this));
76
- this._socket.addEventListener('close', this.close);
81
+ this._socket.addEventListener('close', this.handleClosed.bind(this));
77
82
  }
78
- close() {
83
+ _closeWaiters = [];
84
+ async close() {
79
85
  if (this._state === core_1.TransportState.Idle)
80
86
  return;
87
+ const promise = (0, utils_js_1.createControllablePromise)();
88
+ this._closeWaiters.push(promise);
89
+ this._socket.close();
90
+ return promise;
91
+ }
92
+ handleClosed() {
81
93
  this.log.info('connection closed');
82
94
  this._state = core_1.TransportState.Idle;
83
- this._socket.removeEventListener('close', this.close);
84
- this._socket.close();
85
95
  this._socket = null;
86
96
  this._currentDc = null;
87
97
  this._packetCodec.reset();
88
98
  this.emit('close');
99
+ for (const waiter of this._closeWaiters) {
100
+ waiter.resolve();
101
+ }
102
+ this._closeWaiters = [];
89
103
  }
90
104
  handleError(event) {
91
105
  const error = 'error' in event ? event.error : new Error('unknown WebSocket error');
@@ -112,10 +126,7 @@ class BaseWebSocketTransport extends events_1.default {
112
126
  }
113
127
  exports.BaseWebSocketTransport = BaseWebSocketTransport;
114
128
  class WebSocketTransport extends BaseWebSocketTransport {
115
- constructor() {
116
- super(...arguments);
117
- this._packetCodec = new core_1.ObfuscatedPacketCodec(new core_1.IntermediatePacketCodec());
118
- }
129
+ _packetCodec = new core_1.ObfuscatedPacketCodec(new core_1.IntermediatePacketCodec());
119
130
  }
120
131
  exports.WebSocketTransport = WebSocketTransport;
121
132
  //# sourceMappingURL=websocket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\n\nimport {\n IntermediatePacketCodec,\n IPacketCodec,\n ITelegramTransport,\n MtcuteError,\n MtUnsupportedError,\n ObfuscatedPacketCodec,\n TransportState,\n} from '@mtcute/core'\nimport { BasicDcOption, ICryptoProvider, Logger } from '@mtcute/core/utils.js'\n\nexport type WebSocketConstructor = {\n new (address: string, protocol?: string): WebSocket\n}\n\nconst subdomainsMap: Record<string, string> = {\n '1': 'pluto',\n '2': 'venus',\n '3': 'aurora',\n '4': 'vesta',\n '5': 'flora',\n}\n\n/**\n * Base for WebSocket transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseWebSocketTransport extends EventEmitter implements ITelegramTransport {\n private _currentDc: BasicDcOption | null = null\n private _state: TransportState = TransportState.Idle\n private _socket: WebSocket | null = null\n private _crypto!: ICryptoProvider\n protected log!: Logger\n\n abstract _packetCodec: IPacketCodec\n packetCodecInitialized = false\n\n private _baseDomain: string\n private _subdomains: Record<string, string>\n private _WebSocket: WebSocketConstructor\n\n constructor({\n ws = WebSocket,\n baseDomain = 'web.telegram.org',\n subdomains = subdomainsMap,\n }: {\n /** Custom implementation of WebSocket (e.g. https://npm.im/ws) */\n ws?: WebSocketConstructor\n /** Base WebSocket domain */\n baseDomain?: string\n /** Map of sub-domains (key is DC ID, value is string) */\n subdomains?: Record<string, string>\n } = {}) {\n super()\n\n if (!ws) {\n throw new MtUnsupportedError(\n 'To use WebSocket transport with NodeJS, install `ws` package and pass it to constructor',\n )\n }\n\n // gotta love cjs/esm compat\n if ('default' in ws) {\n ws = ws.default as WebSocketConstructor\n }\n\n this._baseDomain = baseDomain\n this._subdomains = subdomains\n this._WebSocket = ws\n\n this.close = this.close.bind(this)\n }\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[WS:${this._subdomains[this._currentDc.id]}.${this._baseDomain}] `\n } else {\n this.log.prefix = '[WS:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('ws')\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): BasicDcOption | null {\n return this._currentDc\n }\n\n connect(dc: BasicDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._socket = new this._WebSocket(\n `wss://${this._subdomains[dc.id]}.${this._baseDomain}/apiws${testMode ? '_test' : ''}`,\n 'binary',\n )\n\n this._updateLogPrefix()\n this.log.debug('connecting to %s (%j)', this._socket.url, dc)\n\n this._socket.binaryType = 'arraybuffer'\n\n this._socket.addEventListener('message', (evt) =>\n this._packetCodec.feed(new Uint8Array(evt.data as ArrayBuffer)),\n )\n this._socket.addEventListener('open', this.handleConnect.bind(this))\n this._socket.addEventListener('error', this.handleError.bind(this))\n this._socket.addEventListener('close', this.close)\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this._state = TransportState.Idle\n this._socket!.removeEventListener('close', this.close)\n this._socket!.close()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n this.emit('close')\n }\n\n handleError(event: Event | { error: Error }): void {\n const error = 'error' in event ? event.error : new Error('unknown WebSocket error')\n\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n this._socket!.send(initialMessage)\n this._state = TransportState.Ready\n this.emit('ready')\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n const framed = await this._packetCodec.encode(bytes)\n\n this._socket!.send(framed)\n }\n}\n\nexport class WebSocketTransport extends BaseWebSocketTransport {\n _packetCodec = new ObfuscatedPacketCodec(new IntermediatePacketCodec())\n}\n"]}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\n\nimport {\n IntermediatePacketCodec,\n IPacketCodec,\n ITelegramTransport,\n MtcuteError,\n MtUnsupportedError,\n ObfuscatedPacketCodec,\n TransportState,\n} from '@mtcute/core'\nimport {\n BasicDcOption,\n ControllablePromise,\n createControllablePromise,\n ICryptoProvider,\n Logger,\n} from '@mtcute/core/utils.js'\n\nexport type WebSocketConstructor = {\n new (address: string, protocol?: string): WebSocket\n}\n\nconst subdomainsMap: Record<string, string> = {\n '1': 'pluto',\n '2': 'venus',\n '3': 'aurora',\n '4': 'vesta',\n '5': 'flora',\n}\n\n/**\n * Base for WebSocket transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseWebSocketTransport extends EventEmitter implements ITelegramTransport {\n private _currentDc: BasicDcOption | null = null\n private _state: TransportState = TransportState.Idle\n private _socket: WebSocket | null = null\n private _crypto!: ICryptoProvider\n protected log!: Logger\n\n abstract _packetCodec: IPacketCodec\n packetCodecInitialized = false\n\n private _baseDomain: string\n private _subdomains: Record<string, string>\n private _WebSocket: WebSocketConstructor\n\n constructor({\n ws = WebSocket,\n baseDomain = 'web.telegram.org',\n subdomains = subdomainsMap,\n }: {\n /** Custom implementation of WebSocket (e.g. https://npm.im/ws) */\n ws?: WebSocketConstructor\n /** Base WebSocket domain */\n baseDomain?: string\n /** Map of sub-domains (key is DC ID, value is string) */\n subdomains?: Record<string, string>\n } = {}) {\n super()\n\n if (!ws) {\n throw new MtUnsupportedError(\n 'To use WebSocket transport with NodeJS, install `ws` package and pass it to constructor',\n )\n }\n\n // gotta love cjs/esm compat\n if ('default' in ws) {\n ws = ws.default as WebSocketConstructor\n }\n\n this._baseDomain = baseDomain\n this._subdomains = subdomains\n this._WebSocket = ws\n }\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[WS:${this._subdomains[this._currentDc.id]}.${this._baseDomain}] `\n } else {\n this.log.prefix = '[WS:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('ws')\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): BasicDcOption | null {\n return this._currentDc\n }\n\n connect(dc: BasicDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._socket = new this._WebSocket(\n `wss://${this._subdomains[dc.id]}.${this._baseDomain}/apiws${testMode ? '_test' : ''}`,\n 'binary',\n )\n\n this._updateLogPrefix()\n this.log.debug('connecting to %s (%j)', this._socket.url, dc)\n\n this._socket.binaryType = 'arraybuffer'\n\n this._socket.addEventListener('message', (evt) =>\n this._packetCodec.feed(new Uint8Array(evt.data as ArrayBuffer)),\n )\n this._socket.addEventListener('open', this.handleConnect.bind(this))\n this._socket.addEventListener('error', this.handleError.bind(this))\n this._socket.addEventListener('close', this.handleClosed.bind(this))\n }\n\n private _closeWaiters: ControllablePromise<void>[] = []\n async close(): Promise<void> {\n if (this._state === TransportState.Idle) return\n\n const promise = createControllablePromise<void>()\n this._closeWaiters.push(promise)\n\n this._socket!.close()\n\n return promise\n }\n\n handleClosed(): void {\n this.log.info('connection closed')\n this._state = TransportState.Idle\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n this.emit('close')\n\n for (const waiter of this._closeWaiters) {\n waiter.resolve()\n }\n this._closeWaiters = []\n }\n\n handleError(event: Event | { error: Error }): void {\n const error = 'error' in event ? event.error : new Error('unknown WebSocket error')\n\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n this._socket!.send(initialMessage)\n this._state = TransportState.Ready\n this.emit('ready')\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n const framed = await this._packetCodec.encode(bytes)\n\n this._socket!.send(framed)\n }\n}\n\nexport class WebSocketTransport extends BaseWebSocketTransport {\n _packetCodec = new ObfuscatedPacketCodec(new IntermediatePacketCodec())\n}\n"]}
package/cjs/worker.js CHANGED
@@ -70,6 +70,7 @@ class TelegramWorker extends worker_js_1.TelegramWorker {
70
70
  exports.TelegramWorker = TelegramWorker;
71
71
  const platform = new platform_js_2.WebPlatform();
72
72
  class TelegramWorkerPort extends worker_js_1.TelegramWorkerPort {
73
+ options;
73
74
  constructor(options) {
74
75
  (0, platform_js_1.setPlatform)(platform);
75
76
  super(options);
package/cjs/worker.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { setPlatform } from '@mtcute/core/platform.js'\nimport {\n ClientMessageHandler,\n RespondFn,\n SendFn,\n SomeWorker,\n TelegramWorker as TelegramWorkerBase,\n TelegramWorkerOptions,\n TelegramWorkerPort as TelegramWorkerPortBase,\n TelegramWorkerPortOptions,\n WorkerCustomMethods,\n WorkerMessageHandler,\n} from '@mtcute/core/worker.js'\n\nimport { WebPlatform } from './platform.js'\n\nexport type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods }\n\nlet _registered = false\n\nexport class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {\n registerWorker(handler: WorkerMessageHandler): RespondFn {\n if (_registered) {\n throw new Error('TelegramWorker must be created only once')\n }\n\n _registered = true\n\n if (typeof SharedWorkerGlobalScope !== 'undefined' && self instanceof SharedWorkerGlobalScope) {\n const connections: MessagePort[] = []\n\n const broadcast = (message: unknown) => {\n for (const port of connections) {\n port.postMessage(message)\n }\n }\n\n self.onconnect = (event) => {\n const port = event.ports[0]\n connections.push(port)\n\n const respond = port.postMessage.bind(port)\n\n // not very reliable, but better than nothing\n // SharedWorker API doesn't provide a way to detect when the client closes the connection\n // so we just assume that the client is done when it sends a 'close' message\n // and keep a timeout for the case when the client closes without sending a 'close' message\n const onClose = () => {\n port.close()\n const idx = connections.indexOf(port)\n\n if (idx >= 0) {\n connections.splice(connections.indexOf(port), 1)\n }\n }\n\n const onTimeout = () => {\n console.warn('some connection timed out!')\n respond({ __type__: 'timeout' })\n onClose()\n }\n\n // 60s should be a reasonable timeout considering that the client should send a ping every 10s\n // so even if the browser has suspended the timers, we should still get a ping within a minute\n let timeout = setTimeout(onTimeout, 60000)\n\n port.addEventListener('message', (message) => {\n if (message.data.__type__ === 'close') {\n onClose()\n\n return\n }\n\n if (message.data.__type__ === 'ping') {\n clearTimeout(timeout)\n timeout = setTimeout(onTimeout, 60000)\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(message.data, respond)\n })\n port.start()\n }\n\n return broadcast\n }\n\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n const respond: RespondFn = self.postMessage.bind(self)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n self.addEventListener('message', (message) => handler(message.data, respond))\n\n return respond\n }\n\n throw new Error('TelegramWorker must be created from a worker')\n }\n}\n\nconst platform = new WebPlatform()\n\nexport class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {\n constructor(readonly options: TelegramWorkerPortOptions) {\n setPlatform(platform)\n super(options)\n }\n\n connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void] {\n if (worker instanceof Worker) {\n const send: SendFn = worker.postMessage.bind(worker)\n\n const messageHandler = (ev: MessageEvent) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(ev.data)\n }\n\n worker.addEventListener('message', messageHandler)\n\n return [\n send,\n () => {\n worker.removeEventListener('message', messageHandler)\n },\n ]\n }\n\n if (worker instanceof SharedWorker) {\n const send: SendFn = worker.port.postMessage.bind(worker.port)\n\n const pingInterval = setInterval(() => {\n worker.port.postMessage({ __type__: 'ping' })\n }, 10000)\n\n const messageHandler = (ev: MessageEvent) => {\n if (ev.data.__type__ === 'timeout') {\n // we got disconnected from the worker due to timeout\n // if the page is still alive (which is unlikely), we should reconnect\n // however it's not really possible with SharedWorker API without re-creating the worker\n // so we just reload the page for now\n location.reload()\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(ev.data)\n }\n\n worker.port.addEventListener('message', messageHandler)\n worker.port.start()\n\n // eslint-disable-next-line prefer-const\n let cancelBeforeExit: () => void\n\n const close = () => {\n clearInterval(pingInterval)\n worker.port.postMessage({ __type__: 'close' })\n worker.port.removeEventListener('message', messageHandler)\n worker.port.close()\n cancelBeforeExit()\n }\n\n cancelBeforeExit = platform.beforeExit(close)\n\n return [send, close]\n }\n\n throw new Error('Only workers and shared workers are supported')\n }\n}\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { setPlatform } from '@mtcute/core/platform.js'\nimport {\n ClientMessageHandler,\n RespondFn,\n SendFn,\n SomeWorker,\n TelegramWorker as TelegramWorkerBase,\n TelegramWorkerOptions,\n TelegramWorkerPort as TelegramWorkerPortBase,\n TelegramWorkerPortOptions,\n WorkerCustomMethods,\n WorkerMessageHandler,\n} from '@mtcute/core/worker.js'\n\nimport { WebPlatform } from './platform.js'\n\nexport type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods }\n\nlet _registered = false\n\nexport class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {\n registerWorker(handler: WorkerMessageHandler): RespondFn {\n if (_registered) {\n throw new Error('TelegramWorker must be created only once')\n }\n\n _registered = true\n\n if (typeof SharedWorkerGlobalScope !== 'undefined' && self instanceof SharedWorkerGlobalScope) {\n const connections: MessagePort[] = []\n\n const broadcast = (message: unknown) => {\n for (const port of connections) {\n port.postMessage(message)\n }\n }\n\n self.onconnect = (event: MessageEvent) => {\n const port = event.ports[0]\n connections.push(port)\n\n const respond = port.postMessage.bind(port)\n\n // not very reliable, but better than nothing\n // SharedWorker API doesn't provide a way to detect when the client closes the connection\n // so we just assume that the client is done when it sends a 'close' message\n // and keep a timeout for the case when the client closes without sending a 'close' message\n const onClose = () => {\n port.close()\n const idx = connections.indexOf(port)\n\n if (idx >= 0) {\n connections.splice(connections.indexOf(port), 1)\n }\n }\n\n const onTimeout = () => {\n console.warn('some connection timed out!')\n respond({ __type__: 'timeout' })\n onClose()\n }\n\n // 60s should be a reasonable timeout considering that the client should send a ping every 10s\n // so even if the browser has suspended the timers, we should still get a ping within a minute\n let timeout = setTimeout(onTimeout, 60000)\n\n port.addEventListener('message', (message) => {\n if (message.data.__type__ === 'close') {\n onClose()\n\n return\n }\n\n if (message.data.__type__ === 'ping') {\n clearTimeout(timeout)\n timeout = setTimeout(onTimeout, 60000)\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(message.data, respond)\n })\n port.start()\n }\n\n return broadcast\n }\n\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n const respond: RespondFn = self.postMessage.bind(self)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n self.addEventListener('message', (message: MessageEvent) => handler(message.data, respond))\n\n return respond\n }\n\n throw new Error('TelegramWorker must be created from a worker')\n }\n}\n\nconst platform = new WebPlatform()\n\nexport class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {\n constructor(readonly options: TelegramWorkerPortOptions) {\n setPlatform(platform)\n super(options)\n }\n\n connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void] {\n if (worker instanceof Worker) {\n const send: SendFn = worker.postMessage.bind(worker)\n\n const messageHandler = (ev: MessageEvent) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(ev.data)\n }\n\n worker.addEventListener('message', messageHandler)\n\n return [\n send,\n () => {\n worker.removeEventListener('message', messageHandler)\n },\n ]\n }\n\n if (worker instanceof SharedWorker) {\n const send: SendFn = worker.port.postMessage.bind(worker.port)\n\n const pingInterval = setInterval(() => {\n worker.port.postMessage({ __type__: 'ping' })\n }, 10000)\n\n const messageHandler = (ev: MessageEvent) => {\n if (ev.data.__type__ === 'timeout') {\n // we got disconnected from the worker due to timeout\n // if the page is still alive (which is unlikely), we should reconnect\n // however it's not really possible with SharedWorker API without re-creating the worker\n // so we just reload the page for now\n location.reload()\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(ev.data)\n }\n\n worker.port.addEventListener('message', messageHandler)\n worker.port.start()\n\n // eslint-disable-next-line prefer-const\n let cancelBeforeExit: () => void\n\n const close = () => {\n clearInterval(pingInterval)\n worker.port.postMessage({ __type__: 'close' })\n worker.port.removeEventListener('message', messageHandler)\n worker.port.close()\n cancelBeforeExit()\n }\n\n cancelBeforeExit = platform.beforeExit(close)\n\n return [send, close]\n }\n\n throw new Error('Only workers and shared workers are supported')\n }\n}\n"]}
package/esm/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EACH,kBAAkB,IAAI,sBAAsB,EAE5C,cAAc,IAAI,kBAAkB,GAEvC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAyBnD,MAAM,OAAO,kBAAmB,SAAQ,sBAAsB;IAC1D,YAAY,IAA+B;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC,CAAA;QAEtD,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,iBAAiB,EAAE;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,EAAE;YACzC,GAAG,IAAI;YACP,OAAO,EACH,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;gBAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,gBAAgB,CAAC;SAC3D,CAAC,CAAA;IACN,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAClD,YAAY,IAA2B;QACnC,IAAI,QAAQ,IAAI,IAAI,EAAE;YAClB,KAAK,CAAC,IAAI,CAAC,CAAA;YAEX,OAAM;SACT;QAED,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC;SACvC,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import { ITelegramStorageProvider, PartialOnly } from '@mtcute/core'\nimport {\n BaseTelegramClient as BaseTelegramClientBase,\n BaseTelegramClientOptions as BaseTelegramClientOptionsBase,\n TelegramClient as TelegramClientBase,\n TelegramClientOptions,\n} from '@mtcute/core/client.js'\nimport { setPlatform } from '@mtcute/core/platform.js'\n\nimport { WebCryptoProvider } from './crypto.js'\nimport { IdbStorage } from './idb/index.js'\nimport { WebPlatform } from './platform.js'\nimport { WebSocketTransport } from './websocket.js'\n\nexport type { TelegramClientOptions }\n\nexport interface BaseTelegramClientOptions\n extends PartialOnly<Omit<BaseTelegramClientOptionsBase, 'storage'>, 'transport' | 'crypto'> {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for an IndexedDB database.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n\n /**\n * **ADVANCED USE ONLY**\n *\n * Whether to not set up the platform.\n * This is useful if you call `setPlatform` yourself.\n */\n platformless?: boolean\n}\n\nexport class BaseTelegramClient extends BaseTelegramClientBase {\n constructor(opts: BaseTelegramClientOptions) {\n if (!opts.platformless) setPlatform(new WebPlatform())\n\n super({\n crypto: new WebCryptoProvider(),\n transport: () => new WebSocketTransport(),\n ...opts,\n storage:\n typeof opts.storage === 'string' ?\n new IdbStorage(opts.storage) :\n opts.storage ?? new IdbStorage('client.session'),\n })\n }\n}\n\n/**\n * Telegram client for use in Node.js\n */\nexport class TelegramClient extends TelegramClientBase {\n constructor(opts: TelegramClientOptions) {\n if ('client' in opts) {\n super(opts)\n\n return\n }\n\n super({\n client: new BaseTelegramClient(opts),\n })\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EACH,kBAAkB,IAAI,sBAAsB,EAE5C,cAAc,IAAI,kBAAkB,GAEvC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAyBnD,MAAM,OAAO,kBAAmB,SAAQ,sBAAsB;IAC1D,YAAY,IAA+B;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC,CAAA;QAEtD,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,iBAAiB,EAAE;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,EAAE;YACzC,GAAG,IAAI;YACP,OAAO,EACH,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;gBAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,gBAAgB,CAAC;SAC3D,CAAC,CAAA;IACN,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAClD,YAAY,IAA2B;QACnC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,CAAA;YAEX,OAAM;QACV,CAAC;QAED,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC;SACvC,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import { ITelegramStorageProvider, PartialOnly } from '@mtcute/core'\nimport {\n BaseTelegramClient as BaseTelegramClientBase,\n BaseTelegramClientOptions as BaseTelegramClientOptionsBase,\n TelegramClient as TelegramClientBase,\n TelegramClientOptions,\n} from '@mtcute/core/client.js'\nimport { setPlatform } from '@mtcute/core/platform.js'\n\nimport { WebCryptoProvider } from './crypto.js'\nimport { IdbStorage } from './idb/index.js'\nimport { WebPlatform } from './platform.js'\nimport { WebSocketTransport } from './websocket.js'\n\nexport type { TelegramClientOptions }\n\nexport interface BaseTelegramClientOptions\n extends PartialOnly<Omit<BaseTelegramClientOptionsBase, 'storage'>, 'transport' | 'crypto'> {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for an IndexedDB database.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n\n /**\n * **ADVANCED USE ONLY**\n *\n * Whether to not set up the platform.\n * This is useful if you call `setPlatform` yourself.\n */\n platformless?: boolean\n}\n\nexport class BaseTelegramClient extends BaseTelegramClientBase {\n constructor(opts: BaseTelegramClientOptions) {\n if (!opts.platformless) setPlatform(new WebPlatform())\n\n super({\n crypto: new WebCryptoProvider(),\n transport: () => new WebSocketTransport(),\n ...opts,\n storage:\n typeof opts.storage === 'string' ?\n new IdbStorage(opts.storage) :\n opts.storage ?? new IdbStorage('client.session'),\n })\n }\n}\n\n/**\n * Telegram client for use in Node.js\n */\nexport class TelegramClient extends TelegramClientBase {\n constructor(opts: TelegramClientOptions) {\n if ('client' in opts) {\n super(opts)\n\n return\n }\n\n super({\n client: new BaseTelegramClient(opts),\n })\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../src/common-internals-web/base64.ts"],"names":[],"mappings":"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","sourcesContent":["/// Based on https://github.com/beatgammit/base64-js, MIT license\nconst lookup: string[] = []\nconst revLookup: number[] = []\n\nconst code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nfor (let i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\nfunction getLens(b64: string): [number, number] {\n const len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n let validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n const placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\nfunction _byteLength(b64: string, validLen: number, placeHoldersLen: number) {\n return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen\n}\n\nfunction toByteArray(b64: string, arr: Uint8Array) {\n let tmp\n const lens = getLens(b64)\n const validLen = lens[0]\n const placeHoldersLen = lens[1]\n\n let curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n const len = placeHoldersLen > 0 ? validLen - 4 : validLen\n\n let i\n\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xff\n arr[curByte++] = (tmp >> 8) & 0xff\n arr[curByte++] = tmp & 0xff\n }\n\n if (placeHoldersLen === 2) {\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xff\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xff\n arr[curByte++] = tmp & 0xff\n }\n\n return arr\n}\n\nfunction tripletToBase64(num: number) {\n return lookup[(num >> 18) & 0x3f] + lookup[(num >> 12) & 0x3f] + lookup[(num >> 6) & 0x3f] + lookup[num & 0x3f]\n}\n\nfunction encodeChunk(uint8: Uint8Array, start: number, end: number) {\n let tmp\n const output = []\n\n for (let i = start; i < end; i += 3) {\n tmp = ((uint8[i] << 16) & 0xff0000) + ((uint8[i + 1] << 8) & 0xff00) + (uint8[i + 2] & 0xff)\n output.push(tripletToBase64(tmp))\n }\n\n return output.join('')\n}\n\nfunction fromByteArray(uint8: Uint8Array) {\n let tmp\n const len = uint8.length\n const extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n const parts = []\n const maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (let i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3f] + '==')\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(lookup[tmp >> 10] + lookup[(tmp >> 4) & 0x3f] + lookup[(tmp << 2) & 0x3f] + '=')\n }\n\n return parts.join('')\n}\n\nexport function base64Encode(buf: Uint8Array, url = false): string {\n const str = fromByteArray(buf)\n if (url) return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '')\n\n return str\n}\n\nexport function base64Decode(string: string, url = false): Uint8Array {\n if (url) {\n string = string.replace(/-/g, '+').replace(/_/g, '/')\n while (string.length % 4) string += '='\n }\n\n const buf = new Uint8Array(_byteLength(string, ...getLens(string)))\n\n toByteArray(string, buf)\n\n return buf\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/common-internals-web/hex.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,MAAM,mBAAmB,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,kBAAkB,CAAA;IACnC,mEAAmE;IACnE,MAAM,KAAK,GAAa,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAA;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAA;AAChB,CAAC,CAAC,EAAE,CAAA;AAEJ,MAAM,iBAAiB,GAA2B;IAC9C,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;CACR,CAAA;AAED,MAAM,UAAU,SAAS,CAAC,GAAe;IACrC,IAAI,GAAG,GAAG,EAAE,CAAA;IAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,GAAG,CAAA;AACd,CAAC;AAED,SAAS,cAAc,CAAC,GAAe,EAAE,MAAc;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;IAE/C,IAAI,CAAC,CAAA;IAEL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAE9C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,OAAM;QACV,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAED,OAAM;AACV,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACpC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACxD,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAE3B,OAAO,GAAG,CAAA;AACd,CAAC","sourcesContent":["/// Based on https://github.com/feross/buffer, MIT license\n\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const table: string[] = new Array(256)\n\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n\n return table\n})()\n\nconst hexCharValueTable: Record<string, number> = {\n '0': 0,\n '1': 1,\n '2': 2,\n '3': 3,\n '4': 4,\n '5': 5,\n '6': 6,\n '7': 7,\n '8': 8,\n '9': 9,\n a: 10,\n b: 11,\n c: 12,\n d: 13,\n e: 14,\n f: 15,\n A: 10,\n B: 11,\n C: 12,\n D: 13,\n E: 14,\n F: 15,\n}\n\nexport function hexEncode(buf: Uint8Array): string {\n let out = ''\n\n for (let i = 0; i < buf.byteLength; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n\n return out\n}\n\nfunction hexDecodeInner(buf: Uint8Array, string: string): void {\n const strLen = string.length\n const length = Math.min(buf.length, strLen / 2)\n\n let i\n\n for (i = 0; i < length; ++i) {\n const a = hexCharValueTable[string[i * 2]]\n const b = hexCharValueTable[string[i * 2 + 1]]\n\n if (a === undefined || b === undefined) {\n return\n }\n buf[i] = (a << 4) | b\n }\n\n return\n}\n\nexport function hexDecode(string: string): Uint8Array {\n const buf = new Uint8Array(Math.ceil(string.length / 2))\n hexDecodeInner(buf, string)\n\n return buf\n}\n"]}
@@ -0,0 +1,2 @@
1
+ /** @internal */
2
+ export declare const defaultLoggingHandler: (color: number, level: number, tag: string, fmt: string, args: unknown[]) => void;
@@ -1,6 +1,6 @@
1
1
  const BASE_FORMAT = '%s [%c%s%c] [%c%s%c] ';
2
2
  const LEVEL_NAMES = [
3
- '',
3
+ '', // OFF
4
4
  'ERR',
5
5
  'WRN',
6
6
  'INF',
@@ -8,7 +8,7 @@ const LEVEL_NAMES = [
8
8
  'VRB',
9
9
  ];
10
10
  const COLORS = [
11
- '',
11
+ '', // OFF
12
12
  'color: #7a5f9d',
13
13
  'color: #8d7041',
14
14
  'color: #396c9e',
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../src/common-internals-web/logging.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,uBAAuB,CAAA;AAC3C,MAAM,WAAW,GAAG;IAChB,EAAE,EAAE,MAAM;IACV,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACR,CAAA;AACD,MAAM,MAAM,GAAG;IACX,EAAE,EAAE,MAAM;IACV,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;CACnB,CAAA;AACD,MAAM,UAAU,GAAG;IACf,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;CACnB,CAAA;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACjC,KAAa,EACb,KAAa,EACb,GAAW,EACX,GAAW,EACX,IAAe,EACX,EAAE;IACN,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACP,WAAW,GAAG,GAAG,EACjB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,MAAM,CAAC,KAAK,CAAC,EACb,WAAW,CAAC,KAAK,CAAC,EAClB,EAAE,EACF,UAAU,CAAC,KAAK,CAAC,EACjB,GAAG,EACH,EAAE,EACF,GAAG,IAAI,CACV,CAAA;AACL,CAAC,CAAA","sourcesContent":["const BASE_FORMAT = '%s [%c%s%c] [%c%s%c] '\nconst LEVEL_NAMES = [\n '', // OFF\n 'ERR',\n 'WRN',\n 'INF',\n 'DBG',\n 'VRB',\n]\nconst COLORS = [\n '', // OFF\n 'color: #7a5f9d',\n 'color: #8d7041',\n 'color: #396c9e',\n 'color: #437761',\n 'color: #7a5f9d',\n]\nconst TAG_COLORS = [\n 'color: #437761',\n 'color: #537a36',\n 'color: #8d7041',\n 'color: #396c9e',\n 'color: #7a5f9d',\n 'color: #7a5f9d',\n]\n\n/** @internal */\nexport const defaultLoggingHandler = (\n color: number,\n level: number,\n tag: string,\n fmt: string,\n args: unknown[],\n): void => {\n // eslint-disable-next-line no-console\n console.log(\n BASE_FORMAT + fmt,\n new Date().toISOString(),\n COLORS[level],\n LEVEL_NAMES[level],\n '',\n TAG_COLORS[color],\n tag,\n '',\n ...args,\n )\n}\n"]}
@@ -9,7 +9,7 @@ export function utf8ByteLength(str) {
9
9
  s++;
10
10
  else if (code > 0x7ff && code <= 0xffff)
11
11
  s += 2;
12
- if (code >= 0xDC00 && code <= 0xDFFF)
12
+ if (code >= 0xdc00 && code <= 0xdfff)
13
13
  i--; //trail surrogate
14
14
  }
15
15
  return s;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8.js","sourceRoot":"","sources":["../../../src/common-internals-web/utf8.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAA;AACvC,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;AAE7C,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,uCAAuC;IACvC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;IAElB,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC9B,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK;YAAE,CAAC,EAAE,CAAA;aAChC,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,MAAM;YAAE,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;YAAE,CAAC,EAAE,CAAA,CAAC,iBAAiB;IAC/D,CAAC;IAED,OAAO,CAAC,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAe;IACtC,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IAClC,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC","sourcesContent":["const sharedEncoder = new TextEncoder()\nconst sharedDecoder = new TextDecoder('utf8')\n\nexport function utf8ByteLength(str: string) {\n // https://stackoverflow.com/a/23329386\n let s = str.length\n\n for (let i = str.length - 1; i >= 0; i--) {\n const code = str.charCodeAt(i)\n if (code > 0x7f && code <= 0x7ff) s++\n else if (code > 0x7ff && code <= 0xffff) s += 2\n if (code >= 0xdc00 && code <= 0xdfff) i-- //trail surrogate\n }\n\n return s\n}\n\nexport function utf8Decode(buf: Uint8Array): string {\n return sharedDecoder.decode(buf)\n}\n\nexport function utf8Encode(str: string): Uint8Array {\n return sharedEncoder.encode(str)\n}\n"]}
package/esm/crypto.js CHANGED
@@ -7,6 +7,8 @@ const ALGO_TO_SUBTLE = {
7
7
  sha512: 'SHA-512',
8
8
  };
9
9
  export class WebCryptoProvider extends BaseCryptoProvider {
10
+ crypto;
11
+ _wasmInput;
10
12
  sha1(data) {
11
13
  return sha1(data);
12
14
  }
package/esm/crypto.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from '@mtcute/core/utils.js'\nimport {\n createCtr256,\n ctr256,\n deflateMaxSize,\n freeCtr256,\n gunzip,\n ige256Decrypt,\n ige256Encrypt,\n initSync,\n sha1,\n sha256,\n} from '@mtcute/wasm'\n\nimport { loadWasmBinary, WasmInitInput } from './wasm.js'\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nexport interface WebCryptoProviderOptions {\n crypto?: Crypto\n wasmInput?: WasmInitInput\n}\n\nexport class WebCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n readonly crypto: Crypto\n private _wasmInput?: WasmInitInput\n\n sha1(data: Uint8Array): Uint8Array {\n return sha1(data)\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return sha256(data)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr {\n const ctx = createCtr256(key, iv)\n\n return {\n process: (data) => ctr256(ctx, data),\n close: () => freeCtr256(ctx),\n }\n }\n\n createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n return {\n encrypt: (data) => ige256Encrypt(data, key, iv),\n decrypt: (data) => ige256Decrypt(data, key, iv),\n }\n }\n\n gzip(data: Uint8Array, maxSize: number): Uint8Array | null {\n return deflateMaxSize(data, maxSize)\n }\n\n gunzip(data: Uint8Array): Uint8Array {\n return gunzip(data)\n }\n\n constructor(params?: WebCryptoProviderOptions) {\n super()\n const crypto = params?.crypto ?? globalThis.crypto\n\n if (!crypto || !crypto.subtle) {\n throw new Error('WebCrypto is not available')\n }\n this.crypto = crypto\n this._wasmInput = params?.wasmInput\n }\n\n async initialize(): Promise<void> {\n initSync(await loadWasmBinary(this._wasmInput))\n }\n\n async pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen?: number | undefined,\n algo?: string | undefined,\n ): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.crypto.subtle\n .deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',\n },\n keyMaterial,\n (keylen || 64) * 8,\n )\n .then((result) => new Uint8Array(result))\n }\n\n async hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.crypto.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n randomFill(buf: Uint8Array): void {\n this.crypto.getRandomValues(buf)\n }\n}\n"]}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from '@mtcute/core/utils.js'\nimport {\n createCtr256,\n ctr256,\n deflateMaxSize,\n freeCtr256,\n gunzip,\n ige256Decrypt,\n ige256Encrypt,\n initSync,\n sha1,\n sha256,\n} from '@mtcute/wasm'\n\nimport { loadWasmBinary, WasmInitInput } from './wasm.js'\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nexport interface WebCryptoProviderOptions {\n crypto?: Crypto\n wasmInput?: WasmInitInput\n}\n\nexport class WebCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n readonly crypto: Crypto\n private _wasmInput?: WasmInitInput\n\n sha1(data: Uint8Array): Uint8Array {\n return sha1(data)\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return sha256(data)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr {\n const ctx = createCtr256(key, iv)\n\n return {\n process: (data) => ctr256(ctx, data),\n close: () => freeCtr256(ctx),\n }\n }\n\n createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n return {\n encrypt: (data) => ige256Encrypt(data, key, iv),\n decrypt: (data) => ige256Decrypt(data, key, iv),\n }\n }\n\n gzip(data: Uint8Array, maxSize: number): Uint8Array | null {\n return deflateMaxSize(data, maxSize)\n }\n\n gunzip(data: Uint8Array): Uint8Array {\n return gunzip(data)\n }\n\n constructor(params?: WebCryptoProviderOptions) {\n super()\n const crypto = params?.crypto ?? globalThis.crypto\n\n if (!crypto || !crypto.subtle) {\n throw new Error('WebCrypto is not available')\n }\n this.crypto = crypto\n this._wasmInput = params?.wasmInput\n }\n\n async initialize(): Promise<void> {\n initSync(await loadWasmBinary(this._wasmInput))\n }\n\n async pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen?: number | undefined,\n algo?: string | undefined,\n ): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.crypto.subtle\n .deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',\n },\n keyMaterial,\n (keylen || 64) * 8,\n )\n .then((result) => new Uint8Array(result))\n }\n\n async hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.crypto.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n randomFill(buf: Uint8Array): void {\n this.crypto.getRandomValues(buf)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"exit-hook.js","sourceRoot":"","sources":["../../src/exit-hook.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AAEvC,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB,MAAM,UAAU,UAAU,CAAC,EAAc;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QAC/B,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;KAClB;IACD,IAAI,CAAC,UAAU,EAAE;QACb,UAAU,GAAG,IAAI,CAAA;QAEjB,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE;YACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAC9B,QAAQ,EAAE,CAAA;aACb;QACL,CAAC,CAAC,CAAA;KACL;IAED,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEjB,OAAO,GAAG,EAAE;QACR,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC,CAAA;AACL,CAAC","sourcesContent":["const callbacks = new Set<() => void>()\n\nlet registered = false\n\nexport function beforeExit(fn: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {}\n }\n if (!registered) {\n registered = true\n\n window.addEventListener('beforeunload', () => {\n for (const callback of callbacks) {\n callback()\n }\n })\n }\n\n callbacks.add(fn)\n\n return () => {\n callbacks.delete(fn)\n }\n}\n"]}
1
+ {"version":3,"file":"exit-hook.js","sourceRoot":"","sources":["../../src/exit-hook.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AAEvC,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB,MAAM,UAAU,UAAU,CAAC,EAAc;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,UAAU,GAAG,IAAI,CAAA;QAEjB,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE;YACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC/B,QAAQ,EAAE,CAAA;YACd,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEjB,OAAO,GAAG,EAAE;QACR,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC,CAAA;AACL,CAAC","sourcesContent":["const callbacks = new Set<() => void>()\n\nlet registered = false\n\nexport function beforeExit(fn: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {}\n }\n if (!registered) {\n registered = true\n\n window.addEventListener('beforeunload', () => {\n for (const callback of callbacks) {\n callback()\n }\n })\n }\n\n callbacks.add(fn)\n\n return () => {\n callbacks.delete(fn)\n }\n}\n"]}
package/esm/idb/driver.js CHANGED
@@ -2,17 +2,19 @@ import { BaseStorageDriver, MtUnsupportedError } from '@mtcute/core';
2
2
  import { txToPromise } from './utils.js';
3
3
  const REPO_VERSION_PREFIX = '__version:';
4
4
  export class IdbStorageDriver extends BaseStorageDriver {
5
+ _dbName;
6
+ db;
5
7
  constructor(_dbName) {
6
8
  super();
7
9
  this._dbName = _dbName;
8
- this._pendingWrites = [];
9
- this._pendingWritesOses = new Set();
10
- this._migrations = new Map();
11
- this._maxVersion = new Map();
12
10
  if (typeof indexedDB === 'undefined') {
13
11
  throw new MtUnsupportedError('IndexedDB is not available');
14
12
  }
15
13
  }
14
+ _pendingWrites = [];
15
+ _pendingWritesOses = new Set();
16
+ _migrations = new Map();
17
+ _maxVersion = new Map();
16
18
  registerMigration(repo, version, migration) {
17
19
  if (this.loaded) {
18
20
  throw new Error('Cannot register migrations after loading');
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/idb/driver.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseStorageDriver, MtUnsupportedError } from '@mtcute/core'\n\nimport { txToPromise } from './utils.js'\n\nexport type PostMigrationFunction = (db: IDBDatabase) => Promise<void>\ntype MigrationFunction = (db: IDBDatabase) => void | PostMigrationFunction\n\nconst REPO_VERSION_PREFIX = '__version:'\n\nexport class IdbStorageDriver extends BaseStorageDriver {\n db!: IDBDatabase\n\n constructor(readonly _dbName: string) {\n super()\n\n if (typeof indexedDB === 'undefined') {\n throw new MtUnsupportedError('IndexedDB is not available')\n }\n }\n\n private _pendingWrites: [string, unknown][] = []\n private _pendingWritesOses = new Set<string>()\n private _migrations: Map<string, Map<number, MigrationFunction>> = new Map()\n private _maxVersion: Map<string, number> = new Map()\n\n registerMigration(repo: string, version: number, migration: MigrationFunction): void {\n if (this.loaded) {\n throw new Error('Cannot register migrations after loading')\n }\n\n let map = this._migrations.get(repo)\n\n if (!map) {\n map = new Map()\n this._migrations.set(repo, map)\n }\n\n if (map.has(version)) {\n throw new Error(`Migration for ${repo} version ${version} is already registered`)\n }\n\n map.set(version, migration)\n\n const prevMax = this._maxVersion.get(repo) ?? 0\n\n if (version > prevMax) {\n this._maxVersion.set(repo, version)\n }\n }\n\n writeLater(os: string, obj: unknown): void {\n this._pendingWrites.push([os, obj])\n this._pendingWritesOses.add(os)\n }\n\n async _load(): Promise<void> {\n this.db = await new Promise((resolve, reject) => {\n // indexed db fucking sucks - we can't create tables once we have loaded\n // and making an ever-incrementing version number is pretty hard\n // since migrations are added dynamically.\n //\n // force the database to always emit `upgradeneeded` by passing current time\n const req = indexedDB.open(this._dbName, Date.now())\n\n req.onerror = () => reject(req.error)\n\n const postUpgrade: PostMigrationFunction[] = []\n\n req.onsuccess = async () => {\n try {\n for (const cb of postUpgrade) {\n await cb(req.result)\n }\n resolve(req.result)\n } catch (e) {\n reject(e)\n }\n }\n req.onupgradeneeded = () => {\n // indexed db still fucking sucks. we can't fetch anything from here,\n // since migrations must be sync, and any fetch is inherently async\n // what we do have, however, is the list of object stores.\n // we can abuse them to store the current migrations status as plain strings\n const db = req.result\n\n const didUpgrade = new Set<string>()\n\n const doUpgrade = (repo: string, fromVersion: number) => {\n const migrations = this._migrations.get(repo)\n if (!migrations) return\n\n const targetVer = this._maxVersion.get(repo)!\n\n while (fromVersion < targetVer) {\n const nextVersion = fromVersion + 1\n const migration = migrations.get(nextVersion)\n\n if (!migration) {\n throw new Error(`No migration for ${repo} to version ${nextVersion}`)\n }\n\n const result = migration(db)\n\n if (result) {\n // guess what? IDB still. fucking. sucks!\n // if we want to do something except creating/removing\n // databases, we should do this outside of migration\n postUpgrade.push(result)\n }\n\n fromVersion = nextVersion\n }\n\n didUpgrade.add(repo)\n db.createObjectStore(`${REPO_VERSION_PREFIX}${repo}:${targetVer}`)\n }\n\n for (const key of db.objectStoreNames) {\n if (!key.startsWith(REPO_VERSION_PREFIX)) continue\n const [, repo, version] = key.split(':')\n\n const currentVer = Number(version)\n db.deleteObjectStore(key)\n doUpgrade(repo, currentVer)\n didUpgrade.add(repo)\n }\n\n for (const repo of this._migrations.keys()) {\n if (didUpgrade.has(repo)) continue\n\n doUpgrade(repo, 0)\n }\n }\n })\n }\n\n async _save() {\n if (this._pendingWritesOses.size === 0) return\n\n const writes = this._pendingWrites\n const oses = this._pendingWritesOses\n this._pendingWrites = []\n this._pendingWritesOses = new Set()\n\n const tx = this.db.transaction(oses, 'readwrite')\n\n const osMap = new Map<string, IDBObjectStore>()\n\n for (const table of oses) {\n osMap.set(table, tx.objectStore(table))\n }\n\n for (const [table, obj] of writes) {\n const os = osMap.get(table)!\n\n if (obj === null) {\n os.delete(table)\n } else {\n os.put(obj)\n }\n }\n\n await txToPromise(tx)\n }\n\n _destroy(): void {\n this.db.close()\n }\n}\n"]}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/idb/driver.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseStorageDriver, MtUnsupportedError } from '@mtcute/core'\n\nimport { txToPromise } from './utils.js'\n\nexport type PostMigrationFunction = (db: IDBDatabase) => Promise<void>\ntype MigrationFunction = (db: IDBDatabase) => void | PostMigrationFunction\n\nconst REPO_VERSION_PREFIX = '__version:'\n\nexport class IdbStorageDriver extends BaseStorageDriver {\n db!: IDBDatabase\n\n constructor(readonly _dbName: string) {\n super()\n\n if (typeof indexedDB === 'undefined') {\n throw new MtUnsupportedError('IndexedDB is not available')\n }\n }\n\n private _pendingWrites: [string, unknown][] = []\n private _pendingWritesOses = new Set<string>()\n private _migrations: Map<string, Map<number, MigrationFunction>> = new Map()\n private _maxVersion: Map<string, number> = new Map()\n\n registerMigration(repo: string, version: number, migration: MigrationFunction): void {\n if (this.loaded) {\n throw new Error('Cannot register migrations after loading')\n }\n\n let map = this._migrations.get(repo)\n\n if (!map) {\n map = new Map()\n this._migrations.set(repo, map)\n }\n\n if (map.has(version)) {\n throw new Error(`Migration for ${repo} version ${version} is already registered`)\n }\n\n map.set(version, migration)\n\n const prevMax = this._maxVersion.get(repo) ?? 0\n\n if (version > prevMax) {\n this._maxVersion.set(repo, version)\n }\n }\n\n writeLater(os: string, obj: unknown): void {\n this._pendingWrites.push([os, obj])\n this._pendingWritesOses.add(os)\n }\n\n async _load(): Promise<void> {\n this.db = await new Promise((resolve, reject) => {\n // indexed db fucking sucks - we can't create tables once we have loaded\n // and making an ever-incrementing version number is pretty hard\n // since migrations are added dynamically.\n //\n // force the database to always emit `upgradeneeded` by passing current time\n const req = indexedDB.open(this._dbName, Date.now())\n\n req.onerror = () => reject(req.error)\n\n const postUpgrade: PostMigrationFunction[] = []\n\n req.onsuccess = async () => {\n try {\n for (const cb of postUpgrade) {\n await cb(req.result)\n }\n resolve(req.result)\n } catch (e) {\n reject(e)\n }\n }\n req.onupgradeneeded = () => {\n // indexed db still fucking sucks. we can't fetch anything from here,\n // since migrations must be sync, and any fetch is inherently async\n // what we do have, however, is the list of object stores.\n // we can abuse them to store the current migrations status as plain strings\n const db = req.result\n\n const didUpgrade = new Set<string>()\n\n const doUpgrade = (repo: string, fromVersion: number) => {\n const migrations = this._migrations.get(repo)\n if (!migrations) return\n\n const targetVer = this._maxVersion.get(repo)!\n\n while (fromVersion < targetVer) {\n const nextVersion = fromVersion + 1\n const migration = migrations.get(nextVersion)\n\n if (!migration) {\n throw new Error(`No migration for ${repo} to version ${nextVersion}`)\n }\n\n const result = migration(db)\n\n if (result) {\n // guess what? IDB still. fucking. sucks!\n // if we want to do something except creating/removing\n // databases, we should do this outside of migration\n postUpgrade.push(result)\n }\n\n fromVersion = nextVersion\n }\n\n didUpgrade.add(repo)\n db.createObjectStore(`${REPO_VERSION_PREFIX}${repo}:${targetVer}`)\n }\n\n for (const key of db.objectStoreNames) {\n if (!key.startsWith(REPO_VERSION_PREFIX)) continue\n const [, repo, version] = key.split(':')\n\n const currentVer = Number(version)\n db.deleteObjectStore(key)\n doUpgrade(repo, currentVer)\n didUpgrade.add(repo)\n }\n\n for (const repo of this._migrations.keys()) {\n if (didUpgrade.has(repo)) continue\n\n doUpgrade(repo, 0)\n }\n }\n })\n }\n\n async _save() {\n if (this._pendingWritesOses.size === 0) return\n\n const writes = this._pendingWrites\n const oses = this._pendingWritesOses\n this._pendingWrites = []\n this._pendingWritesOses = new Set()\n\n const tx = this.db.transaction(oses, 'readwrite')\n\n const osMap = new Map<string, IDBObjectStore>()\n\n for (const table of oses) {\n osMap.set(table, tx.objectStore(table))\n }\n\n for (const [table, obj] of writes) {\n const os = osMap.get(table)!\n\n if (obj === null) {\n os.delete(table)\n } else {\n os.put(obj)\n }\n }\n\n await txToPromise(tx)\n }\n\n _destroy(): void {\n this.db.close()\n }\n}\n"]}
@@ -13,10 +13,10 @@ export { IdbStorageDriver } from './driver.js';
13
13
  */
14
14
  export declare class IdbStorage implements IMtStorageProvider {
15
15
  readonly dbName: string;
16
- constructor(dbName: string);
17
16
  readonly driver: IdbStorageDriver;
18
17
  readonly kv: IdbKvRepository;
19
18
  readonly authKeys: IdbAuthKeysRepository;
20
19
  readonly peers: IdbPeersRepository;
21
20
  readonly refMessages: IdbRefMsgRepository;
21
+ constructor(dbName: string);
22
22
  }
package/esm/idb/index.js CHANGED
@@ -11,6 +11,12 @@ export { IdbStorageDriver } from './driver.js';
11
11
  * recommended over local storage based one.
12
12
  */
13
13
  export class IdbStorage {
14
+ dbName;
15
+ driver;
16
+ kv;
17
+ authKeys;
18
+ peers;
19
+ refMessages;
14
20
  constructor(dbName) {
15
21
  this.dbName = dbName;
16
22
  this.driver = new IdbStorageDriver(this.dbName);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/idb/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACnB,YAAqB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAE1B,WAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,OAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,aAAQ,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACjD,UAAK,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3C,gBAAW,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IANrB,CAAC;CAO1C","sourcesContent":["import { IMtStorageProvider } from '@mtcute/core'\n\nimport { IdbStorageDriver } from './driver.js'\nimport { IdbAuthKeysRepository } from './repository/auth-keys.js'\nimport { IdbKvRepository } from './repository/kv.js'\nimport { IdbPeersRepository } from './repository/peers.js'\nimport { IdbRefMsgRepository } from './repository/ref-messages.js'\n\nexport { IdbStorageDriver } from './driver.js'\n\n/**\n * mtcute storage that uses IndexedDB as a backend.\n *\n * This storage is the default one for browsers, and is generally\n * recommended over local storage based one.\n */\nexport class IdbStorage implements IMtStorageProvider {\n constructor(readonly dbName: string) {}\n\n readonly driver = new IdbStorageDriver(this.dbName)\n readonly kv = new IdbKvRepository(this.driver)\n readonly authKeys = new IdbAuthKeysRepository(this.driver)\n readonly peers = new IdbPeersRepository(this.driver)\n readonly refMessages = new IdbRefMsgRepository(this.driver)\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/idb/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IAOE;IANZ,MAAM,CAAA;IACN,EAAE,CAAA;IACF,QAAQ,CAAA;IACR,KAAK,CAAA;IACL,WAAW,CAAA;IAEpB,YAAqB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtD,IAAI,CAAC,KAAK,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3D,CAAC;CACJ","sourcesContent":["import { IMtStorageProvider } from '@mtcute/core'\n\nimport { IdbStorageDriver } from './driver.js'\nimport { IdbAuthKeysRepository } from './repository/auth-keys.js'\nimport { IdbKvRepository } from './repository/kv.js'\nimport { IdbPeersRepository } from './repository/peers.js'\nimport { IdbRefMsgRepository } from './repository/ref-messages.js'\n\nexport { IdbStorageDriver } from './driver.js'\n\n/**\n * mtcute storage that uses IndexedDB as a backend.\n *\n * This storage is the default one for browsers, and is generally\n * recommended over local storage based one.\n */\nexport class IdbStorage implements IMtStorageProvider {\n readonly driver\n readonly kv\n readonly authKeys\n readonly peers\n readonly refMessages\n\n constructor(readonly dbName: string) {\n this.driver = new IdbStorageDriver(this.dbName)\n this.kv = new IdbKvRepository(this.driver)\n this.authKeys = new IdbAuthKeysRepository(this.driver)\n this.peers = new IdbPeersRepository(this.driver)\n this.refMessages = new IdbRefMsgRepository(this.driver)\n }\n}\n"]}
@@ -2,6 +2,7 @@ import { reqToPromise, txToPromise } from '../utils.js';
2
2
  const TABLE_AUTH_KEYS = 'authKeys';
3
3
  const TABLE_TEMP_AUTH_KEYS = 'tempAuthKeys';
4
4
  export class IdbAuthKeysRepository {
5
+ _driver;
5
6
  constructor(_driver) {
6
7
  this._driver = _driver;
7
8
  _driver.registerMigration(TABLE_AUTH_KEYS, 1, (db) => {
@@ -1 +1 @@
1
- {"version":3,"file":"auth-keys.js","sourceRoot":"","sources":["../../../../src/idb/repository/auth-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { IAuthKeysRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { reqToPromise, txToPromise } from '../utils.js'\n\nconst TABLE_AUTH_KEYS = 'authKeys'\nconst TABLE_TEMP_AUTH_KEYS = 'tempAuthKeys'\n\ninterface AuthKeyDto {\n dc: number\n key: Uint8Array\n}\ninterface TempAuthKeyDto extends AuthKeyDto {\n expiresAt?: number\n idx?: number\n}\n\nexport class IdbAuthKeysRepository implements IAuthKeysRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(TABLE_AUTH_KEYS, 1, (db) => {\n db.createObjectStore(TABLE_AUTH_KEYS, { keyPath: 'dc' })\n db.createObjectStore(TABLE_TEMP_AUTH_KEYS, { keyPath: ['dc', 'idx'] })\n })\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE_AUTH_KEYS, mode).objectStore(TABLE_AUTH_KEYS)\n }\n\n async set(dc: number, key: Uint8Array | null): Promise<void> {\n const os = this.os('readwrite')\n\n if (key === null) {\n return reqToPromise(os.delete(dc))\n }\n\n await reqToPromise(os.put({ dc, key } satisfies AuthKeyDto))\n }\n\n async get(dc: number): Promise<Uint8Array | null> {\n const os = this.os()\n\n const it = await reqToPromise<AuthKeyDto>(os.get(dc) as IDBRequest<AuthKeyDto>)\n if (it === undefined) return null\n\n return it.key\n }\n\n private osTemp(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE_TEMP_AUTH_KEYS, mode).objectStore(TABLE_TEMP_AUTH_KEYS)\n }\n\n async setTemp(dc: number, idx: number, key: Uint8Array | null, expires: number): Promise<void> {\n const os = this.osTemp('readwrite')\n\n if (!key) {\n return reqToPromise(os.delete([dc, idx]))\n }\n\n await reqToPromise(os.put({ dc, idx, key, expiresAt: expires } satisfies TempAuthKeyDto))\n }\n\n async getTemp(dc: number, idx: number, now: number): Promise<Uint8Array | null> {\n const os = this.osTemp()\n const row = await reqToPromise<TempAuthKeyDto>(os.get([dc, idx]) as IDBRequest<TempAuthKeyDto>)\n\n if (row === undefined || row.expiresAt! < now) return null\n\n return row.key\n }\n\n async deleteByDc(dc: number): Promise<void> {\n const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], 'readwrite')\n\n tx.objectStore(TABLE_AUTH_KEYS).delete(dc)\n\n // IndexedDB sucks\n const tempOs = tx.objectStore(TABLE_TEMP_AUTH_KEYS)\n const keys = await reqToPromise(tempOs.getAllKeys())\n\n for (const key of keys) {\n if ((key as [number, number])[0] === dc) {\n tempOs.delete(key)\n }\n }\n\n await txToPromise(tx)\n }\n\n deleteAll(): Promise<void> {\n const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], 'readwrite')\n tx.objectStore(TABLE_AUTH_KEYS).clear()\n tx.objectStore(TABLE_TEMP_AUTH_KEYS).clear()\n\n return txToPromise(tx)\n }\n}\n"]}
1
+ {"version":3,"file":"auth-keys.js","sourceRoot":"","sources":["../../../../src/idb/repository/auth-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { IAuthKeysRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { reqToPromise, txToPromise } from '../utils.js'\n\nconst TABLE_AUTH_KEYS = 'authKeys'\nconst TABLE_TEMP_AUTH_KEYS = 'tempAuthKeys'\n\ninterface AuthKeyDto {\n dc: number\n key: Uint8Array\n}\ninterface TempAuthKeyDto extends AuthKeyDto {\n expiresAt?: number\n idx?: number\n}\n\nexport class IdbAuthKeysRepository implements IAuthKeysRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(TABLE_AUTH_KEYS, 1, (db) => {\n db.createObjectStore(TABLE_AUTH_KEYS, { keyPath: 'dc' })\n db.createObjectStore(TABLE_TEMP_AUTH_KEYS, { keyPath: ['dc', 'idx'] })\n })\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE_AUTH_KEYS, mode).objectStore(TABLE_AUTH_KEYS)\n }\n\n async set(dc: number, key: Uint8Array | null): Promise<void> {\n const os = this.os('readwrite')\n\n if (key === null) {\n return reqToPromise(os.delete(dc))\n }\n\n await reqToPromise(os.put({ dc, key } satisfies AuthKeyDto))\n }\n\n async get(dc: number): Promise<Uint8Array | null> {\n const os = this.os()\n\n const it = await reqToPromise<AuthKeyDto>(os.get(dc) as IDBRequest<AuthKeyDto>)\n if (it === undefined) return null\n\n return it.key\n }\n\n private osTemp(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE_TEMP_AUTH_KEYS, mode).objectStore(TABLE_TEMP_AUTH_KEYS)\n }\n\n async setTemp(dc: number, idx: number, key: Uint8Array | null, expires: number): Promise<void> {\n const os = this.osTemp('readwrite')\n\n if (!key) {\n return reqToPromise(os.delete([dc, idx]))\n }\n\n await reqToPromise(os.put({ dc, idx, key, expiresAt: expires } satisfies TempAuthKeyDto))\n }\n\n async getTemp(dc: number, idx: number, now: number): Promise<Uint8Array | null> {\n const os = this.osTemp()\n const row = await reqToPromise<TempAuthKeyDto>(os.get([dc, idx]) as IDBRequest<TempAuthKeyDto>)\n\n if (row === undefined || row.expiresAt! < now) return null\n\n return row.key\n }\n\n async deleteByDc(dc: number): Promise<void> {\n const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], 'readwrite')\n\n tx.objectStore(TABLE_AUTH_KEYS).delete(dc)\n\n // IndexedDB sucks\n const tempOs = tx.objectStore(TABLE_TEMP_AUTH_KEYS)\n const keys = await reqToPromise(tempOs.getAllKeys())\n\n for (const key of keys) {\n if ((key as [number, number])[0] === dc) {\n tempOs.delete(key)\n }\n }\n\n await txToPromise(tx)\n }\n\n deleteAll(): Promise<void> {\n const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], 'readwrite')\n tx.objectStore(TABLE_AUTH_KEYS).clear()\n tx.objectStore(TABLE_TEMP_AUTH_KEYS).clear()\n\n return txToPromise(tx)\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { reqToPromise } from '../utils.js';
2
2
  const KV_TABLE = 'kv';
3
3
  export class IdbKvRepository {
4
+ _driver;
4
5
  constructor(_driver) {
5
6
  this._driver = _driver;
6
7
  _driver.registerMigration(KV_TABLE, 1, (db) => {
@@ -1 +1 @@
1
- {"version":3,"file":"kv.js","sourceRoot":"","sources":["../../../../src/idb/repository/kv.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,QAAQ,GAAG,IAAI,CAAA;AAMrB,MAAM,OAAO,eAAe;IACxB,YAAqB,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QAC1C,OAAO,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;YAC1C,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAiB;QAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAwB,CAAC,CAAA;IAC3E,CAAC;IAEO,EAAE,CAAC,IAAyB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC5E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;QACpB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAc,EAAE,CAAC,GAAG,CAAC,GAAG,CAA4B,CAAC,CAAA;QACnF,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QAElC,OAAO,GAAG,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACpB,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACpD,CAAC;CACJ","sourcesContent":["import { IKeyValueRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { reqToPromise } from '../utils.js'\n\nconst KV_TABLE = 'kv'\ninterface KeyValueDto {\n key: string\n value: Uint8Array\n}\n\nexport class IdbKvRepository implements IKeyValueRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(KV_TABLE, 1, (db) => {\n db.createObjectStore(KV_TABLE, { keyPath: 'key' })\n })\n }\n\n set(key: string, value: Uint8Array): void {\n this._driver.writeLater(KV_TABLE, { key, value } satisfies KeyValueDto)\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(KV_TABLE, mode).objectStore(KV_TABLE)\n }\n\n async get(key: string): Promise<Uint8Array | null> {\n const os = this.os()\n const res = await reqToPromise<KeyValueDto>(os.get(key) as IDBRequest<KeyValueDto>)\n if (res === undefined) return null\n\n return res.value\n }\n\n async delete(key: string): Promise<void> {\n await reqToPromise(this.os('readwrite').delete(key))\n }\n\n async deleteAll(): Promise<void> {\n await reqToPromise(this.os('readwrite').clear())\n }\n}\n"]}
1
+ {"version":3,"file":"kv.js","sourceRoot":"","sources":["../../../../src/idb/repository/kv.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,QAAQ,GAAG,IAAI,CAAA;AAMrB,MAAM,OAAO,eAAe;IACH;IAArB,YAAqB,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QAC1C,OAAO,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;YAC1C,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAiB;QAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAwB,CAAC,CAAA;IAC3E,CAAC;IAEO,EAAE,CAAC,IAAyB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC5E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;QACpB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAc,EAAE,CAAC,GAAG,CAAC,GAAG,CAA4B,CAAC,CAAA;QACnF,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QAElC,OAAO,GAAG,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACpB,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACpD,CAAC;CACJ","sourcesContent":["import { IKeyValueRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { reqToPromise } from '../utils.js'\n\nconst KV_TABLE = 'kv'\ninterface KeyValueDto {\n key: string\n value: Uint8Array\n}\n\nexport class IdbKvRepository implements IKeyValueRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(KV_TABLE, 1, (db) => {\n db.createObjectStore(KV_TABLE, { keyPath: 'key' })\n })\n }\n\n set(key: string, value: Uint8Array): void {\n this._driver.writeLater(KV_TABLE, { key, value } satisfies KeyValueDto)\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(KV_TABLE, mode).objectStore(KV_TABLE)\n }\n\n async get(key: string): Promise<Uint8Array | null> {\n const os = this.os()\n const res = await reqToPromise<KeyValueDto>(os.get(key) as IDBRequest<KeyValueDto>)\n if (res === undefined) return null\n\n return res.value\n }\n\n async delete(key: string): Promise<void> {\n await reqToPromise(this.os('readwrite').delete(key))\n }\n\n async deleteAll(): Promise<void> {\n await reqToPromise(this.os('readwrite').clear())\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { reqToPromise } from '../utils.js';
2
2
  const TABLE = 'peers';
3
3
  export class IdbPeersRepository {
4
+ _driver;
4
5
  constructor(_driver) {
5
6
  this._driver = _driver;
6
7
  _driver.registerMigration(TABLE, 1, (db) => {
@@ -1 +1 @@
1
- {"version":3,"file":"peers.js","sourceRoot":"","sources":["../../../../src/idb/repository/peers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,KAAK,GAAG,OAAO,CAAA;AAErB,MAAM,OAAO,kBAAkB;IAC3B,YAAqB,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QAC1C,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;YACvC,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACzD,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;YAC9E,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,IAA+B;QACjC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IAEO,EAAE,CAAC,IAAyB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACpB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAA0C,CAAC,CAAA;QAEzF,OAAO,EAAE,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAChC,MAAM,EAAE,GAAG,MAAM,YAAY,CACzB,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA0C,CACxF,CAAA;QAED,OAAO,EAAE,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC1B,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAA0C,CAAC,CAAA;QAE9G,OAAO,EAAE,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,SAAS;QACL,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACrD,CAAC;CACJ","sourcesContent":["import { IPeersRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { reqToPromise } from '../utils.js'\n\nconst TABLE = 'peers'\n\nexport class IdbPeersRepository implements IPeersRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(TABLE, 1, (db) => {\n const os = db.createObjectStore(TABLE, { keyPath: 'id' })\n os.createIndex('by_username', 'usernames', { unique: true, multiEntry: true })\n os.createIndex('by_phone', 'phone', { unique: true })\n })\n }\n\n store(peer: IPeersRepository.PeerInfo): void {\n this._driver.writeLater(TABLE, peer)\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE, mode).objectStore(TABLE)\n }\n\n async getById(id: number): Promise<IPeersRepository.PeerInfo | null> {\n const it = await reqToPromise(this.os().get(id) as IDBRequest<IPeersRepository.PeerInfo>)\n\n return it ?? null\n }\n\n async getByUsername(username: string): Promise<IPeersRepository.PeerInfo | null> {\n const it = await reqToPromise(\n this.os().index('by_username').get(username) as IDBRequest<IPeersRepository.PeerInfo>,\n )\n\n return it ?? null\n }\n\n async getByPhone(phone: string): Promise<IPeersRepository.PeerInfo | null> {\n const it = await reqToPromise(this.os().index('by_phone').get(phone) as IDBRequest<IPeersRepository.PeerInfo>)\n\n return it ?? null\n }\n\n deleteAll(): Promise<void> {\n return reqToPromise(this.os('readwrite').clear())\n }\n}\n"]}
1
+ {"version":3,"file":"peers.js","sourceRoot":"","sources":["../../../../src/idb/repository/peers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,KAAK,GAAG,OAAO,CAAA;AAErB,MAAM,OAAO,kBAAkB;IACN;IAArB,YAAqB,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QAC1C,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;YACvC,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACzD,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;YAC9E,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,IAA+B;QACjC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IAEO,EAAE,CAAC,IAAyB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACpB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAA0C,CAAC,CAAA;QAEzF,OAAO,EAAE,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAChC,MAAM,EAAE,GAAG,MAAM,YAAY,CACzB,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA0C,CACxF,CAAA;QAED,OAAO,EAAE,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC1B,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAA0C,CAAC,CAAA;QAE9G,OAAO,EAAE,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,SAAS;QACL,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACrD,CAAC;CACJ","sourcesContent":["import { IPeersRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { reqToPromise } from '../utils.js'\n\nconst TABLE = 'peers'\n\nexport class IdbPeersRepository implements IPeersRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(TABLE, 1, (db) => {\n const os = db.createObjectStore(TABLE, { keyPath: 'id' })\n os.createIndex('by_username', 'usernames', { unique: true, multiEntry: true })\n os.createIndex('by_phone', 'phone', { unique: true })\n })\n }\n\n store(peer: IPeersRepository.PeerInfo): void {\n this._driver.writeLater(TABLE, peer)\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE, mode).objectStore(TABLE)\n }\n\n async getById(id: number): Promise<IPeersRepository.PeerInfo | null> {\n const it = await reqToPromise(this.os().get(id) as IDBRequest<IPeersRepository.PeerInfo>)\n\n return it ?? null\n }\n\n async getByUsername(username: string): Promise<IPeersRepository.PeerInfo | null> {\n const it = await reqToPromise(\n this.os().index('by_username').get(username) as IDBRequest<IPeersRepository.PeerInfo>,\n )\n\n return it ?? null\n }\n\n async getByPhone(phone: string): Promise<IPeersRepository.PeerInfo | null> {\n const it = await reqToPromise(this.os().index('by_phone').get(phone) as IDBRequest<IPeersRepository.PeerInfo>)\n\n return it ?? null\n }\n\n deleteAll(): Promise<void> {\n return reqToPromise(this.os('readwrite').clear())\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { cursorToIterator, reqToPromise, txToPromise } from '../utils.js';
2
2
  const TABLE = 'messageRefs';
3
3
  export class IdbRefMsgRepository {
4
+ _driver;
4
5
  constructor(_driver) {
5
6
  this._driver = _driver;
6
7
  _driver.registerMigration(TABLE, 1, (db) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ref-messages.js","sourceRoot":"","sources":["../../../../src/idb/repository/ref-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { IReferenceMessagesRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { cursorToIterator, reqToPromise, txToPromise } from '../utils.js'\n\nconst TABLE = 'messageRefs'\n\ninterface MessageRefDto {\n peerId: number\n chatId: number\n msgId: number\n}\n\nexport class IdbRefMsgRepository implements IReferenceMessagesRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(TABLE, 1, (db) => {\n const os = db.createObjectStore(TABLE, { keyPath: ['peerId', 'chatId', 'msgId'] })\n os.createIndex('by_peer', 'peerId')\n os.createIndex('by_msg', ['chatId', 'msgId'])\n })\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE, mode).objectStore(TABLE)\n }\n\n async store(peerId: number, chatId: number, msgId: number): Promise<void> {\n const os = this.os('readwrite')\n\n await reqToPromise(os.put({ peerId, chatId, msgId } satisfies MessageRefDto))\n }\n\n async getByPeer(peerId: number): Promise<[number, number] | null> {\n const os = this.os()\n const index = os.index('by_peer')\n\n const it = await reqToPromise<MessageRefDto>(index.get(peerId) as IDBRequest<MessageRefDto>)\n if (!it) return null\n\n return [it.chatId, it.msgId]\n }\n\n async delete(chatId: number, msgIds: number[]): Promise<void> {\n const tx = this._driver.db.transaction(TABLE, 'readwrite')\n const os = tx.objectStore(TABLE)\n const index = os.index('by_msg')\n\n for (const msgId of msgIds) {\n const keys = await reqToPromise(index.getAllKeys([chatId, msgId]))\n\n // there are never that many keys, so we can avoid using cursor\n for (const key of keys) {\n os.delete(key)\n }\n }\n\n return txToPromise(tx)\n }\n\n async deleteByPeer(peerId: number): Promise<void> {\n const tx = this._driver.db.transaction(TABLE, 'readwrite')\n const os = tx.objectStore(TABLE)\n const index = os.index('by_peer')\n\n for await (const cursor of cursorToIterator(index.openCursor(peerId))) {\n cursor.delete()\n }\n\n return txToPromise(tx)\n }\n\n async deleteAll(): Promise<void> {\n await reqToPromise(this.os('readwrite').clear())\n }\n}\n"]}
1
+ {"version":3,"file":"ref-messages.js","sourceRoot":"","sources":["../../../../src/idb/repository/ref-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { IReferenceMessagesRepository } from '@mtcute/core'\n\nimport { IdbStorageDriver } from '../driver.js'\nimport { cursorToIterator, reqToPromise, txToPromise } from '../utils.js'\n\nconst TABLE = 'messageRefs'\n\ninterface MessageRefDto {\n peerId: number\n chatId: number\n msgId: number\n}\n\nexport class IdbRefMsgRepository implements IReferenceMessagesRepository {\n constructor(readonly _driver: IdbStorageDriver) {\n _driver.registerMigration(TABLE, 1, (db) => {\n const os = db.createObjectStore(TABLE, { keyPath: ['peerId', 'chatId', 'msgId'] })\n os.createIndex('by_peer', 'peerId')\n os.createIndex('by_msg', ['chatId', 'msgId'])\n })\n }\n\n private os(mode?: IDBTransactionMode): IDBObjectStore {\n return this._driver.db.transaction(TABLE, mode).objectStore(TABLE)\n }\n\n async store(peerId: number, chatId: number, msgId: number): Promise<void> {\n const os = this.os('readwrite')\n\n await reqToPromise(os.put({ peerId, chatId, msgId } satisfies MessageRefDto))\n }\n\n async getByPeer(peerId: number): Promise<[number, number] | null> {\n const os = this.os()\n const index = os.index('by_peer')\n\n const it = await reqToPromise<MessageRefDto>(index.get(peerId) as IDBRequest<MessageRefDto>)\n if (!it) return null\n\n return [it.chatId, it.msgId]\n }\n\n async delete(chatId: number, msgIds: number[]): Promise<void> {\n const tx = this._driver.db.transaction(TABLE, 'readwrite')\n const os = tx.objectStore(TABLE)\n const index = os.index('by_msg')\n\n for (const msgId of msgIds) {\n const keys = await reqToPromise(index.getAllKeys([chatId, msgId]))\n\n // there are never that many keys, so we can avoid using cursor\n for (const key of keys) {\n os.delete(key)\n }\n }\n\n return txToPromise(tx)\n }\n\n async deleteByPeer(peerId: number): Promise<void> {\n const tx = this._driver.db.transaction(TABLE, 'readwrite')\n const os = tx.objectStore(TABLE)\n const index = os.index('by_peer')\n\n for await (const cursor of cursorToIterator(index.openCursor(peerId))) {\n cursor.delete()\n }\n\n return txToPromise(tx)\n }\n\n async deleteAll(): Promise<void> {\n await reqToPromise(this.os('readwrite').clear())\n }\n}\n"]}