@mtcute/test 0.7.0 → 0.8.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 (53) hide show
  1. package/cjs/client.d.ts +2 -1
  2. package/cjs/client.js +4 -1
  3. package/cjs/client.js.map +1 -1
  4. package/cjs/crypto.js +45 -41
  5. package/cjs/crypto.js.map +1 -1
  6. package/cjs/index.d.ts +1 -0
  7. package/cjs/index.js +1 -0
  8. package/cjs/index.js.map +1 -1
  9. package/cjs/platform.d.ts +3 -0
  10. package/cjs/platform.js +7 -0
  11. package/cjs/platform.js.map +1 -0
  12. package/cjs/platform.web.d.ts +3 -0
  13. package/cjs/platform.web.js +7 -0
  14. package/cjs/platform.web.js.map +1 -0
  15. package/esm/client.d.ts +2 -1
  16. package/esm/client.js +4 -1
  17. package/esm/client.js.map +1 -1
  18. package/esm/crypto.js +46 -42
  19. package/esm/crypto.js.map +1 -1
  20. package/esm/index.d.ts +1 -0
  21. package/esm/index.js +1 -0
  22. package/esm/index.js.map +1 -1
  23. package/esm/platform.d.ts +3 -0
  24. package/esm/platform.js +4 -0
  25. package/esm/platform.js.map +1 -0
  26. package/esm/platform.web.d.ts +3 -0
  27. package/esm/platform.web.js +4 -0
  28. package/esm/platform.web.js.map +1 -0
  29. package/package.json +16 -2
  30. package/cjs/client.test.d.ts +0 -1
  31. package/cjs/client.test.js +0 -32
  32. package/cjs/client.test.js.map +0 -1
  33. package/cjs/stub.test.d.ts +0 -1
  34. package/cjs/stub.test.js +0 -55
  35. package/cjs/stub.test.js.map +0 -1
  36. package/cjs/transport.test.d.ts +0 -1
  37. package/cjs/transport.test.js +0 -36
  38. package/cjs/transport.test.js.map +0 -1
  39. package/cjs/utils.test.d.ts +0 -1
  40. package/cjs/utils.test.js +0 -16
  41. package/cjs/utils.test.js.map +0 -1
  42. package/esm/client.test.d.ts +0 -1
  43. package/esm/client.test.js +0 -30
  44. package/esm/client.test.js.map +0 -1
  45. package/esm/stub.test.d.ts +0 -1
  46. package/esm/stub.test.js +0 -50
  47. package/esm/stub.test.js.map +0 -1
  48. package/esm/transport.test.d.ts +0 -1
  49. package/esm/transport.test.js +0 -34
  50. package/esm/transport.test.js.map +0 -1
  51. package/esm/utils.test.d.ts +0 -1
  52. package/esm/utils.test.js +0 -14
  53. package/esm/utils.test.js.map +0 -1
package/cjs/client.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { BaseTelegramClient, BaseTelegramClientOptions, MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
1
+ import { MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
2
+ import { BaseTelegramClient, BaseTelegramClientOptions } from '@mtcute/core/client.js';
2
3
  import { InputResponder } from './types.js';
3
4
  interface MessageBox {
4
5
  pts: number;
package/cjs/client.js CHANGED
@@ -2,10 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StubTelegramClient = void 0;
4
4
  const core_1 = require("@mtcute/core");
5
+ const client_js_1 = require("@mtcute/core/client.js");
6
+ const platform_js_1 = require("./platform.js");
5
7
  const storage_js_1 = require("./storage.js");
6
8
  const transport_js_1 = require("./transport.js");
7
9
  const utils_js_1 = require("./utils.js");
8
- class StubTelegramClient extends core_1.BaseTelegramClient {
10
+ class StubTelegramClient extends client_js_1.BaseTelegramClient {
9
11
  constructor(params) {
10
12
  const storage = new storage_js_1.StubMemoryTelegramStorage({
11
13
  hasKeys: true,
@@ -35,6 +37,7 @@ class StubTelegramClient extends core_1.BaseTelegramClient {
35
37
  });
36
38
  return transport;
37
39
  },
40
+ crypto: platform_js_1.defaultCryptoProvider,
38
41
  ...params,
39
42
  });
40
43
  // some fake peers handling //
package/cjs/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 {\n BaseTelegramClient,\n BaseTelegramClientOptions,\n MaybePromise,\n MustEqual,\n RpcCallOptions,\n tl,\n} from '@mtcute/core'\n\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 ...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/cjs/crypto.js CHANGED
@@ -3,7 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.u8HexDecode = exports.testCryptoProvider = exports.defaultTestCryptoProvider = exports.useFakeMathRandom = exports.withFakeRandom = void 0;
4
4
  const vitest_1 = require("vitest");
5
5
  const zlib_1 = require("zlib");
6
+ const platform_js_1 = require("@mtcute/core/platform.js");
6
7
  const utils_js_1 = require("@mtcute/core/utils.js");
8
+ const platform_js_2 = require("./platform.js");
7
9
  // some random 1024 bytes of entropy
8
10
  const DEFAULT_ENTROPY = `
9
11
  29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb269c489920ef99021b
@@ -24,7 +26,7 @@ da91539fcc7b03d2b8b1381bd6023fff20278344ad944d364ba684842db3901c346335f0d455eda4
24
26
  fa3de8e50aac96c1275591a1221c32a60a1513370a33a228e00894341b10cf44a6ae6ac250d17a364e956ab1a17b068df3fb2d5b5a672d8a409eeb8b6ca1ade6
25
27
  `.replace(/\s/g, '');
26
28
  function withFakeRandom(provider, source = DEFAULT_ENTROPY) {
27
- const sourceBytes = (0, utils_js_1.hexDecodeToBuffer)(source);
29
+ const sourceBytes = (0, platform_js_1.getPlatform)().hexDecode(source);
28
30
  let offset = 0;
29
31
  function getRandomValues(buf) {
30
32
  if (offset + buf.length > sourceBytes.length) {
@@ -38,11 +40,12 @@ function withFakeRandom(provider, source = DEFAULT_ENTROPY) {
38
40
  }
39
41
  exports.withFakeRandom = withFakeRandom;
40
42
  function useFakeMathRandom(source = DEFAULT_ENTROPY) {
43
+ const sourceBytes = (0, platform_js_1.getPlatform)().hexDecode(source);
44
+ const dv = (0, utils_js_1.dataViewFromBuffer)(sourceBytes);
41
45
  (0, vitest_1.beforeEach)(() => {
42
- const sourceBytes = (0, utils_js_1.hexDecodeToBuffer)(source);
43
46
  let offset = 0;
44
47
  vitest_1.vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {
45
- const ret = (0, utils_js_1.dataViewFromBuffer)(sourceBytes).getUint32(offset, true) / 0xffffffff;
48
+ const ret = dv.getUint32(offset, true) / 0xffffffff;
46
49
  offset += 4;
47
50
  return ret;
48
51
  });
@@ -53,13 +56,14 @@ function useFakeMathRandom(source = DEFAULT_ENTROPY) {
53
56
  }
54
57
  exports.useFakeMathRandom = useFakeMathRandom;
55
58
  async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY) {
56
- const prov = withFakeRandom((0, utils_js_1.defaultCryptoProviderFactory)(), source);
59
+ const prov = withFakeRandom(platform_js_2.defaultCryptoProvider, source);
57
60
  await prov.initialize?.();
58
61
  return prov;
59
62
  }
60
63
  exports.defaultTestCryptoProvider = defaultTestCryptoProvider;
61
64
  function testCryptoProvider(c) {
62
65
  (0, vitest_1.beforeAll)(() => c.initialize?.());
66
+ const p = (0, platform_js_1.getPlatform)();
63
67
  function gzipSyncWrap(data) {
64
68
  if (import.meta.env.TEST_ENV === 'browser') {
65
69
  // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason
@@ -77,53 +81,53 @@ function testCryptoProvider(c) {
77
81
  return (0, zlib_1.inflateSync)(data);
78
82
  }
79
83
  (0, vitest_1.it)('should calculate sha1', () => {
80
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(c.sha1((0, utils_js_1.utf8EncodeToBuffer)('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709');
81
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(c.sha1((0, utils_js_1.utf8EncodeToBuffer)('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d');
82
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(c.sha1((0, utils_js_1.hexDecodeToBuffer)('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850');
84
+ (0, vitest_1.expect)(p.hexEncode(c.sha1(p.utf8Encode('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709');
85
+ (0, vitest_1.expect)(p.hexEncode(c.sha1(p.utf8Encode('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d');
86
+ (0, vitest_1.expect)(p.hexEncode(c.sha1(p.hexDecode('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850');
83
87
  });
84
88
  (0, vitest_1.it)('should calculate sha256', () => {
85
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(c.sha256((0, utils_js_1.utf8EncodeToBuffer)('')))).to.eq('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
86
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(c.sha256((0, utils_js_1.utf8EncodeToBuffer)('hello')))).to.eq('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
87
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(c.sha256((0, utils_js_1.hexDecodeToBuffer)('aebb1f')))).to.eq('2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80');
89
+ (0, vitest_1.expect)(p.hexEncode(c.sha256(p.utf8Encode('')))).to.eq('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
90
+ (0, vitest_1.expect)(p.hexEncode(c.sha256(p.utf8Encode('hello')))).to.eq('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
91
+ (0, vitest_1.expect)(p.hexEncode(c.sha256(p.hexDecode('aebb1f')))).to.eq('2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80');
88
92
  });
89
93
  (0, vitest_1.it)('should calculate hmac-sha256', async () => {
90
- const key = (0, utils_js_1.hexDecodeToBuffer)('aaeeff');
91
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(await c.hmacSha256((0, utils_js_1.utf8EncodeToBuffer)(''), key))).to.eq('642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd');
92
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(await c.hmacSha256((0, utils_js_1.utf8EncodeToBuffer)('hello'), key))).to.eq('39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2');
93
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(await c.hmacSha256((0, utils_js_1.hexDecodeToBuffer)('aebb1f'), key))).to.eq('a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35');
94
+ const key = p.hexDecode('aaeeff');
95
+ (0, vitest_1.expect)(p.hexEncode(await c.hmacSha256(p.utf8Encode(''), key))).to.eq('642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd');
96
+ (0, vitest_1.expect)(p.hexEncode(await c.hmacSha256(p.utf8Encode('hello'), key))).to.eq('39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2');
97
+ (0, vitest_1.expect)(p.hexEncode(await c.hmacSha256(p.hexDecode('aebb1f'), key))).to.eq('a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35');
94
98
  });
95
99
  (0, vitest_1.it)('should derive pbkdf2 key', async () => {
96
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(await c.pbkdf2((0, utils_js_1.utf8EncodeToBuffer)('pbkdf2 test'), (0, utils_js_1.utf8EncodeToBuffer)('some salt'), 10))).to.eq('e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1');
100
+ (0, vitest_1.expect)(p.hexEncode(await c.pbkdf2(p.utf8Encode('pbkdf2 test'), p.utf8Encode('some salt'), 10))).to.eq('e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1');
97
101
  });
98
102
  (0, vitest_1.it)('should encrypt and decrypt aes-ctr', () => {
99
- let aes = c.createAesCtr((0, utils_js_1.hexDecodeToBuffer)('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), (0, utils_js_1.hexDecodeToBuffer)('0182de2bd789c295c3c6c875c5e9e190'), true);
100
- const data = (0, utils_js_1.hexDecodeToBuffer)('7baae571e4c2f4cfadb1931d5923aca7');
101
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f');
102
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process(data))).eq('3917147082672516b3177150129bc579');
103
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725');
104
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process(data))).eq('56d085217771398ac13583de4d677dd8');
105
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92');
106
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4');
103
+ let aes = c.createAesCtr(p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'), true);
104
+ const data = p.hexDecode('7baae571e4c2f4cfadb1931d5923aca7');
105
+ (0, vitest_1.expect)(p.hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f');
106
+ (0, vitest_1.expect)(p.hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579');
107
+ (0, vitest_1.expect)(p.hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725');
108
+ (0, vitest_1.expect)(p.hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8');
109
+ (0, vitest_1.expect)(p.hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92');
110
+ (0, vitest_1.expect)(p.hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4');
107
111
  aes.close?.();
108
- aes = c.createAesCtr((0, utils_js_1.hexDecodeToBuffer)('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), (0, utils_js_1.hexDecodeToBuffer)('0182de2bd789c295c3c6c875c5e9e190'), false);
109
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process((0, utils_js_1.hexDecodeToBuffer)('df5647dbb70bc393f2fb05b72f42286f')))).eq((0, utils_js_1.hexEncode)(data));
110
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process((0, utils_js_1.hexDecodeToBuffer)('3917147082672516b3177150129bc579')))).eq((0, utils_js_1.hexEncode)(data));
111
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process((0, utils_js_1.hexDecodeToBuffer)('2a7a9089270a5de45d5e3dd399cac725')))).eq((0, utils_js_1.hexEncode)(data));
112
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process((0, utils_js_1.hexDecodeToBuffer)('56d085217771398ac13583de4d677dd8')))).eq((0, utils_js_1.hexEncode)(data));
113
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process((0, utils_js_1.hexDecodeToBuffer)('cc639b488126cf36e79c4515e8012b92')))).eq((0, utils_js_1.hexEncode)(data));
114
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.process((0, utils_js_1.hexDecodeToBuffer)('01384d100646cd562cc5586ec3f8f8c4')))).eq((0, utils_js_1.hexEncode)(data));
112
+ aes = c.createAesCtr(p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'), false);
113
+ (0, vitest_1.expect)(p.hexEncode(aes.process(p.hexDecode('df5647dbb70bc393f2fb05b72f42286f')))).eq(p.hexEncode(data));
114
+ (0, vitest_1.expect)(p.hexEncode(aes.process(p.hexDecode('3917147082672516b3177150129bc579')))).eq(p.hexEncode(data));
115
+ (0, vitest_1.expect)(p.hexEncode(aes.process(p.hexDecode('2a7a9089270a5de45d5e3dd399cac725')))).eq(p.hexEncode(data));
116
+ (0, vitest_1.expect)(p.hexEncode(aes.process(p.hexDecode('56d085217771398ac13583de4d677dd8')))).eq(p.hexEncode(data));
117
+ (0, vitest_1.expect)(p.hexEncode(aes.process(p.hexDecode('cc639b488126cf36e79c4515e8012b92')))).eq(p.hexEncode(data));
118
+ (0, vitest_1.expect)(p.hexEncode(aes.process(p.hexDecode('01384d100646cd562cc5586ec3f8f8c4')))).eq(p.hexEncode(data));
115
119
  aes.close?.();
116
120
  });
117
121
  (0, vitest_1.it)('should encrypt and decrypt aes-ige', () => {
118
- const aes = c.createAesIge((0, utils_js_1.hexDecodeToBuffer)('5468697320697320616E20696D706C655468697320697320616E20696D706C65'), (0, utils_js_1.hexDecodeToBuffer)('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'));
119
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.encrypt((0, utils_js_1.hexDecodeToBuffer)('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')))).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69');
120
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(aes.decrypt((0, utils_js_1.hexDecodeToBuffer)('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')))).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b');
122
+ const aes = c.createAesIge(p.hexDecode('5468697320697320616E20696D706C655468697320697320616E20696D706C65'), p.hexDecode('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'));
123
+ (0, vitest_1.expect)(p.hexEncode(aes.encrypt(p.hexDecode('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')))).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69');
124
+ (0, vitest_1.expect)(p.hexEncode(aes.decrypt(p.hexDecode('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')))).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b');
121
125
  });
122
126
  (0, vitest_1.it)('should decompose PQ to prime factors P and Q', async () => {
123
- const testFactorization = async (pq, p, q) => {
124
- const [p1, q1] = await c.factorizePQ((0, utils_js_1.hexDecodeToBuffer)(pq));
125
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(p1)).eq(p.toLowerCase());
126
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(q1)).eq(q.toLowerCase());
127
+ const testFactorization = async (pq, p_, q) => {
128
+ const [p1, q1] = await c.factorizePQ(p.hexDecode(pq));
129
+ (0, vitest_1.expect)(p.hexEncode(p1)).eq(p_.toLowerCase());
130
+ (0, vitest_1.expect)(p.hexEncode(q1)).eq(q.toLowerCase());
127
131
  };
128
132
  // from samples at https://core.telegram.org/mtproto/samples-auth_key
129
133
  await testFactorization('17ED48941A08F981', '494C553B', '53911073');
@@ -138,13 +142,13 @@ function testCryptoProvider(c) {
138
142
  (0, vitest_1.expect)(compressed).not.toBeNull();
139
143
  const decompressed = inflateSyncWrap(compressed);
140
144
  (0, vitest_1.expect)(compressed.length).toBeLessThan(data.length);
141
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(decompressed)).toEqual((0, utils_js_1.hexEncode)(data));
145
+ (0, vitest_1.expect)(p.hexEncode(decompressed)).toEqual(p.hexEncode(data));
142
146
  });
143
147
  (0, vitest_1.it)('should correctly gunzip', () => {
144
148
  const data = new Uint8Array(1000).fill(0x42);
145
149
  const compressed = gzipSyncWrap(data);
146
150
  const decompressed = c.gunzip(compressed);
147
- (0, vitest_1.expect)((0, utils_js_1.hexEncode)(decompressed)).toEqual((0, utils_js_1.hexEncode)(data));
151
+ (0, vitest_1.expect)(p.hexEncode(decompressed)).toEqual(p.hexEncode(data));
148
152
  });
149
153
  (0, vitest_1.describe)('randomBytes', () => {
150
154
  (0, vitest_1.it)('should return exactly N bytes', () => {
@@ -165,9 +169,9 @@ function testCryptoProvider(c) {
165
169
  }
166
170
  exports.testCryptoProvider = testCryptoProvider;
167
171
  function u8HexDecode(hex) {
168
- const buf = (0, utils_js_1.hexDecodeToBuffer)(hex);
172
+ const buf = (0, platform_js_1.getPlatform)().hexDecode(hex);
169
173
  // eslint-disable-next-line no-restricted-globals
170
- if (import.meta.env.TEST_ENV === 'node' && Buffer.isBuffer(buf)) {
174
+ if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {
171
175
  return new Uint8Array(buf);
172
176
  }
173
177
  return buf;
package/cjs/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 {\n dataViewFromBuffer,\n defaultCryptoProviderFactory,\n hexDecodeToBuffer,\n hexEncode,\n ICryptoProvider,\n utf8EncodeToBuffer,\n} from '@mtcute/core/utils.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 = hexDecodeToBuffer(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 provider.randomFill = getRandomValues\n\n return provider\n}\n\nexport function useFakeMathRandom(source = DEFAULT_ENTROPY): void {\n beforeEach(() => {\n const sourceBytes = hexDecodeToBuffer(source)\n let offset = 0\n\n vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {\n const ret = dataViewFromBuffer(sourceBytes).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(defaultCryptoProviderFactory(), source)\n await prov.initialize?.()\n\n return prov\n}\n\nexport function testCryptoProvider(c: ICryptoProvider): void {\n beforeAll(() => c.initialize?.())\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(hexEncode(c.sha1(utf8EncodeToBuffer('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709')\n expect(hexEncode(c.sha1(utf8EncodeToBuffer('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')\n expect(hexEncode(c.sha1(hexDecodeToBuffer('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850')\n })\n\n it('should calculate sha256', () => {\n expect(hexEncode(c.sha256(utf8EncodeToBuffer('')))).to.eq(\n 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',\n )\n expect(hexEncode(c.sha256(utf8EncodeToBuffer('hello')))).to.eq(\n '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824',\n )\n expect(hexEncode(c.sha256(hexDecodeToBuffer('aebb1f')))).to.eq(\n '2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80',\n )\n })\n\n it('should calculate hmac-sha256', async () => {\n const key = hexDecodeToBuffer('aaeeff')\n\n expect(hexEncode(await c.hmacSha256(utf8EncodeToBuffer(''), key))).to.eq(\n '642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd',\n )\n expect(hexEncode(await c.hmacSha256(utf8EncodeToBuffer('hello'), key))).to.eq(\n '39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2',\n )\n expect(hexEncode(await c.hmacSha256(hexDecodeToBuffer('aebb1f'), key))).to.eq(\n 'a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35',\n )\n })\n\n it('should derive pbkdf2 key', async () => {\n expect(hexEncode(await c.pbkdf2(utf8EncodeToBuffer('pbkdf2 test'), utf8EncodeToBuffer('some salt'), 10))).to.eq(\n 'e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1',\n )\n })\n\n it('should encrypt and decrypt aes-ctr', () => {\n let aes = c.createAesCtr(\n hexDecodeToBuffer('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n hexDecodeToBuffer('0182de2bd789c295c3c6c875c5e9e190'),\n true,\n )\n\n const data = hexDecodeToBuffer('7baae571e4c2f4cfadb1931d5923aca7')\n expect(hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f')\n expect(hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579')\n expect(hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725')\n expect(hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8')\n expect(hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92')\n expect(hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4')\n\n aes.close?.()\n aes = c.createAesCtr(\n hexDecodeToBuffer('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n hexDecodeToBuffer('0182de2bd789c295c3c6c875c5e9e190'),\n false,\n )\n\n expect(hexEncode(aes.process(hexDecodeToBuffer('df5647dbb70bc393f2fb05b72f42286f')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('3917147082672516b3177150129bc579')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('2a7a9089270a5de45d5e3dd399cac725')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('56d085217771398ac13583de4d677dd8')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('cc639b488126cf36e79c4515e8012b92')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('01384d100646cd562cc5586ec3f8f8c4')))).eq(hexEncode(data))\n\n aes.close?.()\n })\n\n it('should encrypt and decrypt aes-ige', () => {\n const aes = c.createAesIge(\n hexDecodeToBuffer('5468697320697320616E20696D706C655468697320697320616E20696D706C65'),\n hexDecodeToBuffer('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'),\n )\n expect(\n hexEncode(\n aes.encrypt(hexDecodeToBuffer('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')),\n ),\n ).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')\n expect(\n hexEncode(\n aes.decrypt(hexDecodeToBuffer('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')),\n ),\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(hexDecodeToBuffer(pq))\n expect(hexEncode(p1)).eq(p.toLowerCase())\n expect(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(hexEncode(decompressed)).toEqual(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(hexEncode(decompressed)).toEqual(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 = hexDecodeToBuffer(hex)\n\n // eslint-disable-next-line no-restricted-globals\n if (import.meta.env.TEST_ENV === 'node' && 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":";;;AAAA,mCAAmF;AACnF,+BAA4C;AAE5C,0DAAsD;AACtD,oDAG8B;AAE9B,+CAAqD;AAErD,oCAAoC;AACpC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;CAiBvB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAEpB,SAAgB,cAAc,CAAC,QAAyB,EAAE,MAAM,GAAG,eAAe;IAC9E,MAAM,WAAW,GAAG,IAAA,yBAAW,GAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACnD,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,SAAS,eAAe,CAAC,GAAe;QACpC,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE;YAC1C,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;SACxC;QAED,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1D,MAAM,IAAI,GAAG,CAAC,MAAM,CAAA;IACxB,CAAC;IAED,QAAQ,CAAC,UAAU,GAAG,eAAe,CAAA;IAErC,OAAO,QAAQ,CAAA;AACnB,CAAC;AAhBD,wCAgBC;AAED,SAAgB,iBAAiB,CAAC,MAAM,GAAG,eAAe;IACtD,MAAM,WAAW,GAAG,IAAA,yBAAW,GAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACnD,MAAM,EAAE,GAAG,IAAA,6BAAkB,EAAC,WAAW,CAAC,CAAA;IAE1C,IAAA,mBAAU,EAAC,GAAG,EAAE;QACZ,IAAI,MAAM,GAAG,CAAC,CAAA;QAEd,WAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACxD,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,UAAU,CAAA;YACnD,MAAM,IAAI,CAAC,CAAA;YAEX,OAAO,GAAG,CAAA;QACd,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IACF,IAAA,kBAAS,EAAC,GAAG,EAAE;QACX,WAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IACrD,CAAC,CAAC,CAAA;AACN,CAAC;AAjBD,8CAiBC;AAEM,KAAK,UAAU,yBAAyB,CAAC,MAAM,GAAG,eAAe;IACpE,MAAM,IAAI,GAAG,cAAc,CAAC,mCAAqB,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,CAAA;IAEzB,OAAO,IAAI,CAAA;AACf,CAAC;AALD,8DAKC;AAED,SAAgB,kBAAkB,CAAC,CAAkB;IACjD,IAAA,kBAAS,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAEjC,MAAM,CAAC,GAAG,IAAA,yBAAW,GAAE,CAAA;IAEvB,SAAS,YAAY,CAAC,IAAgB;QAClC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE;YACxC,0FAA0F;YAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;YAErB,OAAO,IAAI,UAAU,CAAC,IAAA,eAAQ,EAAC,IAAI,CAAC,CAAC,CAAA;SACxC;QAED,OAAO,IAAA,eAAQ,EAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,SAAS,eAAe,CAAC,IAAgB;QACrC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE;YACxC,0FAA0F;YAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;YAErB,OAAO,IAAI,UAAU,CAAC,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC,CAAA;SAC3C;QAED,OAAO,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC7B,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,0CAA0C,CAAC,CAAA;QAC/F,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,0CAA0C,CAAC,CAAA;QACpG,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,0CAA0C,CAAC,CAAA;IACxG,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACjD,kEAAkE,CACrE,CAAA;QACD,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACtD,kEAAkE,CACrE,CAAA;QACD,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACtD,kEAAkE,CACrE,CAAA;IACL,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAEjC,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAChE,kEAAkE,CACrE,CAAA;QACD,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACrE,kEAAkE,CACrE,CAAA;QACD,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACrE,kEAAkE,CACrE,CAAA;IACL,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACtC,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACjG,kIAAkI,CACrI,CAAA;IACL,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,IAAI,GAAG,GAAG,CAAC,CAAC,YAAY,CACpB,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,EAC/E,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,EAC/C,IAAI,CACP,CAAA;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;QAC5D,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAA;QAC7E,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAA;QAC7E,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAA;QAC7E,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAA;QAC7E,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAA;QAC7E,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAA;QAE7E,GAAG,CAAC,KAAK,EAAE,EAAE,CAAA;QACb,GAAG,GAAG,CAAC,CAAC,YAAY,CAChB,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,EAC/E,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,EAC/C,KAAK,CACR,CAAA;QAED,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACvG,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACvG,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACvG,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACvG,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACvG,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QAEvG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CACtB,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,EAC/E,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAClF,CAAA;QACD,IAAA,eAAM,EACF,CAAC,CAAC,SAAS,CACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC,CAC/F,CACJ,CAAC,EAAE,CAAC,EAAE,CAAC,kEAAkE,CAAC,CAAA;QAC3E,IAAA,eAAM,EACF,CAAC,CAAC,SAAS,CACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC,CAC/F,CACJ,CAAC,EAAE,CAAC,EAAE,CAAC,kEAAkE,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EACE,8CAA8C,EAC9C,KAAK,IAAI,EAAE;QACP,MAAM,iBAAiB,GAAG,KAAK,EAAE,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,EAAE;YAClE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;YACrD,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YAC5C,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;QAC/C,CAAC,CAAA;QAED,qEAAqE;QACrE,MAAM,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACnE,iBAAiB;QACjB,MAAM,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;IACvE,CAAC;IACD,0EAA0E;IAC1E,EAAE,OAAO,EAAE,KAAK,EAAE,CACrB,CAAA;IAED,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE5C,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAEpC,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAEjC,MAAM,YAAY,GAAG,eAAe,CAAC,UAAW,CAAC,CAAA;QAEjD,IAAA,eAAM,EAAC,UAAW,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE5C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAEzC,IAAA,eAAM,EAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;QACzB,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;YACrC,IAAA,eAAM,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,IAAA,eAAM,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,IAAA,eAAM,EAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACvC,IAAA,eAAM,EAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;YACnC,IAAA,eAAM,EAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;YAC7B,MAAM,GAAG,GAAG,WAAE,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;YACrC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;YAEhB,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAA;QAClC,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AA7KD,gDA6KC;AAED,SAAgB,WAAW,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,IAAA,yBAAW,GAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAExC,iDAAiD;IACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACrG,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;KAC7B;IAED,OAAO,GAAG,CAAA;AACd,CAAC;AATD,kCASC","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 {\n dataViewFromBuffer,\n ICryptoProvider,\n} 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 provider.randomFill = getRandomValues\n\n return provider\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(\n aes.encrypt(p.hexDecode('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')),\n ),\n ).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')\n expect(\n p.hexEncode(\n aes.decrypt(p.hexDecode('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')),\n ),\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/cjs/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './client.js';
2
2
  export * from './crypto.js';
3
+ export * from './platform.js';
3
4
  export * from './storage.js';
4
5
  export * from './storage/index.js';
5
6
  export * from './stub.js';
package/cjs/index.js CHANGED
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./client.js"), exports);
18
18
  __exportStar(require("./crypto.js"), exports);
19
+ __exportStar(require("./platform.js"), exports);
19
20
  __exportStar(require("./storage.js"), exports);
20
21
  __exportStar(require("./storage/index.js"), exports);
21
22
  __exportStar(require("./stub.js"), exports);
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,8CAA2B;AAC3B,+CAA4B;AAC5B,qDAAkC;AAClC,4CAAyB;AACzB,iDAA8B;AAC9B,6CAA0B","sourcesContent":["export * from './client.js'\nexport * from './crypto.js'\nexport * from './storage.js'\nexport * from './storage/index.js'\nexport * from './stub.js'\nexport * from './transport.js'\nexport * from './types.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,8CAA2B;AAC3B,gDAA6B;AAC7B,+CAA4B;AAC5B,qDAAkC;AAClC,4CAAyB;AACzB,iDAA8B;AAC9B,6CAA0B","sourcesContent":["export * from './client.js'\nexport * from './crypto.js'\nexport * from './platform.js'\nexport * from './storage.js'\nexport * from './storage/index.js'\nexport * from './stub.js'\nexport * from './transport.js'\nexport * from './types.js'\n"]}
@@ -0,0 +1,3 @@
1
+ import { NodeCryptoProvider, NodePlatform } from '@mtcute/node';
2
+ export declare const defaultPlatform: NodePlatform;
3
+ export declare const defaultCryptoProvider: NodeCryptoProvider;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultCryptoProvider = exports.defaultPlatform = void 0;
4
+ const node_1 = require("@mtcute/node");
5
+ exports.defaultPlatform = new node_1.NodePlatform();
6
+ exports.defaultCryptoProvider = new node_1.NodeCryptoProvider();
7
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":";;;AAAA,uCAA+D;AAElD,QAAA,eAAe,GAAG,IAAI,mBAAY,EAAE,CAAA;AACpC,QAAA,qBAAqB,GAAG,IAAI,yBAAkB,EAAE,CAAA","sourcesContent":["import { NodeCryptoProvider, NodePlatform } from '@mtcute/node'\n\nexport const defaultPlatform = new NodePlatform()\nexport const defaultCryptoProvider = new NodeCryptoProvider()\n"]}
@@ -0,0 +1,3 @@
1
+ import { WebCryptoProvider, WebPlatform } from '@mtcute/web';
2
+ export declare const defaultPlatform: WebPlatform;
3
+ export declare const defaultCryptoProvider: WebCryptoProvider;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultCryptoProvider = exports.defaultPlatform = void 0;
4
+ const web_1 = require("@mtcute/web");
5
+ exports.defaultPlatform = new web_1.WebPlatform();
6
+ exports.defaultCryptoProvider = new web_1.WebCryptoProvider();
7
+ //# sourceMappingURL=platform.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.web.js","sourceRoot":"","sources":["../../src/platform.web.ts"],"names":[],"mappings":";;;AAAA,qCAA4D;AAE/C,QAAA,eAAe,GAAG,IAAI,iBAAW,EAAE,CAAA;AACnC,QAAA,qBAAqB,GAAG,IAAI,uBAAiB,EAAE,CAAA","sourcesContent":["import { WebCryptoProvider, WebPlatform } from '@mtcute/web'\n\nexport const defaultPlatform = new WebPlatform()\nexport const defaultCryptoProvider = new WebCryptoProvider()\n"]}
package/esm/client.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { BaseTelegramClient, BaseTelegramClientOptions, MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
1
+ import { MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
2
+ import { BaseTelegramClient, BaseTelegramClientOptions } from '@mtcute/core/client.js';
2
3
  import { InputResponder } from './types.js';
3
4
  interface MessageBox {
4
5
  pts: number;
package/esm/client.js CHANGED
@@ -1,4 +1,6 @@
1
- import { BaseTelegramClient, tl, } from '@mtcute/core';
1
+ import { tl } from '@mtcute/core';
2
+ import { BaseTelegramClient } from '@mtcute/core/client.js';
3
+ import { defaultCryptoProvider } from './platform.js';
2
4
  import { StubMemoryTelegramStorage } from './storage.js';
3
5
  import { StubTelegramTransport } from './transport.js';
4
6
  import { markedIdToPeer } from './utils.js';
@@ -32,6 +34,7 @@ export class StubTelegramClient extends BaseTelegramClient {
32
34
  });
33
35
  return transport;
34
36
  },
37
+ crypto: defaultCryptoProvider,
35
38
  ...params,
36
39
  });
37
40
  // some fake peers handling //
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 {\n BaseTelegramClient,\n BaseTelegramClientOptions,\n MaybePromise,\n MustEqual,\n RpcCallOptions,\n tl,\n} from '@mtcute/core'\n\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 ...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"]}