@mtcute/test 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 (68) hide show
  1. package/esm/client.js +13 -11
  2. package/esm/client.js.map +1 -1
  3. package/esm/crypto.js +4 -3
  4. package/esm/crypto.js.map +1 -1
  5. package/esm/platform.d.ts +2 -1
  6. package/esm/platform.js +2 -1
  7. package/esm/platform.js.map +1 -1
  8. package/esm/schema.d.ts +6 -1
  9. package/esm/schema.js.map +1 -1
  10. package/esm/storage.js +1 -0
  11. package/esm/storage.js.map +1 -1
  12. package/esm/stub.js.map +1 -1
  13. package/esm/transport.d.ts +0 -1
  14. package/esm/transport.js +5 -2
  15. package/esm/transport.js.map +1 -1
  16. package/esm/utils.js.map +1 -1
  17. package/index.d.ts +1 -0
  18. package/index.js +1 -0
  19. package/package.json +7 -13
  20. package/cjs/client.d.ts +0 -54
  21. package/cjs/client.js +0 -235
  22. package/cjs/client.js.map +0 -1
  23. package/cjs/crypto.d.ts +0 -6
  24. package/cjs/crypto.js +0 -186
  25. package/cjs/crypto.js.map +0 -1
  26. package/cjs/index.d.ts +0 -8
  27. package/cjs/index.js +0 -25
  28. package/cjs/index.js.map +0 -1
  29. package/cjs/package.json +0 -3
  30. package/cjs/platform.d.ts +0 -3
  31. package/cjs/platform.js +0 -7
  32. package/cjs/platform.js.map +0 -1
  33. package/cjs/platform.web.d.ts +0 -3
  34. package/cjs/platform.web.js +0 -7
  35. package/cjs/platform.web.js.map +0 -1
  36. package/cjs/schema.d.ts +0 -1
  37. package/cjs/schema.js +0 -55
  38. package/cjs/schema.js.map +0 -1
  39. package/cjs/storage/auth-keys.d.ts +0 -3
  40. package/cjs/storage/auth-keys.js +0 -95
  41. package/cjs/storage/auth-keys.js.map +0 -1
  42. package/cjs/storage/index.d.ts +0 -4
  43. package/cjs/storage/index.js +0 -21
  44. package/cjs/storage/index.js.map +0 -1
  45. package/cjs/storage/key-value.d.ts +0 -3
  46. package/cjs/storage/key-value.js +0 -41
  47. package/cjs/storage/key-value.js.map +0 -1
  48. package/cjs/storage/peers.d.ts +0 -3
  49. package/cjs/storage/peers.js +0 -75
  50. package/cjs/storage/peers.js.map +0 -1
  51. package/cjs/storage/ref-messages.d.ts +0 -3
  52. package/cjs/storage/ref-messages.js +0 -69
  53. package/cjs/storage/ref-messages.js.map +0 -1
  54. package/cjs/storage.d.ts +0 -37
  55. package/cjs/storage.js +0 -48
  56. package/cjs/storage.js.map +0 -1
  57. package/cjs/stub.d.ts +0 -2
  58. package/cjs/stub.js +0 -71
  59. package/cjs/stub.js.map +0 -1
  60. package/cjs/transport.d.ts +0 -30
  61. package/cjs/transport.js +0 -52
  62. package/cjs/transport.js.map +0 -1
  63. package/cjs/types.d.ts +0 -8
  64. package/cjs/types.js +0 -3
  65. package/cjs/types.js.map +0 -1
  66. package/cjs/utils.d.ts +0 -2
  67. package/cjs/utils.js +0 -17
  68. package/cjs/utils.js.map +0 -1
package/esm/client.js CHANGED
@@ -37,17 +37,6 @@ export class StubTelegramClient extends BaseTelegramClient {
37
37
  crypto: defaultCryptoProvider,
38
38
  ...params,
39
39
  });
40
- // some fake peers handling //
41
- this._knownChats = new Map();
42
- this._knownUsers = new Map();
43
- this._selfId = 0;
44
- // eslint-disable-next-line func-call-spacing
45
- this._responders = new Map();
46
- // some fake updates mechanism //
47
- this._fakeMessageBoxes = new Map();
48
- this._lastQts = 0;
49
- this._lastDate = Math.floor(Date.now() / 1000);
50
- this._lastSeq = 0;
51
40
  }
52
41
  /**
53
42
  * Create a fake client that may not actually be used for API calls
@@ -80,6 +69,10 @@ export class StubTelegramClient extends BaseTelegramClient {
80
69
  });
81
70
  // i don't want to type this properly since it would require depending test utils on client
82
71
  }
72
+ // some fake peers handling //
73
+ _knownChats = new Map();
74
+ _knownUsers = new Map();
75
+ _selfId = 0;
83
76
  async registerPeers(...peers) {
84
77
  for (const peer of peers) {
85
78
  if (tl.isAnyUser(peer)) {
@@ -126,9 +119,13 @@ export class StubTelegramClient extends BaseTelegramClient {
126
119
  }
127
120
  return { users, chats };
128
121
  }
122
+ // method calls intercepting //
123
+ _onRawMessage;
129
124
  onRawMessage(fn) {
130
125
  this._onRawMessage = fn;
131
126
  }
127
+ // eslint-disable-next-line func-call-spacing
128
+ _responders = new Map();
132
129
  addResponder(responders) {
133
130
  if (Array.isArray(responders)) {
134
131
  for (const responder of responders) {
@@ -154,6 +151,11 @@ export class StubTelegramClient extends BaseTelegramClient {
154
151
  }
155
152
  return super.call(message, params);
156
153
  }
154
+ // some fake updates mechanism //
155
+ _fakeMessageBoxes = new Map();
156
+ _lastQts = 0;
157
+ _lastDate = Math.floor(Date.now() / 1000);
158
+ _lastSeq = 0;
157
159
  getMessageBox(chatId = 0) {
158
160
  const state = this._fakeMessageBoxes.get(chatId);
159
161
  if (!state) {
package/esm/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core'\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '@mtcute/core/client.js'\n\nimport { defaultCryptoProvider } from './platform.js'\nimport { StubMemoryTelegramStorage } from './storage.js'\nimport { StubTelegramTransport } from './transport.js'\nimport { InputResponder } from './types.js'\nimport { markedIdToPeer } from './utils.js'\n\ninterface MessageBox {\n pts: number\n lastMessageId: number\n}\n\ntype InputPeerId = number | tl.TypePeer | false | undefined\n\nexport class StubTelegramClient extends BaseTelegramClient {\n constructor(params?: Partial<BaseTelegramClientOptions>) {\n const storage = new StubMemoryTelegramStorage({\n hasKeys: true,\n hasTempKeys: true,\n })\n\n super({\n apiId: 0,\n apiHash: '',\n logLevel: 0,\n storage,\n disableUpdates: true,\n transport: () => {\n const transport = new StubTelegramTransport({\n onMessage: (data) => {\n if (!this._onRawMessage) {\n if (this._responders.size) {\n this.emitError(new Error('Unexpected outgoing message'))\n }\n\n return\n }\n\n const dcId = transport._currentDc!.id\n const key = storage.authKeys.get(dcId)\n\n if (key) {\n this._onRawMessage(storage.decryptOutgoingMessage(transport._crypto, data, dcId))\n }\n },\n })\n\n return transport\n },\n crypto: defaultCryptoProvider,\n ...params,\n })\n }\n\n /**\n * Create a fake client that may not actually be used for API calls\n *\n * Useful for testing \"offline\" methods\n */\n static offline() {\n const client = new StubTelegramClient()\n\n client.call = (obj) => {\n throw new Error(`Expected offline client to not make any API calls (method called: ${obj._})`)\n }\n\n return client\n }\n\n /**\n * Create a fake \"full\" client (i.e. TelegramClient)\n *\n * Basically a proxy that returns an empty function for every unknown method\n */\n static full() {\n const client = new StubTelegramClient()\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return new Proxy(client, {\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return () => {}\n }\n\n return target[prop as keyof typeof target]\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any\n // i don't want to type this properly since it would require depending test utils on client\n }\n\n // some fake peers handling //\n\n readonly _knownChats = new Map<number, tl.TypeChat>()\n readonly _knownUsers = new Map<number, tl.TypeUser>()\n _selfId = 0\n\n async registerPeers(...peers: (tl.TypeUser | tl.TypeChat)[]): Promise<void> {\n for (const peer of peers) {\n if (tl.isAnyUser(peer)) {\n this._knownUsers.set(peer.id, peer)\n } else {\n this._knownChats.set(peer.id, peer)\n }\n\n await this.storage.peers.updatePeersFrom(peer)\n }\n }\n\n getPeers(ids: InputPeerId[]) {\n const users: tl.TypeUser[] = []\n const chats: tl.TypeChat[] = []\n\n for (let id of ids) {\n if (!id) continue\n\n if (typeof id === 'number') {\n id = markedIdToPeer(id)\n }\n\n switch (id._) {\n case 'peerUser': {\n const user = this._knownUsers.get(id.userId)\n if (!user) throw new Error(`Unknown user with ID ${id.userId}`)\n\n users.push(user)\n break\n }\n case 'peerChat': {\n const chat = this._knownChats.get(id.chatId)\n if (!chat) throw new Error(`Unknown chat with ID ${id.chatId}`)\n\n chats.push(chat)\n break\n }\n case 'peerChannel': {\n const chat = this._knownChats.get(id.channelId)\n if (!chat) throw new Error(`Unknown channel with ID ${id.channelId}`)\n\n chats.push(chat)\n break\n }\n }\n }\n\n return { users, chats }\n }\n\n // method calls intercepting //\n\n private _onRawMessage?: (data: Uint8Array) => void\n onRawMessage(fn: (data: Uint8Array) => void): void {\n this._onRawMessage = fn\n }\n\n // eslint-disable-next-line func-call-spacing\n private _responders = new Map<string, (data: unknown) => unknown>()\n\n addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void {\n if (Array.isArray(responders)) {\n for (const responder of responders) {\n this.addResponder(responder as InputResponder<tl.RpcMethod['_']>)\n }\n\n return\n }\n\n if (typeof responders === 'function') {\n responders = responders(this)\n }\n\n const [method, responder] = responders\n this.respondWith(method, responder)\n }\n\n respondWith<\n T extends tl.RpcMethod['_'],\n Fn extends(data: tl.FindByName<tl.RpcMethod, T>) => MaybePromise<tl.RpcCallReturn[T]>,\n >(method: T, response: Fn): Fn {\n // eslint-disable-next-line\n this._responders.set(method, response as any)\n\n return response\n }\n\n async call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (this._responders.has(message._)) {\n // eslint-disable-next-line\n return Promise.resolve(this._responders.get(message._)!(message)) as any\n }\n\n return super.call(message, params)\n }\n\n // some fake updates mechanism //\n\n private _fakeMessageBoxes = new Map<number, MessageBox>()\n private _lastQts = 0\n private _lastDate = Math.floor(Date.now() / 1000)\n private _lastSeq = 0\n\n getMessageBox(chatId = 0): MessageBox {\n const state = this._fakeMessageBoxes.get(chatId)\n\n if (!state) {\n const newState = { pts: 0, lastMessageId: 0 }\n this._fakeMessageBoxes.set(chatId, newState)\n\n return newState\n }\n\n return state\n }\n\n getNextMessageId(chatId = 0) {\n const state = this.getMessageBox(chatId)\n\n const nextId = state.lastMessageId + 1\n state.lastMessageId = nextId\n\n return nextId\n }\n\n getNextPts(chatId = 0, count = 1) {\n const state = this.getMessageBox(chatId)\n\n const nextPts = state.pts + count\n state.pts = nextPts\n\n return nextPts\n }\n\n getNextQts() {\n return this._lastQts++\n }\n\n getNextDate() {\n return (this._lastDate = Math.floor(Date.now() / 1000))\n }\n\n createStubUpdates(params: {\n updates: tl.TypeUpdate[]\n peers?: (number | tl.TypePeer)[]\n seq?: number\n seqCount?: number\n }): tl.TypeUpdates {\n const { peers, updates, seq = 0, seqCount = 1 } = params\n\n const { users, chats } = this.getPeers(peers ?? [])\n\n const seqStart = seq - seqCount + 1\n\n if (seq !== 0) {\n this._lastSeq = seq + seqCount\n }\n\n if (seqStart !== seq) {\n return {\n _: 'updatesCombined',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n seqStart,\n }\n }\n\n return {\n _: 'updates',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n }\n }\n\n // helpers //\n\n async with(fn: () => MaybePromise<void>): Promise<void> {\n await this.connect()\n\n let error: unknown\n\n this.onError((err) => {\n error = err\n })\n\n try {\n await fn()\n } catch (e) {\n error = e\n }\n\n await this.close()\n\n if (error) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error\n }\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core'\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '@mtcute/core/client.js'\n\nimport { defaultCryptoProvider } from './platform.js'\nimport { StubMemoryTelegramStorage } from './storage.js'\nimport { StubTelegramTransport } from './transport.js'\nimport { InputResponder } from './types.js'\nimport { markedIdToPeer } from './utils.js'\n\ninterface MessageBox {\n pts: number\n lastMessageId: number\n}\n\ntype InputPeerId = number | tl.TypePeer | false | undefined\n\nexport class StubTelegramClient extends BaseTelegramClient {\n constructor(params?: Partial<BaseTelegramClientOptions>) {\n const storage = new StubMemoryTelegramStorage({\n hasKeys: true,\n hasTempKeys: true,\n })\n\n super({\n apiId: 0,\n apiHash: '',\n logLevel: 0,\n storage,\n disableUpdates: true,\n transport: () => {\n const transport = new StubTelegramTransport({\n onMessage: (data) => {\n if (!this._onRawMessage) {\n if (this._responders.size) {\n this.emitError(new Error('Unexpected outgoing message'))\n }\n\n return\n }\n\n const dcId = transport._currentDc!.id\n const key = storage.authKeys.get(dcId)\n\n if (key) {\n this._onRawMessage(storage.decryptOutgoingMessage(transport._crypto, data, dcId))\n }\n },\n })\n\n return transport\n },\n crypto: defaultCryptoProvider,\n ...params,\n })\n }\n\n /**\n * Create a fake client that may not actually be used for API calls\n *\n * Useful for testing \"offline\" methods\n */\n static offline() {\n const client = new StubTelegramClient()\n\n client.call = (obj) => {\n throw new Error(`Expected offline client to not make any API calls (method called: ${obj._})`)\n }\n\n return client\n }\n\n /**\n * Create a fake \"full\" client (i.e. TelegramClient)\n *\n * Basically a proxy that returns an empty function for every unknown method\n */\n static full() {\n const client = new StubTelegramClient()\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return new Proxy(client, {\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return () => {}\n }\n\n return target[prop as keyof typeof target]\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any\n // i don't want to type this properly since it would require depending test utils on client\n }\n\n // some fake peers handling //\n\n readonly _knownChats = new Map<number, tl.TypeChat>()\n readonly _knownUsers = new Map<number, tl.TypeUser>()\n _selfId = 0\n\n async registerPeers(...peers: (tl.TypeUser | tl.TypeChat)[]): Promise<void> {\n for (const peer of peers) {\n if (tl.isAnyUser(peer)) {\n this._knownUsers.set(peer.id, peer)\n } else {\n this._knownChats.set(peer.id, peer)\n }\n\n await this.storage.peers.updatePeersFrom(peer)\n }\n }\n\n getPeers(ids: InputPeerId[]) {\n const users: tl.TypeUser[] = []\n const chats: tl.TypeChat[] = []\n\n for (let id of ids) {\n if (!id) continue\n\n if (typeof id === 'number') {\n id = markedIdToPeer(id)\n }\n\n switch (id._) {\n case 'peerUser': {\n const user = this._knownUsers.get(id.userId)\n if (!user) throw new Error(`Unknown user with ID ${id.userId}`)\n\n users.push(user)\n break\n }\n case 'peerChat': {\n const chat = this._knownChats.get(id.chatId)\n if (!chat) throw new Error(`Unknown chat with ID ${id.chatId}`)\n\n chats.push(chat)\n break\n }\n case 'peerChannel': {\n const chat = this._knownChats.get(id.channelId)\n if (!chat) throw new Error(`Unknown channel with ID ${id.channelId}`)\n\n chats.push(chat)\n break\n }\n }\n }\n\n return { users, chats }\n }\n\n // method calls intercepting //\n\n private _onRawMessage?: (data: Uint8Array) => void\n onRawMessage(fn: (data: Uint8Array) => void): void {\n this._onRawMessage = fn\n }\n\n // eslint-disable-next-line func-call-spacing\n private _responders = new Map<string, (data: unknown) => unknown>()\n\n addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void {\n if (Array.isArray(responders)) {\n for (const responder of responders) {\n this.addResponder(responder as InputResponder<tl.RpcMethod['_']>)\n }\n\n return\n }\n\n if (typeof responders === 'function') {\n responders = responders(this)\n }\n\n const [method, responder] = responders\n this.respondWith(method, responder)\n }\n\n respondWith<\n T extends tl.RpcMethod['_'],\n Fn extends(data: tl.FindByName<tl.RpcMethod, T>) => MaybePromise<tl.RpcCallReturn[T]>,\n >(method: T, response: Fn): Fn {\n // eslint-disable-next-line\n this._responders.set(method, response as any)\n\n return response\n }\n\n async call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (this._responders.has(message._)) {\n // eslint-disable-next-line\n return Promise.resolve(this._responders.get(message._)!(message)) as any\n }\n\n return super.call(message, params)\n }\n\n // some fake updates mechanism //\n\n private _fakeMessageBoxes = new Map<number, MessageBox>()\n private _lastQts = 0\n private _lastDate = Math.floor(Date.now() / 1000)\n private _lastSeq = 0\n\n getMessageBox(chatId = 0): MessageBox {\n const state = this._fakeMessageBoxes.get(chatId)\n\n if (!state) {\n const newState = { pts: 0, lastMessageId: 0 }\n this._fakeMessageBoxes.set(chatId, newState)\n\n return newState\n }\n\n return state\n }\n\n getNextMessageId(chatId = 0) {\n const state = this.getMessageBox(chatId)\n\n const nextId = state.lastMessageId + 1\n state.lastMessageId = nextId\n\n return nextId\n }\n\n getNextPts(chatId = 0, count = 1) {\n const state = this.getMessageBox(chatId)\n\n const nextPts = state.pts + count\n state.pts = nextPts\n\n return nextPts\n }\n\n getNextQts() {\n return this._lastQts++\n }\n\n getNextDate() {\n return (this._lastDate = Math.floor(Date.now() / 1000))\n }\n\n createStubUpdates(params: {\n updates: tl.TypeUpdate[]\n peers?: (number | tl.TypePeer)[]\n seq?: number\n seqCount?: number\n }): tl.TypeUpdates {\n const { peers, updates, seq = 0, seqCount = 1 } = params\n\n const { users, chats } = this.getPeers(peers ?? [])\n\n const seqStart = seq - seqCount + 1\n\n if (seq !== 0) {\n this._lastSeq = seq + seqCount\n }\n\n if (seqStart !== seq) {\n return {\n _: 'updatesCombined',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n seqStart,\n }\n }\n\n return {\n _: 'updates',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n }\n }\n\n // helpers //\n\n async with(fn: () => MaybePromise<void>): Promise<void> {\n await this.connect()\n\n let error: unknown\n\n this.onError((err) => {\n error = err\n })\n\n try {\n await fn()\n } catch (e) {\n error = e\n }\n\n await this.close()\n\n if (error) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error\n }\n }\n}\n"]}
package/esm/crypto.js CHANGED
@@ -1,5 +1,5 @@
1
+ import { gzipSync, inflateSync } from 'node:zlib';
1
2
  import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { gzipSync, inflateSync } from 'zlib';
3
3
  import { getPlatform } from '@mtcute/core/platform.js';
4
4
  import { dataViewFromBuffer } from '@mtcute/core/utils.js';
5
5
  import { defaultCryptoProvider } from './platform.js';
@@ -44,16 +44,17 @@ export function withFakeRandom(provider, source = DEFAULT_ENTROPY) {
44
44
  export function useFakeMathRandom(source = DEFAULT_ENTROPY) {
45
45
  const sourceBytes = getPlatform().hexDecode(source);
46
46
  const dv = dataViewFromBuffer(sourceBytes);
47
+ let spy;
47
48
  beforeEach(() => {
48
49
  let offset = 0;
49
- vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {
50
+ spy = vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {
50
51
  const ret = dv.getUint32(offset, true) / 0xffffffff;
51
52
  offset += 4;
52
53
  return ret;
53
54
  });
54
55
  });
55
56
  afterEach(() => {
56
- vi.spyOn(globalThis.Math, 'random').mockRestore();
57
+ spy.mockRestore();
57
58
  });
58
59
  }
59
60
  export async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY) {
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 { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'\nimport { gzipSync, inflateSync } from 'zlib'\n\nimport { getPlatform } from '@mtcute/core/platform.js'\nimport { dataViewFromBuffer, ICryptoProvider } from '@mtcute/core/utils.js'\n\nimport { defaultCryptoProvider } from './platform.js'\n\n// some random 1024 bytes of entropy\nconst DEFAULT_ENTROPY = `\n29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb269c489920ef99021b\n259ce3a2c964c5c8972b4a84ff96f3375a94b535a9468f2896e2080ac7a32ed58e910474a4b02415e07671cbb5bdd58a5dd26fd137c4c98b8c346571fae6ead3\n9dfd612bd6b480b6723433f5218e9d6e271591153fb3ffefc089f7e848d3f4633459fff66b33cf939e5655813149fa34be8625f9bc4814d1ee6cf40e4d0de229\n1aa22e68c8ad8cc698103734f9aaf79f2bdc052a787a7a9b3629d1ed38750f88cb0481c0ba30a9c611672f9a4d1dc02637abb4e98913ee810a3b152d3d75f25d\n7efdc263c08833569968b1771ebbe843d187e2c917d9ad8e8865e44b69f7b74d72ab86a4ef1891dce196ee11a7c9d7d8074fc0450e745bd3a827d77bb0820b90\n3055dc15f0abd897ea740a99606b64d28968d770b5e43492ddbf07a7c75104d3e522be9b72050c0fdae8412cdf49014be21105b87a06cb7202dd580387adc007\n6280d98b015a1a413819d817f007939d1490467a1ef85a345584c7e594bb729c12a1233f806e515e7088360219dfa109264310ba84777b93eb1ad3c40727a25a\na5d9cdd6748c6ab2ca0bd4daa2ba8225bce2b066a163bcacf05609fc84055bb86a4742c28addd7d7ab8d87b64cfde0b3f4b3bc8e05f3d0a1a2fadb294860e099\na10b3721b0d5b28918b8fb49a18a82a0fde6680a64ed915637805e35ffe8b2c1d4177ec10d10eaaf24425e0351b6a89e794944e1aa82eb5c0210a37da66cccac\n895398cf915a8aa141f611521fc258514a99c02721113942c66f2c9a8f9601ff0044a953d17a47b07ad1b5f8725cc020a1a5239be65db0a43d42c206903740f0\n27c3f749ecfff2e646570118cd54db2fec392b44d8eb8377309f3e4d164dbc0530914b117b9d278b06db8359d97442d4dcbcaff93cd9a08a6b06a5ba8725d0d7\n06b313a5d792be254d33e087b7a4fafcdf819941b9bec4c6057d4c050bd01eb243efd4e6b707281b127820a2b734c6d8f6b2131bf0b5b215c7a798ff3fe90ceb\nda91539fcc7b03d2b8b1381bd6023fff20278344ad944d364ba684842db3901c346335f0d455eda414f99c1e794a86aa3a90bcc6e085eecb0b4bf61198d16ed3\n89cfa495f977a37a51502b2f60649f2efd7d89c757b6366776ba4c0612017bf1fbfc682dd62e9960d39cbea854d2dcc708b1db5d268192954d13ee72c0bb1bd8\n558a3cf3b02b1cd795b40f7a57780391bb8724883d3f7764846c3823e165b3f8c025f59d896905f9a955478586ce57f820d958a01aa59a4cace7ecdf125df334\nfa3de8e50aac96c1275591a1221c32a60a1513370a33a228e00894341b10cf44a6ae6ac250d17a364e956ab1a17b068df3fb2d5b5a672d8a409eeb8b6ca1ade6\n`.replace(/\\s/g, '')\n\nexport function withFakeRandom(provider: ICryptoProvider, source = DEFAULT_ENTROPY): ICryptoProvider {\n const sourceBytes = getPlatform().hexDecode(source)\n let offset = 0\n\n function getRandomValues(buf: Uint8Array) {\n if (offset + buf.length > sourceBytes.length) {\n throw new Error('not enough entropy')\n }\n\n buf.set(sourceBytes.subarray(offset, offset + buf.length))\n offset += buf.length\n }\n\n return new Proxy<ICryptoProvider>(provider, {\n get(target, prop, receiver) {\n if (prop === 'randomFill') return getRandomValues\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\nexport function useFakeMathRandom(source = DEFAULT_ENTROPY): void {\n const sourceBytes = getPlatform().hexDecode(source)\n const dv = dataViewFromBuffer(sourceBytes)\n\n beforeEach(() => {\n let offset = 0\n\n vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {\n const ret = dv.getUint32(offset, true) / 0xffffffff\n offset += 4\n\n return ret\n })\n })\n afterEach(() => {\n vi.spyOn(globalThis.Math, 'random').mockRestore()\n })\n}\n\nexport async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY): Promise<ICryptoProvider> {\n const prov = withFakeRandom(defaultCryptoProvider, source)\n await prov.initialize?.()\n\n return prov\n}\n\nexport function testCryptoProvider(c: ICryptoProvider): void {\n beforeAll(() => c.initialize?.())\n\n const p = getPlatform()\n\n function gzipSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(gzipSync(data))\n }\n\n return gzipSync(data)\n }\n\n function inflateSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(inflateSync(data))\n }\n\n return inflateSync(data)\n }\n\n it('should calculate sha1', () => {\n expect(p.hexEncode(c.sha1(p.utf8Encode('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709')\n expect(p.hexEncode(c.sha1(p.utf8Encode('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')\n expect(p.hexEncode(c.sha1(p.hexDecode('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850')\n })\n\n it('should calculate sha256', () => {\n expect(p.hexEncode(c.sha256(p.utf8Encode('')))).to.eq(\n 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',\n )\n expect(p.hexEncode(c.sha256(p.utf8Encode('hello')))).to.eq(\n '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824',\n )\n expect(p.hexEncode(c.sha256(p.hexDecode('aebb1f')))).to.eq(\n '2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80',\n )\n })\n\n it('should calculate hmac-sha256', async () => {\n const key = p.hexDecode('aaeeff')\n\n expect(p.hexEncode(await c.hmacSha256(p.utf8Encode(''), key))).to.eq(\n '642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd',\n )\n expect(p.hexEncode(await c.hmacSha256(p.utf8Encode('hello'), key))).to.eq(\n '39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2',\n )\n expect(p.hexEncode(await c.hmacSha256(p.hexDecode('aebb1f'), key))).to.eq(\n 'a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35',\n )\n })\n\n it('should derive pbkdf2 key', async () => {\n expect(p.hexEncode(await c.pbkdf2(p.utf8Encode('pbkdf2 test'), p.utf8Encode('some salt'), 10))).to.eq(\n 'e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1',\n )\n })\n\n it('should encrypt and decrypt aes-ctr', () => {\n let aes = c.createAesCtr(\n p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'),\n true,\n )\n\n const data = p.hexDecode('7baae571e4c2f4cfadb1931d5923aca7')\n expect(p.hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f')\n expect(p.hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579')\n expect(p.hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725')\n expect(p.hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8')\n expect(p.hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92')\n expect(p.hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4')\n\n aes.close?.()\n aes = c.createAesCtr(\n p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'),\n false,\n )\n\n expect(p.hexEncode(aes.process(p.hexDecode('df5647dbb70bc393f2fb05b72f42286f')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('3917147082672516b3177150129bc579')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('2a7a9089270a5de45d5e3dd399cac725')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('56d085217771398ac13583de4d677dd8')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('cc639b488126cf36e79c4515e8012b92')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('01384d100646cd562cc5586ec3f8f8c4')))).eq(p.hexEncode(data))\n\n aes.close?.()\n })\n\n it('should encrypt and decrypt aes-ige', () => {\n const aes = c.createAesIge(\n p.hexDecode('5468697320697320616E20696D706C655468697320697320616E20696D706C65'),\n p.hexDecode('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'),\n )\n expect(\n p.hexEncode(aes.encrypt(p.hexDecode('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b'))),\n ).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')\n expect(\n p.hexEncode(aes.decrypt(p.hexDecode('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69'))),\n ).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')\n })\n\n it(\n 'should decompose PQ to prime factors P and Q',\n async () => {\n const testFactorization = async (pq: string, p_: string, q: string) => {\n const [p1, q1] = await c.factorizePQ(p.hexDecode(pq))\n expect(p.hexEncode(p1)).eq(p_.toLowerCase())\n expect(p.hexEncode(q1)).eq(q.toLowerCase())\n }\n\n // from samples at https://core.telegram.org/mtproto/samples-auth_key\n await testFactorization('17ED48941A08F981', '494C553B', '53911073')\n // random example\n await testFactorization('14fcab4dfc861f45', '494c5c99', '494c778d')\n },\n // since PQ factorization relies on RNG, it may take a while (or may not!)\n { timeout: 10000 },\n )\n\n it('should correctly gzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = c.gzip(data, 100)\n\n expect(compressed).not.toBeNull()\n\n const decompressed = inflateSyncWrap(compressed!)\n\n expect(compressed!.length).toBeLessThan(data.length)\n expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data))\n })\n\n it('should correctly gunzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = gzipSyncWrap(data)\n const decompressed = c.gunzip(compressed)\n\n expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data))\n })\n\n describe('randomBytes', () => {\n it('should return exactly N bytes', () => {\n expect(c.randomBytes(0).length).eq(0)\n expect(c.randomBytes(5).length).eq(5)\n expect(c.randomBytes(10).length).eq(10)\n expect(c.randomBytes(256).length).eq(256)\n })\n\n it('should not be deterministic', () => {\n expect([...c.randomBytes(8)]).not.eql([...c.randomBytes(8)])\n })\n\n it('should use randomFill', () => {\n const spy = vi.spyOn(c, 'randomFill')\n c.randomBytes(8)\n\n expect(spy).toHaveBeenCalled()\n })\n })\n}\n\nexport function u8HexDecode(hex: string) {\n const buf = getPlatform().hexDecode(hex)\n\n // eslint-disable-next-line no-restricted-globals\n if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {\n return new Uint8Array(buf)\n }\n\n return buf\n}\n"]}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { gzipSync, inflateSync } from 'node:zlib'\nimport { afterEach, beforeAll, beforeEach, describe, expect, it, MockInstance, vi } from 'vitest'\n\nimport { getPlatform } from '@mtcute/core/platform.js'\nimport { dataViewFromBuffer, ICryptoProvider } from '@mtcute/core/utils.js'\n\nimport { defaultCryptoProvider } from './platform.js'\n\n// some random 1024 bytes of entropy\nconst DEFAULT_ENTROPY = `\n29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb269c489920ef99021b\n259ce3a2c964c5c8972b4a84ff96f3375a94b535a9468f2896e2080ac7a32ed58e910474a4b02415e07671cbb5bdd58a5dd26fd137c4c98b8c346571fae6ead3\n9dfd612bd6b480b6723433f5218e9d6e271591153fb3ffefc089f7e848d3f4633459fff66b33cf939e5655813149fa34be8625f9bc4814d1ee6cf40e4d0de229\n1aa22e68c8ad8cc698103734f9aaf79f2bdc052a787a7a9b3629d1ed38750f88cb0481c0ba30a9c611672f9a4d1dc02637abb4e98913ee810a3b152d3d75f25d\n7efdc263c08833569968b1771ebbe843d187e2c917d9ad8e8865e44b69f7b74d72ab86a4ef1891dce196ee11a7c9d7d8074fc0450e745bd3a827d77bb0820b90\n3055dc15f0abd897ea740a99606b64d28968d770b5e43492ddbf07a7c75104d3e522be9b72050c0fdae8412cdf49014be21105b87a06cb7202dd580387adc007\n6280d98b015a1a413819d817f007939d1490467a1ef85a345584c7e594bb729c12a1233f806e515e7088360219dfa109264310ba84777b93eb1ad3c40727a25a\na5d9cdd6748c6ab2ca0bd4daa2ba8225bce2b066a163bcacf05609fc84055bb86a4742c28addd7d7ab8d87b64cfde0b3f4b3bc8e05f3d0a1a2fadb294860e099\na10b3721b0d5b28918b8fb49a18a82a0fde6680a64ed915637805e35ffe8b2c1d4177ec10d10eaaf24425e0351b6a89e794944e1aa82eb5c0210a37da66cccac\n895398cf915a8aa141f611521fc258514a99c02721113942c66f2c9a8f9601ff0044a953d17a47b07ad1b5f8725cc020a1a5239be65db0a43d42c206903740f0\n27c3f749ecfff2e646570118cd54db2fec392b44d8eb8377309f3e4d164dbc0530914b117b9d278b06db8359d97442d4dcbcaff93cd9a08a6b06a5ba8725d0d7\n06b313a5d792be254d33e087b7a4fafcdf819941b9bec4c6057d4c050bd01eb243efd4e6b707281b127820a2b734c6d8f6b2131bf0b5b215c7a798ff3fe90ceb\nda91539fcc7b03d2b8b1381bd6023fff20278344ad944d364ba684842db3901c346335f0d455eda414f99c1e794a86aa3a90bcc6e085eecb0b4bf61198d16ed3\n89cfa495f977a37a51502b2f60649f2efd7d89c757b6366776ba4c0612017bf1fbfc682dd62e9960d39cbea854d2dcc708b1db5d268192954d13ee72c0bb1bd8\n558a3cf3b02b1cd795b40f7a57780391bb8724883d3f7764846c3823e165b3f8c025f59d896905f9a955478586ce57f820d958a01aa59a4cace7ecdf125df334\nfa3de8e50aac96c1275591a1221c32a60a1513370a33a228e00894341b10cf44a6ae6ac250d17a364e956ab1a17b068df3fb2d5b5a672d8a409eeb8b6ca1ade6\n`.replace(/\\s/g, '')\n\nexport function withFakeRandom(provider: ICryptoProvider, source = DEFAULT_ENTROPY): ICryptoProvider {\n const sourceBytes = getPlatform().hexDecode(source)\n let offset = 0\n\n function getRandomValues(buf: Uint8Array) {\n if (offset + buf.length > sourceBytes.length) {\n throw new Error('not enough entropy')\n }\n\n buf.set(sourceBytes.subarray(offset, offset + buf.length))\n offset += buf.length\n }\n\n return new Proxy<ICryptoProvider>(provider, {\n get(target, prop, receiver) {\n if (prop === 'randomFill') return getRandomValues\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\nexport function useFakeMathRandom(source = DEFAULT_ENTROPY): void {\n const sourceBytes = getPlatform().hexDecode(source)\n const dv = dataViewFromBuffer(sourceBytes)\n\n let spy: MockInstance<[], number>\n\n beforeEach(() => {\n let offset = 0\n\n spy = vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {\n const ret = dv.getUint32(offset, true) / 0xffffffff\n offset += 4\n\n return ret\n })\n })\n afterEach(() => {\n spy.mockRestore()\n })\n}\n\nexport async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY): Promise<ICryptoProvider> {\n const prov = withFakeRandom(defaultCryptoProvider, source)\n await prov.initialize?.()\n\n return prov\n}\n\nexport function testCryptoProvider(c: ICryptoProvider): void {\n beforeAll(() => c.initialize?.())\n\n const p = getPlatform()\n\n function gzipSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(gzipSync(data))\n }\n\n return gzipSync(data)\n }\n\n function inflateSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(inflateSync(data))\n }\n\n return inflateSync(data)\n }\n\n it('should calculate sha1', () => {\n expect(p.hexEncode(c.sha1(p.utf8Encode('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709')\n expect(p.hexEncode(c.sha1(p.utf8Encode('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')\n expect(p.hexEncode(c.sha1(p.hexDecode('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850')\n })\n\n it('should calculate sha256', () => {\n expect(p.hexEncode(c.sha256(p.utf8Encode('')))).to.eq(\n 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',\n )\n expect(p.hexEncode(c.sha256(p.utf8Encode('hello')))).to.eq(\n '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824',\n )\n expect(p.hexEncode(c.sha256(p.hexDecode('aebb1f')))).to.eq(\n '2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80',\n )\n })\n\n it('should calculate hmac-sha256', async () => {\n const key = p.hexDecode('aaeeff')\n\n expect(p.hexEncode(await c.hmacSha256(p.utf8Encode(''), key))).to.eq(\n '642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd',\n )\n expect(p.hexEncode(await c.hmacSha256(p.utf8Encode('hello'), key))).to.eq(\n '39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2',\n )\n expect(p.hexEncode(await c.hmacSha256(p.hexDecode('aebb1f'), key))).to.eq(\n 'a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35',\n )\n })\n\n it('should derive pbkdf2 key', async () => {\n expect(p.hexEncode(await c.pbkdf2(p.utf8Encode('pbkdf2 test'), p.utf8Encode('some salt'), 10))).to.eq(\n 'e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1',\n )\n })\n\n it('should encrypt and decrypt aes-ctr', () => {\n let aes = c.createAesCtr(\n p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'),\n true,\n )\n\n const data = p.hexDecode('7baae571e4c2f4cfadb1931d5923aca7')\n expect(p.hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f')\n expect(p.hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579')\n expect(p.hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725')\n expect(p.hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8')\n expect(p.hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92')\n expect(p.hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4')\n\n aes.close?.()\n aes = c.createAesCtr(\n p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'),\n false,\n )\n\n expect(p.hexEncode(aes.process(p.hexDecode('df5647dbb70bc393f2fb05b72f42286f')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('3917147082672516b3177150129bc579')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('2a7a9089270a5de45d5e3dd399cac725')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('56d085217771398ac13583de4d677dd8')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('cc639b488126cf36e79c4515e8012b92')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('01384d100646cd562cc5586ec3f8f8c4')))).eq(p.hexEncode(data))\n\n aes.close?.()\n })\n\n it('should encrypt and decrypt aes-ige', () => {\n const aes = c.createAesIge(\n p.hexDecode('5468697320697320616E20696D706C655468697320697320616E20696D706C65'),\n p.hexDecode('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'),\n )\n expect(\n p.hexEncode(aes.encrypt(p.hexDecode('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b'))),\n ).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')\n expect(\n p.hexEncode(aes.decrypt(p.hexDecode('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69'))),\n ).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')\n })\n\n it(\n 'should decompose PQ to prime factors P and Q',\n async () => {\n const testFactorization = async (pq: string, p_: string, q: string) => {\n const [p1, q1] = await c.factorizePQ(p.hexDecode(pq))\n expect(p.hexEncode(p1)).eq(p_.toLowerCase())\n expect(p.hexEncode(q1)).eq(q.toLowerCase())\n }\n\n // from samples at https://core.telegram.org/mtproto/samples-auth_key\n await testFactorization('17ED48941A08F981', '494C553B', '53911073')\n // random example\n await testFactorization('14fcab4dfc861f45', '494c5c99', '494c778d')\n },\n // since PQ factorization relies on RNG, it may take a while (or may not!)\n { timeout: 10000 },\n )\n\n it('should correctly gzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = c.gzip(data, 100)\n\n expect(compressed).not.toBeNull()\n\n const decompressed = inflateSyncWrap(compressed!)\n\n expect(compressed!.length).toBeLessThan(data.length)\n expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data))\n })\n\n it('should correctly gunzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = gzipSyncWrap(data)\n const decompressed = c.gunzip(compressed)\n\n expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data))\n })\n\n describe('randomBytes', () => {\n it('should return exactly N bytes', () => {\n expect(c.randomBytes(0).length).eq(0)\n expect(c.randomBytes(5).length).eq(5)\n expect(c.randomBytes(10).length).eq(10)\n expect(c.randomBytes(256).length).eq(256)\n })\n\n it('should not be deterministic', () => {\n expect([...c.randomBytes(8)]).not.eql([...c.randomBytes(8)])\n })\n\n it('should use randomFill', () => {\n const spy = vi.spyOn(c, 'randomFill')\n c.randomBytes(8)\n\n expect(spy).toHaveBeenCalled()\n })\n })\n}\n\nexport function u8HexDecode(hex: string) {\n const buf = getPlatform().hexDecode(hex)\n\n // eslint-disable-next-line no-restricted-globals\n if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {\n return new Uint8Array(buf)\n }\n\n return buf\n}\n"]}
package/esm/platform.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- import { NodeCryptoProvider, NodePlatform } from '@mtcute/node';
1
+ import { NodePlatform } from '@mtcute/node';
2
+ import { NodeCryptoProvider } from '@mtcute/node/utils.js';
2
3
  export declare const defaultPlatform: NodePlatform;
3
4
  export declare const defaultCryptoProvider: NodeCryptoProvider;
package/esm/platform.js CHANGED
@@ -1,4 +1,5 @@
1
- import { NodeCryptoProvider, NodePlatform } from '@mtcute/node';
1
+ import { NodePlatform } from '@mtcute/node';
2
+ import { NodeCryptoProvider } from '@mtcute/node/utils.js';
2
3
  export const defaultPlatform = new NodePlatform();
3
4
  export const defaultCryptoProvider = new NodeCryptoProvider();
4
5
  //# sourceMappingURL=platform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,YAAY,EAAE,CAAA;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,kBAAkB,EAAE,CAAA","sourcesContent":["import { NodeCryptoProvider, NodePlatform } from '@mtcute/node'\n\nexport const defaultPlatform = new NodePlatform()\nexport const defaultCryptoProvider = new NodeCryptoProvider()\n"]}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,YAAY,EAAE,CAAA;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,kBAAkB,EAAE,CAAA","sourcesContent":["import { NodePlatform } from '@mtcute/node'\nimport { NodeCryptoProvider } from '@mtcute/node/utils.js'\n\nexport const defaultPlatform = new NodePlatform()\nexport const defaultCryptoProvider = new NodeCryptoProvider()\n"]}
package/esm/schema.d.ts CHANGED
@@ -1 +1,6 @@
1
- export {};
1
+ import type { TlEntry } from '@mtcute/tl-utils';
2
+ /** @internal */
3
+ export declare function getEntriesMap(): {
4
+ entries: Map<string, TlEntry>;
5
+ unions: Map<string, TlEntry[]>;
6
+ };
package/esm/schema.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,CAAA;AAE7E,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAqB,CAAA;AAIrF,IAAI,iBAAiB,GAAgC,IAAI,CAAA;AACzD,IAAI,gBAAgB,GAAkC,IAAI,CAAA;AAE1D,gBAAgB;AAChB,MAAM,UAAU,aAAa;IACzB,IAAI,iBAAiB,EAAE;QACnB,OAAO;YACH,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,gBAAiB;SAC5B,CAAA;KACJ;IAED,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAA;IAC7B,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAA;IAE5B,IAAI,KAAc,CAAA;IAElB,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC,EAAE;QACpB,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAExC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACnC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;SACvC;QACD,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KAChD;IAED,OAAO;QACH,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,gBAAgB;KAC3B,CAAA;AACL,CAAC","sourcesContent":["import * as schema_ from '@mtcute/tl/api-schema.json' assert { type: 'json' }\n\nconst schema = ('default' in schema_ ? schema_.default : schema_) as { e: TlEntry[] }\n\nimport type { TlEntry } from '@mtcute/tl-utils'\n\nlet _cachedEntriesMap: Map<string, TlEntry> | null = null\nlet _cachedUnionsMap: Map<string, TlEntry[]> | null = null\n\n/** @internal */\nexport function getEntriesMap() {\n if (_cachedEntriesMap) {\n return {\n entries: _cachedEntriesMap,\n unions: _cachedUnionsMap!,\n }\n }\n\n _cachedEntriesMap = new Map()\n _cachedUnionsMap = new Map()\n\n let entry: TlEntry\n\n for (entry of schema.e) {\n _cachedEntriesMap.set(entry.name, entry)\n\n if (!_cachedUnionsMap.has(entry.type)) {\n _cachedUnionsMap.set(entry.type, [])\n }\n _cachedUnionsMap.get(entry.type)!.push(entry)\n }\n\n return {\n entries: _cachedEntriesMap,\n unions: _cachedUnionsMap,\n }\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,CAAA;AAE7E,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAqB,CAAA;AAIrF,IAAI,iBAAiB,GAAgC,IAAI,CAAA;AACzD,IAAI,gBAAgB,GAAkC,IAAI,CAAA;AAE1D,gBAAgB;AAChB,MAAM,UAAU,aAAa;IACzB,IAAI,iBAAiB,EAAE,CAAC;QACpB,OAAO;YACH,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,gBAAiB;SAC5B,CAAA;IACL,CAAC;IAED,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAA;IAC7B,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAA;IAE5B,IAAI,KAAc,CAAA;IAElB,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC;QACrB,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAExC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACxC,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC;IAED,OAAO;QACH,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,gBAAgB;KAC3B,CAAA;AACL,CAAC","sourcesContent":["import * as schema_ from '@mtcute/tl/api-schema.json' assert { type: 'json' }\n\nconst schema = ('default' in schema_ ? schema_.default : schema_) as { e: TlEntry[] }\n\nimport type { TlEntry } from '@mtcute/tl-utils'\n\nlet _cachedEntriesMap: Map<string, TlEntry> | null = null\nlet _cachedUnionsMap: Map<string, TlEntry[]> | null = null\n\n/** @internal */\nexport function getEntriesMap() {\n if (_cachedEntriesMap) {\n return {\n entries: _cachedEntriesMap,\n unions: _cachedUnionsMap!,\n }\n }\n\n _cachedEntriesMap = new Map()\n _cachedUnionsMap = new Map()\n\n let entry: TlEntry\n\n for (entry of schema.e) {\n _cachedEntriesMap.set(entry.name, entry)\n\n if (!_cachedUnionsMap.has(entry.type)) {\n _cachedUnionsMap.set(entry.type, [])\n }\n _cachedUnionsMap.get(entry.type)!.push(entry)\n }\n\n return {\n entries: _cachedEntriesMap,\n unions: _cachedUnionsMap,\n }\n}\n"]}
package/esm/storage.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { MemoryStorage, MtArgumentError } from '@mtcute/core';
2
2
  import { createAesIgeForMessage } from '@mtcute/core/utils.js';
3
3
  export class StubMemoryTelegramStorage extends MemoryStorage {
4
+ params;
4
5
  constructor(params = {
5
6
  hasKeys: true,
6
7
  hasTempKeys: true,
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAmB,MAAM,uBAAuB,CAAA;AAE/E,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IACxD,YACa,SAgBL;QACA,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;KACpB;QAED,KAAK,EAAE,CAAA;QArBE,WAAM,GAAN,MAAM,CAmBd;QAID,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACrB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBACpE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;iBAC7B;aACJ;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAA;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAA;QAE1C,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACzB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC5E,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;iBAC7B;aACJ;YAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC,CAAA;IACL,CAAC;IAED,sBAAsB,CAAC,MAAuB,EAAE,IAAgB,EAAE,IAAY,EAAE,SAA8B;QAC1G,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpG,IAAI,CAAC,GAAG,EAAE;YACN,MAAM,IAAI,eAAe,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;SAC1D;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAEvC,MAAM,GAAG,GAAG,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAE5C,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;QACrF,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAErC,OAAO,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAA;IAC9C,CAAC;CACJ","sourcesContent":["import { MemoryStorage, MtArgumentError } from '@mtcute/core'\nimport { createAesIgeForMessage, ICryptoProvider } from '@mtcute/core/utils.js'\n\nexport class StubMemoryTelegramStorage extends MemoryStorage {\n constructor(\n readonly params: {\n /**\n * IDs of the DCs for which the storage should have auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasKeys?: boolean | number[]\n\n /**\n * IDs of the DCs for which the storage should have temp auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasTempKeys?: boolean | number[]\n } = {\n hasKeys: true,\n hasTempKeys: true,\n },\n ) {\n super()\n\n const _origGet = this.authKeys.get\n\n this.authKeys.get = (dcId) => {\n if (this.params.hasKeys) {\n if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return _origGet.call(this.authKeys, dcId)\n }\n\n const _origGetTemp = this.authKeys.getTemp\n\n this.authKeys.getTemp = (dcId, idx, now) => {\n if (this.params.hasTempKeys) {\n if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return _origGetTemp.call(this.authKeys, dcId, idx, now)\n }\n }\n\n decryptOutgoingMessage(crypto: ICryptoProvider, data: Uint8Array, dcId: number, tempIndex?: number | undefined) {\n const key = tempIndex ? this.authKeys.getTemp(dcId, tempIndex, Date.now()) : this.authKeys.get(dcId)\n\n if (!key) {\n throw new MtArgumentError(`No auth key for DC ${dcId}`)\n }\n\n const messageKey = data.subarray(8, 24)\n const encryptedData = data.subarray(24)\n\n const ige = createAesIgeForMessage(crypto, key, messageKey, true)\n const innerData = ige.decrypt(encryptedData)\n\n // skipping all checks because who cares\n const dv = new DataView(innerData.buffer, innerData.byteOffset, innerData.byteLength)\n const length = dv.getUint32(28, true)\n\n return innerData.subarray(32, 32 + length)\n }\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAmB,MAAM,uBAAuB,CAAA;AAE/E,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IAE3C;IADb,YACa,SAgBL;QACA,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;KACpB;QAED,KAAK,EAAE,CAAA;QArBE,WAAM,GAAN,MAAM,CAmBd;QAID,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACtB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;gBAC9B,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAA;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAA;QAE1C,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7E,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;gBAC9B,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC,CAAA;IACL,CAAC;IAED,sBAAsB,CAAC,MAAuB,EAAE,IAAgB,EAAE,IAAY,EAAE,SAA8B;QAC1G,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpG,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAEvC,MAAM,GAAG,GAAG,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAE5C,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;QACrF,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAErC,OAAO,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAA;IAC9C,CAAC;CACJ","sourcesContent":["import { MemoryStorage, MtArgumentError } from '@mtcute/core'\nimport { createAesIgeForMessage, ICryptoProvider } from '@mtcute/core/utils.js'\n\nexport class StubMemoryTelegramStorage extends MemoryStorage {\n constructor(\n readonly params: {\n /**\n * IDs of the DCs for which the storage should have auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasKeys?: boolean | number[]\n\n /**\n * IDs of the DCs for which the storage should have temp auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasTempKeys?: boolean | number[]\n } = {\n hasKeys: true,\n hasTempKeys: true,\n },\n ) {\n super()\n\n const _origGet = this.authKeys.get\n\n this.authKeys.get = (dcId) => {\n if (this.params.hasKeys) {\n if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return _origGet.call(this.authKeys, dcId)\n }\n\n const _origGetTemp = this.authKeys.getTemp\n\n this.authKeys.getTemp = (dcId, idx, now) => {\n if (this.params.hasTempKeys) {\n if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return _origGetTemp.call(this.authKeys, dcId, idx, now)\n }\n }\n\n decryptOutgoingMessage(crypto: ICryptoProvider, data: Uint8Array, dcId: number, tempIndex?: number | undefined) {\n const key = tempIndex ? this.authKeys.getTemp(dcId, tempIndex, Date.now()) : this.authKeys.get(dcId)\n\n if (!key) {\n throw new MtArgumentError(`No auth key for DC ${dcId}`)\n }\n\n const messageKey = data.subarray(8, 24)\n const encryptedData = data.subarray(24)\n\n const ige = createAesIgeForMessage(crypto, key, messageKey, true)\n const innerData = ige.decrypt(encryptedData)\n\n // skipping all checks because who cares\n const dv = new DataView(innerData.buffer, innerData.byteOffset, innerData.byteLength)\n const length = dv.getUint32(28, true)\n\n return innerData.subarray(32, 32 + length)\n }\n}\n"]}
package/esm/stub.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stub.js","sourceRoot":"","sources":["../../src/stub.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAKvB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,SAAS,aAAa,CAAC,GAAe;IAClC,IAAI,GAAG,CAAC,aAAa,EAAE,QAAQ,IAAI,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE;QAChE,OAAO,EAAE,CAAA;KACZ;IAED,IAAI,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE;QAC9B,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;KACjD;IAED,QAAQ,GAAG,CAAC,IAAI,EAAE;QACd,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACT,OAAO,CAAC,CAAA;QACZ,KAAK,MAAM;YACP,OAAO,IAAI,CAAC,IAAI,CAAA;QACpB,KAAK,QAAQ;YACT,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QAC7B,KAAK,QAAQ;YACT,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QAC7B,KAAK,QAAQ;YACT,OAAO,EAAE,CAAA;QACb,KAAK,OAAO;YACR,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACP,OAAO,KAAK,CAAA;QAEhB,OAAO,CAAC,CAAC;YACL,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAClD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAEvD,8DAA8D;YAC9D,OAAO,UAAU,CAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;SACxC;KACJ;AACL,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE;IACvC,OAAO,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,EAAE,EAAE,EAAE;QAC7C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;AACN,CAAC,CAAA;AAED,MAAM,UAAU,UAAU,CACtB,IAAO,EACP,UAAkD,EAAE;IAEpD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAE/B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,aAAa,CAAC,CAAA;IAEvD,MAAM,GAAG,GAA4B;QACjC,CAAC,EAAE,IAAI;KACV,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE;QAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG;YAAE,SAAQ;QAC9B,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO;YAAE,SAAQ;QAEjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;KACnD;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QACvB,gDAAgD;QAChD,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;KAC1B;IAED,2BAA2B;IAC3B,OAAO,GAAU,CAAA;AACrB,CAAC","sourcesContent":["import Long from 'long'\n\nimport { tl } from '@mtcute/tl'\nimport type { TlArgument } from '@mtcute/tl-utils'\n\nimport { getEntriesMap } from './schema.js'\n\nfunction getDefaultFor(arg: TlArgument): unknown {\n if (arg.typeModifiers?.isVector || arg.typeModifiers?.isBareVector) {\n return []\n }\n\n if (arg.typeModifiers?.predicate) {\n return arg.type === 'true' ? false : undefined\n }\n\n switch (arg.type) {\n case 'int':\n case 'int53':\n case 'double':\n return 0\n case 'long':\n return Long.ZERO\n case 'int128':\n return new Uint8Array(16)\n case 'int256':\n return new Uint8Array(32)\n case 'string':\n return ''\n case 'bytes':\n return new Uint8Array(0)\n case 'Bool':\n case 'bool':\n return false\n\n default: {\n const union = getEntriesMap().unions.get(arg.type)\n if (!union) throw new Error(`Unknown type ${arg.type}`)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return createStub<any>(union[0].name)\n }\n }\n}\n\nconst snakeToCamel = (s: string): string => {\n return s.replace(/(?<!^|_)(_[a-z0-9])/gi, ($1) => {\n return $1.substring(1).toUpperCase()\n })\n}\n\nexport function createStub<T extends tl.TlObject['_']>(\n name: T,\n partial: Partial<tl.FindByName<tl.TlObject, T>> = {},\n): tl.FindByName<tl.TlObject, T> {\n const { entries } = getEntriesMap()\n const entry = entries.get(name)\n\n if (!entry) throw new Error(`Entry ${name} is unknown`)\n\n const ret: Record<string, unknown> = {\n _: name,\n }\n\n for (const arg of entry.arguments) {\n if (arg.type === '#') continue\n if (arg.name in partial) continue\n\n ret[snakeToCamel(arg.name)] = getDefaultFor(arg)\n }\n\n for (const key in partial) {\n // @ts-expect-error partial is not a full object\n ret[key] = partial[key]\n }\n\n // eslint-disable-next-line\n return ret as any\n}\n"]}
1
+ {"version":3,"file":"stub.js","sourceRoot":"","sources":["../../src/stub.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAKvB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,SAAS,aAAa,CAAC,GAAe;IAClC,IAAI,GAAG,CAAC,aAAa,EAAE,QAAQ,IAAI,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;QACjE,OAAO,EAAE,CAAA;IACb,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAClD,CAAC;IAED,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACT,OAAO,CAAC,CAAA;QACZ,KAAK,MAAM;YACP,OAAO,IAAI,CAAC,IAAI,CAAA;QACpB,KAAK,QAAQ;YACT,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QAC7B,KAAK,QAAQ;YACT,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QAC7B,KAAK,QAAQ;YACT,OAAO,EAAE,CAAA;QACb,KAAK,OAAO;YACR,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACP,OAAO,KAAK,CAAA;QAEhB,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAClD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAEvD,8DAA8D;YAC9D,OAAO,UAAU,CAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzC,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE;IACvC,OAAO,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,EAAE,EAAE,EAAE;QAC7C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;AACN,CAAC,CAAA;AAED,MAAM,UAAU,UAAU,CACtB,IAAO,EACP,UAAkD,EAAE;IAEpD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAE/B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,aAAa,CAAC,CAAA;IAEvD,MAAM,GAAG,GAA4B;QACjC,CAAC,EAAE,IAAI;KACV,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG;YAAE,SAAQ;QAC9B,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO;YAAE,SAAQ;QAEjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,gDAAgD;QAChD,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,2BAA2B;IAC3B,OAAO,GAAU,CAAA;AACrB,CAAC","sourcesContent":["import Long from 'long'\n\nimport { tl } from '@mtcute/tl'\nimport type { TlArgument } from '@mtcute/tl-utils'\n\nimport { getEntriesMap } from './schema.js'\n\nfunction getDefaultFor(arg: TlArgument): unknown {\n if (arg.typeModifiers?.isVector || arg.typeModifiers?.isBareVector) {\n return []\n }\n\n if (arg.typeModifiers?.predicate) {\n return arg.type === 'true' ? false : undefined\n }\n\n switch (arg.type) {\n case 'int':\n case 'int53':\n case 'double':\n return 0\n case 'long':\n return Long.ZERO\n case 'int128':\n return new Uint8Array(16)\n case 'int256':\n return new Uint8Array(32)\n case 'string':\n return ''\n case 'bytes':\n return new Uint8Array(0)\n case 'Bool':\n case 'bool':\n return false\n\n default: {\n const union = getEntriesMap().unions.get(arg.type)\n if (!union) throw new Error(`Unknown type ${arg.type}`)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return createStub<any>(union[0].name)\n }\n }\n}\n\nconst snakeToCamel = (s: string): string => {\n return s.replace(/(?<!^|_)(_[a-z0-9])/gi, ($1) => {\n return $1.substring(1).toUpperCase()\n })\n}\n\nexport function createStub<T extends tl.TlObject['_']>(\n name: T,\n partial: Partial<tl.FindByName<tl.TlObject, T>> = {},\n): tl.FindByName<tl.TlObject, T> {\n const { entries } = getEntriesMap()\n const entry = entries.get(name)\n\n if (!entry) throw new Error(`Entry ${name} is unknown`)\n\n const ret: Record<string, unknown> = {\n _: name,\n }\n\n for (const arg of entry.arguments) {\n if (arg.type === '#') continue\n if (arg.name in partial) continue\n\n ret[snakeToCamel(arg.name)] = getDefaultFor(arg)\n }\n\n for (const key in partial) {\n // @ts-expect-error partial is not a full object\n ret[key] = partial[key]\n }\n\n // eslint-disable-next-line\n return ret as any\n}\n"]}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import EventEmitter from 'events';
3
2
  import { ITelegramTransport, TransportState } from '@mtcute/core';
4
3
  import { ICryptoProvider, Logger } from '@mtcute/core/utils.js';
package/esm/transport.js CHANGED
@@ -1,15 +1,18 @@
1
1
  import EventEmitter from 'events';
2
2
  import { TransportState } from '@mtcute/core';
3
3
  export class StubTelegramTransport extends EventEmitter {
4
+ params;
4
5
  constructor(params) {
5
6
  super();
6
7
  this.params = params;
7
- this._state = TransportState.Idle;
8
- this._currentDc = null;
9
8
  if (params.getMtproxyInfo) {
10
9
  this.getMtproxyInfo = params.getMtproxyInfo;
11
10
  }
12
11
  }
12
+ _state = TransportState.Idle;
13
+ _currentDc = null;
14
+ _crypto;
15
+ _log;
13
16
  write(data) {
14
17
  this.emit('message', data);
15
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAsB,cAAc,EAAE,MAAM,cAAc,CAAA;AAIjE,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IACnD,YACa,MAKR;QAED,KAAK,EAAE,CAAA;QAPE,WAAM,GAAN,MAAM,CAKd;QASL,WAAM,GAAG,cAAc,CAAC,IAAI,CAAA;QAC5B,eAAU,GAA0B,IAAI,CAAA;QANpC,IAAI,MAAM,CAAC,cAAc,EAAE;YACtB,IAA2B,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAA;SACtE;IACL,CAAC;IAOD,KAAK,CAAC,IAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,MAAuB,EAAE,GAAW;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,KAAK;QACD,OAAO,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,UAAU,CAAA;IAC1B,CAAC;IAED,OAAO,CAAC,EAAkB,EAAE,QAAiB;QACzC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,KAAK,CAAA;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAEtE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACzC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAEzC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;IAC3B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,IAAI,CAAC,IAAgB;QACvB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;CACJ","sourcesContent":["import EventEmitter from 'events'\n\nimport { ITelegramTransport, TransportState } from '@mtcute/core'\nimport { ICryptoProvider, Logger } from '@mtcute/core/utils.js'\nimport { tl } from '@mtcute/tl'\n\nexport class StubTelegramTransport extends EventEmitter implements ITelegramTransport {\n constructor(\n readonly params: {\n getMtproxyInfo?: () => tl.RawInputClientProxy\n onConnect?: (dc: tl.RawDcOption, testMode: boolean) => void\n onClose?: () => void\n onMessage?: (msg: Uint8Array) => void\n },\n ) {\n super()\n\n if (params.getMtproxyInfo) {\n (this as ITelegramTransport).getMtproxyInfo = params.getMtproxyInfo\n }\n }\n\n _state = TransportState.Idle\n _currentDc: tl.RawDcOption | null = null\n _crypto!: ICryptoProvider\n _log!: Logger\n\n write(data: Uint8Array): void {\n this.emit('message', data)\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this._log = log\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): tl.RawDcOption | null {\n return this._currentDc\n }\n\n connect(dc: tl.RawDcOption, testMode: boolean): void {\n this._currentDc = dc\n this._state = TransportState.Ready\n this.emit('ready')\n this._log.debug('stubbing connection to %s:%d', dc.ipAddress, dc.port)\n\n this.params.onConnect?.(dc, testMode)\n }\n\n close(): void {\n this._currentDc = null\n this._state = TransportState.Idle\n this.emit('close')\n this._log.debug('stub connection closed')\n\n this.params.onClose?.()\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async send(data: Uint8Array): Promise<void> {\n this.params.onMessage?.(data)\n }\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAsB,cAAc,EAAE,MAAM,cAAc,CAAA;AAIjE,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAEtC;IADb,YACa,MAKR;QAED,KAAK,EAAE,CAAA;QAPE,WAAM,GAAN,MAAM,CAKd;QAID,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YACvB,IAA2B,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAA;QACvE,CAAC;IACL,CAAC;IAED,MAAM,GAAG,cAAc,CAAC,IAAI,CAAA;IAC5B,UAAU,GAA0B,IAAI,CAAA;IACxC,OAAO,CAAkB;IACzB,IAAI,CAAS;IAEb,KAAK,CAAC,IAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,MAAuB,EAAE,GAAW;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,KAAK;QACD,OAAO,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,UAAU,CAAA;IAC1B,CAAC;IAED,OAAO,CAAC,EAAkB,EAAE,QAAiB;QACzC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,KAAK,CAAA;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAEtE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACzC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAEzC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;IAC3B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,IAAI,CAAC,IAAgB;QACvB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;CACJ","sourcesContent":["import EventEmitter from 'events'\n\nimport { ITelegramTransport, TransportState } from '@mtcute/core'\nimport { ICryptoProvider, Logger } from '@mtcute/core/utils.js'\nimport { tl } from '@mtcute/tl'\n\nexport class StubTelegramTransport extends EventEmitter implements ITelegramTransport {\n constructor(\n readonly params: {\n getMtproxyInfo?: () => tl.RawInputClientProxy\n onConnect?: (dc: tl.RawDcOption, testMode: boolean) => void\n onClose?: () => void\n onMessage?: (msg: Uint8Array) => void\n },\n ) {\n super()\n\n if (params.getMtproxyInfo) {\n (this as ITelegramTransport).getMtproxyInfo = params.getMtproxyInfo\n }\n }\n\n _state = TransportState.Idle\n _currentDc: tl.RawDcOption | null = null\n _crypto!: ICryptoProvider\n _log!: Logger\n\n write(data: Uint8Array): void {\n this.emit('message', data)\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this._log = log\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): tl.RawDcOption | null {\n return this._currentDc\n }\n\n connect(dc: tl.RawDcOption, testMode: boolean): void {\n this._currentDc = dc\n this._state = TransportState.Ready\n this.emit('ready')\n this._log.debug('stubbing connection to %s:%d', dc.ipAddress, dc.port)\n\n this.params.onConnect?.(dc, testMode)\n }\n\n close(): void {\n this._currentDc = null\n this._state = TransportState.Idle\n this.emit('close')\n this._log.debug('stub connection closed')\n\n this.params.onClose?.()\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async send(data: Uint8Array): Promise<void> {\n this.params.onMessage?.(data)\n }\n}\n"]}
package/esm/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAM,MAAM,cAAc,CAAA;AAEpD,MAAM,UAAU,cAAc,CAAC,EAAU;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAA;IAE5C,QAAQ,IAAI,EAAE;QACV,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,SAAS;YACV,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KACrD;AACL,CAAC","sourcesContent":["import { parseMarkedPeerId, tl } from '@mtcute/core'\n\nexport function markedIdToPeer(id: number): tl.TypePeer {\n const [type, bareId] = parseMarkedPeerId(id)\n\n switch (type) {\n case 'user':\n return { _: 'peerUser', userId: bareId }\n case 'chat':\n return { _: 'peerChat', chatId: bareId }\n case 'channel':\n return { _: 'peerChannel', channelId: bareId }\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAM,MAAM,cAAc,CAAA;AAEpD,MAAM,UAAU,cAAc,CAAC,EAAU;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAA;IAE5C,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,SAAS;YACV,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;IACtD,CAAC;AACL,CAAC","sourcesContent":["import { parseMarkedPeerId, tl } from '@mtcute/core'\n\nexport function markedIdToPeer(id: number): tl.TypePeer {\n const [type, bareId] = parseMarkedPeerId(id)\n\n switch (type) {\n case 'user':\n return { _: 'peerUser', userId: bareId }\n case 'chat':\n return { _: 'peerChat', chatId: bareId }\n case 'channel':\n return { _: 'peerChannel', channelId: bareId }\n }\n}\n"]}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './index.js'
package/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from './index.js'
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "@mtcute/test",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "Test utilities for mtcute",
5
5
  "author": "alina sireneva <alina@tei.su>",
6
6
  "license": "MIT",
7
- "main": "cjs/index.js",
8
7
  "type": "module",
9
8
  "sideEffects": false,
10
9
  "scripts": {},
@@ -12,10 +11,10 @@
12
11
  "long": "5.2.3"
13
12
  },
14
13
  "peerDependencies": {
15
- "@mtcute/core": "^0.10.0",
16
- "@mtcute/node": "^0.10.0",
17
- "@mtcute/web": "^0.10.0",
18
- "@mtcute/tl": "^*",
14
+ "@mtcute/core": "^0.12.0",
15
+ "@mtcute/node": "^0.12.0",
16
+ "@mtcute/web": "^0.12.0",
17
+ "@mtcute/tl": "*",
19
18
  "vitest": "1.4.0"
20
19
  },
21
20
  "peerDependenciesMeta": {
@@ -27,14 +26,9 @@
27
26
  }
28
27
  },
29
28
  "browser": {
30
- "./esm/platform.js": "./esm/platform.web.js",
31
- "./cjs/platform.js": "./cjs/platform.web.js"
29
+ "./esm/platform.js": "./esm/platform.web.js"
32
30
  },
33
- "module": "esm/index.js",
34
31
  "exports": {
35
- ".": {
36
- "import": "./esm/index.js",
37
- "require": "./cjs/index.js"
38
- }
32
+ ".": "./index.js"
39
33
  }
40
34
  }
package/cjs/client.d.ts DELETED
@@ -1,54 +0,0 @@
1
- import { MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
2
- import { BaseTelegramClient, BaseTelegramClientOptions } from '@mtcute/core/client.js';
3
- import { InputResponder } from './types.js';
4
- interface MessageBox {
5
- pts: number;
6
- lastMessageId: number;
7
- }
8
- type InputPeerId = number | tl.TypePeer | false | undefined;
9
- export declare class StubTelegramClient extends BaseTelegramClient {
10
- constructor(params?: Partial<BaseTelegramClientOptions>);
11
- /**
12
- * Create a fake client that may not actually be used for API calls
13
- *
14
- * Useful for testing "offline" methods
15
- */
16
- static offline(): StubTelegramClient;
17
- /**
18
- * Create a fake "full" client (i.e. TelegramClient)
19
- *
20
- * Basically a proxy that returns an empty function for every unknown method
21
- */
22
- static full(): any;
23
- readonly _knownChats: Map<number, tl.TypeChat>;
24
- readonly _knownUsers: Map<number, tl.TypeUser>;
25
- _selfId: number;
26
- registerPeers(...peers: (tl.TypeUser | tl.TypeChat)[]): Promise<void>;
27
- getPeers(ids: InputPeerId[]): {
28
- users: tl.TypeUser[];
29
- chats: tl.TypeChat[];
30
- };
31
- private _onRawMessage?;
32
- onRawMessage(fn: (data: Uint8Array) => void): void;
33
- private _responders;
34
- addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void;
35
- respondWith<T extends tl.RpcMethod['_'], Fn extends (data: tl.FindByName<tl.RpcMethod, T>) => MaybePromise<tl.RpcCallReturn[T]>>(method: T, response: Fn): Fn;
36
- call<T extends tl.RpcMethod>(message: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
37
- private _fakeMessageBoxes;
38
- private _lastQts;
39
- private _lastDate;
40
- private _lastSeq;
41
- getMessageBox(chatId?: number): MessageBox;
42
- getNextMessageId(chatId?: number): number;
43
- getNextPts(chatId?: number, count?: number): number;
44
- getNextQts(): number;
45
- getNextDate(): number;
46
- createStubUpdates(params: {
47
- updates: tl.TypeUpdate[];
48
- peers?: (number | tl.TypePeer)[];
49
- seq?: number;
50
- seqCount?: number;
51
- }): tl.TypeUpdates;
52
- with(fn: () => MaybePromise<void>): Promise<void>;
53
- }
54
- export {};