@mtcute/test 0.6.0 → 0.7.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.
- package/cjs/client.d.ts +3 -4
- package/cjs/client.js +5 -8
- package/cjs/client.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/storage/auth-keys.d.ts +3 -0
- package/cjs/storage/auth-keys.js +95 -0
- package/cjs/storage/auth-keys.js.map +1 -0
- package/cjs/storage/index.d.ts +4 -0
- package/cjs/storage/index.js +21 -0
- package/cjs/storage/index.js.map +1 -0
- package/cjs/storage/key-value.d.ts +3 -0
- package/cjs/storage/key-value.js +41 -0
- package/cjs/storage/key-value.js.map +1 -0
- package/cjs/storage/peers.d.ts +3 -0
- package/cjs/storage/peers.js +75 -0
- package/cjs/storage/peers.js.map +1 -0
- package/cjs/storage/ref-messages.d.ts +3 -0
- package/cjs/storage/ref-messages.js +69 -0
- package/cjs/storage/ref-messages.js.map +1 -0
- package/cjs/storage.d.ts +2 -16
- package/cjs/storage.js +18 -29
- package/cjs/storage.js.map +1 -1
- package/cjs/transport.test.js +1 -2
- package/cjs/transport.test.js.map +1 -1
- package/cjs/utils.js +1 -2
- package/cjs/utils.js.map +1 -1
- package/esm/client.d.ts +3 -4
- package/esm/client.js +6 -9
- package/esm/client.js.map +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/esm/storage/auth-keys.d.ts +3 -0
- package/esm/storage/auth-keys.js +90 -0
- package/esm/storage/auth-keys.js.map +1 -0
- package/esm/storage/index.d.ts +4 -0
- package/esm/storage/index.js +5 -0
- package/esm/storage/index.js.map +1 -0
- package/esm/storage/key-value.d.ts +3 -0
- package/esm/storage/key-value.js +36 -0
- package/esm/storage/key-value.js.map +1 -0
- package/esm/storage/peers.d.ts +3 -0
- package/esm/storage/peers.js +70 -0
- package/esm/storage/peers.js.map +1 -0
- package/esm/storage/ref-messages.d.ts +3 -0
- package/esm/storage/ref-messages.js +64 -0
- package/esm/storage/ref-messages.js.map +1 -0
- package/esm/storage.d.ts +2 -16
- package/esm/storage.js +18 -29
- package/esm/storage.js.map +1 -1
- package/esm/transport.test.js +1 -2
- package/esm/transport.test.js.map +1 -1
- package/esm/utils.js +2 -3
- package/esm/utils.js.map +1 -1
- package/package.json +2 -2
- package/cjs/storage-test.d.ts +0 -24
- package/cjs/storage-test.js +0 -365
- package/cjs/storage-test.js.map +0 -1
- package/cjs/storage.test.d.ts +0 -1
- package/cjs/storage.test.js +0 -43
- package/cjs/storage.test.js.map +0 -1
- package/esm/storage-test.d.ts +0 -24
- package/esm/storage-test.js +0 -357
- package/esm/storage-test.js.map +0 -1
- package/esm/storage.test.d.ts +0 -1
- package/esm/storage.test.js +0 -41
- package/esm/storage.test.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
export function fakeRefMessagesRepository() {
|
|
3
|
+
return {
|
|
4
|
+
store: vi.fn(),
|
|
5
|
+
getByPeer: vi.fn(),
|
|
6
|
+
delete: vi.fn(),
|
|
7
|
+
deleteByPeer: vi.fn(),
|
|
8
|
+
deleteAll: vi.fn(),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function testRefMessagesRepository(repo, driver) {
|
|
12
|
+
describe('IReferenceMessagesRepository', () => {
|
|
13
|
+
afterEach(() => repo.deleteAll());
|
|
14
|
+
it('should be empty by default', async () => {
|
|
15
|
+
expect(await repo.getByPeer(1)).toEqual(null);
|
|
16
|
+
});
|
|
17
|
+
it('should store and retrieve reference messages', async () => {
|
|
18
|
+
await repo.store(1, 2, 3);
|
|
19
|
+
await repo.store(1, 4, 5);
|
|
20
|
+
await repo.store(2, 6, 7);
|
|
21
|
+
await driver.save?.();
|
|
22
|
+
expect(await repo.getByPeer(1)).deep.oneOf([
|
|
23
|
+
[2, 3],
|
|
24
|
+
[4, 5],
|
|
25
|
+
]);
|
|
26
|
+
expect(await repo.getByPeer(2)).toEqual([6, 7]);
|
|
27
|
+
expect(await repo.getByPeer(3)).toEqual(null);
|
|
28
|
+
expect(await repo.getByPeer(4)).toEqual(null);
|
|
29
|
+
expect(await repo.getByPeer(5)).toEqual(null);
|
|
30
|
+
expect(await repo.getByPeer(6)).toEqual(null);
|
|
31
|
+
expect(await repo.getByPeer(7)).toEqual(null);
|
|
32
|
+
});
|
|
33
|
+
it('should delete reference messages', async () => {
|
|
34
|
+
await repo.store(1, 2, 3);
|
|
35
|
+
await repo.store(1, 4, 5);
|
|
36
|
+
await repo.store(2, 6, 7);
|
|
37
|
+
await driver.save?.();
|
|
38
|
+
await repo.delete(4, [5]);
|
|
39
|
+
await driver.save?.();
|
|
40
|
+
expect(await repo.getByPeer(1)).toEqual([2, 3]);
|
|
41
|
+
await repo.delete(2, [2, 3, 4]);
|
|
42
|
+
await driver.save?.();
|
|
43
|
+
expect(await repo.getByPeer(1)).toEqual(null);
|
|
44
|
+
});
|
|
45
|
+
it('should delete all reference messages for a peer', async () => {
|
|
46
|
+
await repo.store(1, 2, 3);
|
|
47
|
+
await repo.store(1, 4, 5);
|
|
48
|
+
await repo.store(1, 6, 7);
|
|
49
|
+
await repo.store(2, 20, 30);
|
|
50
|
+
await repo.store(2, 40, 50);
|
|
51
|
+
await repo.store(2, 60, 70);
|
|
52
|
+
await driver.save?.();
|
|
53
|
+
await repo.deleteByPeer(1);
|
|
54
|
+
await driver.save?.();
|
|
55
|
+
expect(await repo.getByPeer(1)).toEqual(null);
|
|
56
|
+
expect(await repo.getByPeer(2)).deep.oneOf([
|
|
57
|
+
[20, 30],
|
|
58
|
+
[40, 50],
|
|
59
|
+
[60, 70],
|
|
60
|
+
]);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=ref-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-messages.js","sourceRoot":"","sources":["../../../src/storage/ref-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest'\n\nimport { IReferenceMessagesRepository, IStorageDriver } from '@mtcute/core'\n\nexport function fakeRefMessagesRepository(): IReferenceMessagesRepository {\n return {\n store: vi.fn(),\n getByPeer: vi.fn(),\n delete: vi.fn(),\n deleteByPeer: vi.fn(),\n deleteAll: vi.fn(),\n }\n}\n\nexport function testRefMessagesRepository(repo: IReferenceMessagesRepository, driver: IStorageDriver) {\n describe('IReferenceMessagesRepository', () => {\n afterEach(() => repo.deleteAll())\n\n it('should be empty by default', async () => {\n expect(await repo.getByPeer(1)).toEqual(null)\n })\n\n it('should store and retrieve reference messages', async () => {\n await repo.store(1, 2, 3)\n await repo.store(1, 4, 5)\n await repo.store(2, 6, 7)\n await driver.save?.()\n\n expect(await repo.getByPeer(1)).deep.oneOf([\n [2, 3],\n [4, 5],\n ])\n expect(await repo.getByPeer(2)).toEqual([6, 7])\n expect(await repo.getByPeer(3)).toEqual(null)\n expect(await repo.getByPeer(4)).toEqual(null)\n expect(await repo.getByPeer(5)).toEqual(null)\n expect(await repo.getByPeer(6)).toEqual(null)\n expect(await repo.getByPeer(7)).toEqual(null)\n })\n\n it('should delete reference messages', async () => {\n await repo.store(1, 2, 3)\n await repo.store(1, 4, 5)\n await repo.store(2, 6, 7)\n await driver.save?.()\n\n await repo.delete(4, [5])\n await driver.save?.()\n expect(await repo.getByPeer(1)).toEqual([2, 3])\n\n await repo.delete(2, [2, 3, 4])\n await driver.save?.()\n expect(await repo.getByPeer(1)).toEqual(null)\n })\n\n it('should delete all reference messages for a peer', async () => {\n await repo.store(1, 2, 3)\n await repo.store(1, 4, 5)\n await repo.store(1, 6, 7)\n\n await repo.store(2, 20, 30)\n await repo.store(2, 40, 50)\n await repo.store(2, 60, 70)\n await driver.save?.()\n\n await repo.deleteByPeer(1)\n await driver.save?.()\n expect(await repo.getByPeer(1)).toEqual(null)\n expect(await repo.getByPeer(2)).deep.oneOf([\n [20, 30],\n [40, 50],\n [60, 70],\n ])\n })\n })\n}\n"]}
|
package/esm/storage.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { MemoryStorage } from '@mtcute/core/storage/memory.js';
|
|
1
|
+
import { MemoryStorage } from '@mtcute/core';
|
|
3
2
|
import { ICryptoProvider } from '@mtcute/core/utils.js';
|
|
4
|
-
export declare class StubMemoryTelegramStorage extends MemoryStorage
|
|
3
|
+
export declare class StubMemoryTelegramStorage extends MemoryStorage {
|
|
5
4
|
readonly params: {
|
|
6
5
|
/**
|
|
7
6
|
* IDs of the DCs for which the storage should have auth keys,
|
|
@@ -17,10 +16,6 @@ export declare class StubMemoryTelegramStorage extends MemoryStorage implements
|
|
|
17
16
|
* @default true
|
|
18
17
|
*/
|
|
19
18
|
hasTempKeys?: boolean | number[];
|
|
20
|
-
onLoad?: () => void;
|
|
21
|
-
onSave?: () => void;
|
|
22
|
-
onDestroy?: () => void;
|
|
23
|
-
onReset?: () => void;
|
|
24
19
|
};
|
|
25
20
|
constructor(params?: {
|
|
26
21
|
/**
|
|
@@ -37,15 +32,6 @@ export declare class StubMemoryTelegramStorage extends MemoryStorage implements
|
|
|
37
32
|
* @default true
|
|
38
33
|
*/
|
|
39
34
|
hasTempKeys?: boolean | number[];
|
|
40
|
-
onLoad?: () => void;
|
|
41
|
-
onSave?: () => void;
|
|
42
|
-
onDestroy?: () => void;
|
|
43
|
-
onReset?: () => void;
|
|
44
35
|
});
|
|
45
|
-
getAuthKeyFor(dcId: number, tempIndex?: number | undefined): Uint8Array | null;
|
|
46
|
-
load(): void;
|
|
47
|
-
save(): void;
|
|
48
|
-
destroy(): void;
|
|
49
|
-
reset(withKeys?: boolean): void;
|
|
50
36
|
decryptOutgoingMessage(crypto: ICryptoProvider, data: Uint8Array, dcId: number, tempIndex?: number | undefined): Uint8Array;
|
|
51
37
|
}
|
package/esm/storage.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { MtArgumentError } from '@mtcute/core';
|
|
2
|
-
import { MemoryStorage } from '@mtcute/core/storage/memory.js';
|
|
1
|
+
import { MemoryStorage, MtArgumentError } from '@mtcute/core';
|
|
3
2
|
import { createAesIgeForMessage } from '@mtcute/core/utils.js';
|
|
4
3
|
export class StubMemoryTelegramStorage extends MemoryStorage {
|
|
5
4
|
constructor(params = {
|
|
@@ -8,37 +7,27 @@ export class StubMemoryTelegramStorage extends MemoryStorage {
|
|
|
8
7
|
}) {
|
|
9
8
|
super();
|
|
10
9
|
this.params = params;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
const _origGet = this.authKeys.get;
|
|
11
|
+
this.authKeys.get = (dcId) => {
|
|
12
|
+
if (this.params.hasKeys) {
|
|
13
|
+
if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {
|
|
14
|
+
return new Uint8Array(256);
|
|
15
|
+
}
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
return _origGet.call(this.authKeys, dcId);
|
|
18
|
+
};
|
|
19
|
+
const _origGetTemp = this.authKeys.getTemp;
|
|
20
|
+
this.authKeys.getTemp = (dcId, idx, now) => {
|
|
21
|
+
if (this.params.hasTempKeys) {
|
|
22
|
+
if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {
|
|
23
|
+
return new Uint8Array(256);
|
|
24
|
+
}
|
|
21
25
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
load() {
|
|
26
|
-
this.params.onLoad?.();
|
|
27
|
-
super.load();
|
|
28
|
-
}
|
|
29
|
-
save() {
|
|
30
|
-
this.params.onSave?.();
|
|
31
|
-
}
|
|
32
|
-
destroy() {
|
|
33
|
-
this.params.onDestroy?.();
|
|
34
|
-
super.destroy();
|
|
35
|
-
}
|
|
36
|
-
reset(withKeys = false) {
|
|
37
|
-
this.params?.onReset?.();
|
|
38
|
-
super.reset(withKeys);
|
|
26
|
+
return _origGetTemp.call(this.authKeys, dcId, idx, now);
|
|
27
|
+
};
|
|
39
28
|
}
|
|
40
29
|
decryptOutgoingMessage(crypto, data, dcId, tempIndex) {
|
|
41
|
-
const key = this.
|
|
30
|
+
const key = tempIndex ? this.authKeys.getTemp(dcId, tempIndex, Date.now()) : this.authKeys.get(dcId);
|
|
42
31
|
if (!key) {
|
|
43
32
|
throw new MtArgumentError(`No auth key for DC ${dcId}`);
|
|
44
33
|
}
|
package/esm/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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"]}
|
package/esm/transport.test.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { BaseTelegramClient } from '@mtcute/core';
|
|
3
|
-
import { MemoryStorage } from '@mtcute/core/storage/memory.js';
|
|
2
|
+
import { BaseTelegramClient, MemoryStorage } from '@mtcute/core';
|
|
4
3
|
import { createStub } from './stub.js';
|
|
5
4
|
import { StubTelegramTransport } from './transport.js';
|
|
6
5
|
describe('transport stub', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/transport.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/transport.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE;gBACR,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClE,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACtE;YACD,OAAO,EAAE,IAAI,aAAa,EAAE;YAC5B,SAAS,EAAE,GAAG,EAAE,CACZ,IAAI,qBAAqB,CAAC;gBACtB,SAAS,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE;oBACxB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAA;oBAC/D,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBAClC,CAAC;gBACD,SAAS,CAAC,GAAG;oBACT,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC1C,CAAC;aACJ,CAAC;SACT,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;QAEhE,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAChB,iBAAiB;YACjB,iCAAiC;SACpC,CAAC,CACL,CAAA;IACL,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it, vi } from 'vitest'\n\nimport { BaseTelegramClient, MemoryStorage } from '@mtcute/core'\n\nimport { createStub } from './stub.js'\nimport { StubTelegramTransport } from './transport.js'\n\ndescribe('transport stub', () => {\n it('should correctly intercept calls', async () => {\n const log: string[] = []\n\n const client = new BaseTelegramClient({\n apiId: 0,\n apiHash: '',\n logLevel: 0,\n defaultDcs: {\n main: createStub('dcOption', { ipAddress: '1.2.3.4', port: 1234 }),\n media: createStub('dcOption', { ipAddress: '1.2.3.4', port: 5678 }),\n },\n storage: new MemoryStorage(),\n transport: () =>\n new StubTelegramTransport({\n onConnect: (dc, testMode) => {\n log.push(`connect ${dc.ipAddress}:${dc.port} test=${testMode}`)\n client.close().catch(() => {})\n },\n onMessage(msg) {\n log.push(`message size=${msg.length}`)\n },\n }),\n })\n\n client.connect().catch(() => {}) // ignore \"client closed\" error\n\n await vi.waitFor(() =>\n expect(log).toEqual([\n 'message size=40', // req_pq_multi\n 'connect 1.2.3.4:1234 test=false',\n ]),\n )\n })\n})\n"]}
|
package/esm/utils.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parseMarkedPeerId } from '@mtcute/core';
|
|
2
2
|
export function markedIdToPeer(id) {
|
|
3
|
-
const type =
|
|
4
|
-
const bareId = markedPeerIdToBare(id);
|
|
3
|
+
const [type, bareId] = parseMarkedPeerId(id);
|
|
5
4
|
switch (type) {
|
|
6
5
|
case 'user':
|
|
7
6
|
return { _: 'peerUser', userId: bareId };
|
package/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mtcute/test",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Test utilities for mtcute",
|
|
5
5
|
"author": "Alina Sireneva <alina@tei.su>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"long": "5.2.3"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@mtcute/core": "^0.
|
|
14
|
+
"@mtcute/core": "^0.7.0",
|
|
15
15
|
"@mtcute/tl": "^*",
|
|
16
16
|
"vitest": "^0.34.6"
|
|
17
17
|
},
|
package/cjs/storage-test.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { ITelegramStorage, MaybeAsync } from '@mtcute/core';
|
|
2
|
-
import { Logger, TlReaderMap, TlWriterMap } from '@mtcute/core/utils.js';
|
|
3
|
-
export declare const stubPeerUser: ITelegramStorage.PeerInfo;
|
|
4
|
-
export declare function testStorage<T extends ITelegramStorage>(s: T, params?: {
|
|
5
|
-
skipEntityOverwrite?: boolean;
|
|
6
|
-
customTests?: (s: T) => void;
|
|
7
|
-
}): void;
|
|
8
|
-
interface IStateStorage {
|
|
9
|
-
setup?(log: Logger, readerMap: TlReaderMap, writerMap: TlWriterMap): void;
|
|
10
|
-
load?(): MaybeAsync<void>;
|
|
11
|
-
save?(): MaybeAsync<void>;
|
|
12
|
-
destroy?(): MaybeAsync<void>;
|
|
13
|
-
reset(): MaybeAsync<void>;
|
|
14
|
-
getState(key: string): MaybeAsync<unknown>;
|
|
15
|
-
setState(key: string, state: unknown, ttl?: number): MaybeAsync<void>;
|
|
16
|
-
deleteState(key: string): MaybeAsync<void>;
|
|
17
|
-
getCurrentScene(key: string): MaybeAsync<string | null>;
|
|
18
|
-
setCurrentScene(key: string, scene: string, ttl?: number): MaybeAsync<void>;
|
|
19
|
-
deleteCurrentScene(key: string): MaybeAsync<void>;
|
|
20
|
-
getRateLimit(key: string, limit: number, window: number): MaybeAsync<[number, number]>;
|
|
21
|
-
resetRateLimit(key: string): MaybeAsync<void>;
|
|
22
|
-
}
|
|
23
|
-
export declare function testStateStorage(s: IStateStorage): void;
|
|
24
|
-
export {};
|