@mtcute/web 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 (118) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +53 -0
  3. package/cjs/client.d.ts +30 -0
  4. package/cjs/client.js +40 -0
  5. package/cjs/client.js.map +1 -0
  6. package/cjs/crypto.d.ts +21 -0
  7. package/cjs/crypto.js +71 -0
  8. package/cjs/crypto.js.map +1 -0
  9. package/cjs/encodings/base64.d.ts +2 -0
  10. package/cjs/encodings/base64.js +112 -0
  11. package/cjs/encodings/base64.js.map +1 -0
  12. package/cjs/encodings/hex.d.ts +2 -0
  13. package/cjs/encodings/hex.js +69 -0
  14. package/cjs/encodings/hex.js.map +1 -0
  15. package/cjs/encodings/utf8.d.ts +3 -0
  16. package/cjs/encodings/utf8.js +29 -0
  17. package/cjs/encodings/utf8.js.map +1 -0
  18. package/cjs/exit-hook.d.ts +1 -0
  19. package/cjs/exit-hook.js +24 -0
  20. package/cjs/exit-hook.js.map +1 -0
  21. package/cjs/idb/driver.d.ts +18 -0
  22. package/cjs/idb/driver.js +137 -0
  23. package/cjs/idb/driver.js.map +1 -0
  24. package/cjs/idb/index.d.ts +22 -0
  25. package/cjs/idb/index.js +28 -0
  26. package/cjs/idb/index.js.map +1 -0
  27. package/cjs/idb/repository/auth-keys.d.ts +14 -0
  28. package/cjs/idb/repository/auth-keys.js +70 -0
  29. package/cjs/idb/repository/auth-keys.js.map +1 -0
  30. package/cjs/idb/repository/kv.d.ts +11 -0
  31. package/cjs/idb/repository/kv.js +34 -0
  32. package/cjs/idb/repository/kv.js.map +1 -0
  33. package/cjs/idb/repository/peers.d.ts +12 -0
  34. package/cjs/idb/repository/peers.js +38 -0
  35. package/cjs/idb/repository/peers.js.map +1 -0
  36. package/cjs/idb/repository/ref-messages.d.ts +12 -0
  37. package/cjs/idb/repository/ref-messages.js +57 -0
  38. package/cjs/idb/repository/ref-messages.js.map +1 -0
  39. package/cjs/idb/utils.d.ts +3 -0
  40. package/cjs/idb/utils.js +27 -0
  41. package/cjs/idb/utils.js.map +1 -0
  42. package/cjs/index.d.ts +7 -0
  43. package/cjs/index.js +24 -0
  44. package/cjs/index.js.map +1 -0
  45. package/cjs/logging.d.ts +1 -0
  46. package/cjs/logging.js +35 -0
  47. package/cjs/logging.js.map +1 -0
  48. package/cjs/package.json +3 -0
  49. package/cjs/platform.d.ts +21 -0
  50. package/cjs/platform.js +49 -0
  51. package/cjs/platform.js.map +1 -0
  52. package/cjs/wasm.d.ts +2 -0
  53. package/cjs/wasm.js +36 -0
  54. package/cjs/wasm.js.map +1 -0
  55. package/cjs/websocket.d.ts +45 -0
  56. package/cjs/websocket.js +121 -0
  57. package/cjs/websocket.js.map +1 -0
  58. package/cjs/worker.d.ts +10 -0
  59. package/cjs/worker.js +128 -0
  60. package/cjs/worker.js.map +1 -0
  61. package/esm/client.d.ts +30 -0
  62. package/esm/client.js +35 -0
  63. package/esm/client.js.map +1 -0
  64. package/esm/crypto.d.ts +21 -0
  65. package/esm/crypto.js +67 -0
  66. package/esm/crypto.js.map +1 -0
  67. package/esm/encodings/base64.d.ts +2 -0
  68. package/esm/encodings/base64.js +107 -0
  69. package/esm/encodings/base64.js.map +1 -0
  70. package/esm/encodings/hex.d.ts +2 -0
  71. package/esm/encodings/hex.js +64 -0
  72. package/esm/encodings/hex.js.map +1 -0
  73. package/esm/encodings/utf8.d.ts +3 -0
  74. package/esm/encodings/utf8.js +23 -0
  75. package/esm/encodings/utf8.js.map +1 -0
  76. package/esm/exit-hook.d.ts +1 -0
  77. package/esm/exit-hook.js +20 -0
  78. package/esm/exit-hook.js.map +1 -0
  79. package/esm/idb/driver.d.ts +18 -0
  80. package/esm/idb/driver.js +133 -0
  81. package/esm/idb/driver.js.map +1 -0
  82. package/esm/idb/index.d.ts +22 -0
  83. package/esm/idb/index.js +23 -0
  84. package/esm/idb/index.js.map +1 -0
  85. package/esm/idb/repository/auth-keys.d.ts +14 -0
  86. package/esm/idb/repository/auth-keys.js +66 -0
  87. package/esm/idb/repository/auth-keys.js.map +1 -0
  88. package/esm/idb/repository/kv.d.ts +11 -0
  89. package/esm/idb/repository/kv.js +30 -0
  90. package/esm/idb/repository/kv.js.map +1 -0
  91. package/esm/idb/repository/peers.d.ts +12 -0
  92. package/esm/idb/repository/peers.js +34 -0
  93. package/esm/idb/repository/peers.js.map +1 -0
  94. package/esm/idb/repository/ref-messages.d.ts +12 -0
  95. package/esm/idb/repository/ref-messages.js +53 -0
  96. package/esm/idb/repository/ref-messages.js.map +1 -0
  97. package/esm/idb/utils.d.ts +3 -0
  98. package/esm/idb/utils.js +21 -0
  99. package/esm/idb/utils.js.map +1 -0
  100. package/esm/index.d.ts +7 -0
  101. package/esm/index.js +8 -0
  102. package/esm/index.js.map +1 -0
  103. package/esm/logging.d.ts +1 -0
  104. package/esm/logging.js +31 -0
  105. package/esm/logging.js.map +1 -0
  106. package/esm/platform.d.ts +21 -0
  107. package/esm/platform.js +45 -0
  108. package/esm/platform.js.map +1 -0
  109. package/esm/wasm.d.ts +2 -0
  110. package/esm/wasm.js +32 -0
  111. package/esm/wasm.js.map +1 -0
  112. package/esm/websocket.d.ts +45 -0
  113. package/esm/websocket.js +113 -0
  114. package/esm/websocket.js.map +1 -0
  115. package/esm/worker.d.ts +10 -0
  116. package/esm/worker.js +123 -0
  117. package/esm/worker.js.map +1 -0
  118. package/package.json +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":";;;AAAA,MAAM,WAAW,GAAG,uBAAuB,CAAA;AAC3C,MAAM,WAAW,GAAG;IAChB,EAAE;IACF,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACR,CAAA;AACD,MAAM,MAAM,GAAG;IACX,EAAE;IACF,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;CACnB,CAAA;AACD,MAAM,UAAU,GAAG;IACf,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;CACnB,CAAA;AAED,gBAAgB;AACT,MAAM,qBAAqB,GAAG,CACjC,KAAa,EACb,KAAa,EACb,GAAW,EACX,GAAW,EACX,IAAe,EACX,EAAE;IACN,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACP,WAAW,GAAG,GAAG,EACjB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,MAAM,CAAC,KAAK,CAAC,EACb,WAAW,CAAC,KAAK,CAAC,EAClB,EAAE,EACF,UAAU,CAAC,KAAK,CAAC,EACjB,GAAG,EACH,EAAE,EACF,GAAG,IAAI,CACV,CAAA;AACL,CAAC,CAAA;AAnBY,QAAA,qBAAqB,yBAmBjC","sourcesContent":["const BASE_FORMAT = '%s [%c%s%c] [%c%s%c] '\nconst LEVEL_NAMES = [\n '', // OFF\n 'ERR',\n 'WRN',\n 'INF',\n 'DBG',\n 'VRB',\n]\nconst COLORS = [\n '', // OFF\n 'color: #7a5f9d',\n 'color: #8d7041',\n 'color: #396c9e',\n 'color: #437761',\n 'color: #7a5f9d',\n]\nconst TAG_COLORS = [\n 'color: #437761',\n 'color: #537a36',\n 'color: #8d7041',\n 'color: #396c9e',\n 'color: #7a5f9d',\n 'color: #7a5f9d',\n]\n\n/** @internal */\nexport const defaultLoggingHandler = (\n color: number,\n level: number,\n tag: string,\n fmt: string,\n args: unknown[],\n): void => {\n // eslint-disable-next-line no-console\n console.log(\n BASE_FORMAT + fmt,\n new Date().toISOString(),\n COLORS[level],\n LEVEL_NAMES[level],\n '',\n TAG_COLORS[color],\n tag,\n '',\n ...args,\n )\n}\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,21 @@
1
+ import { ICorePlatform } from '@mtcute/core/platform.js';
2
+ import { base64Decode, base64Encode } from './encodings/base64.js';
3
+ import { hexDecode, hexEncode } from './encodings/hex.js';
4
+ import { utf8ByteLength, utf8Decode, utf8Encode } from './encodings/utf8.js';
5
+ import { beforeExit } from './exit-hook.js';
6
+ import { defaultLoggingHandler } from './logging.js';
7
+ export declare class WebPlatform implements ICorePlatform {
8
+ log: typeof defaultLoggingHandler;
9
+ beforeExit: typeof beforeExit;
10
+ getDeviceModel(): string;
11
+ getDefaultLogLevel(): number | null;
12
+ onNetworkChanged(fn: (connected: boolean) => void): () => void;
13
+ isOnline(): boolean;
14
+ utf8ByteLength: typeof utf8ByteLength;
15
+ utf8Encode: typeof utf8Encode;
16
+ utf8Decode: typeof utf8Decode;
17
+ hexEncode: typeof hexEncode;
18
+ hexDecode: typeof hexDecode;
19
+ base64Encode: typeof base64Encode;
20
+ base64Decode: typeof base64Decode;
21
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebPlatform = void 0;
4
+ const base64_js_1 = require("./encodings/base64.js");
5
+ const hex_js_1 = require("./encodings/hex.js");
6
+ const utf8_js_1 = require("./encodings/utf8.js");
7
+ const exit_hook_js_1 = require("./exit-hook.js");
8
+ const logging_js_1 = require("./logging.js");
9
+ class WebPlatform {
10
+ getDeviceModel() {
11
+ if (typeof navigator === 'undefined')
12
+ return 'Browser';
13
+ return navigator.userAgent;
14
+ }
15
+ getDefaultLogLevel() {
16
+ if (typeof localStorage !== 'undefined') {
17
+ const localLogLevel = parseInt(localStorage.MTCUTE_LOG_LEVEL);
18
+ if (!isNaN(localLogLevel)) {
19
+ return localLogLevel;
20
+ }
21
+ }
22
+ return null;
23
+ }
24
+ onNetworkChanged(fn) {
25
+ if (!('onLine' in navigator))
26
+ return () => { };
27
+ const onlineHandler = () => fn(navigator.onLine);
28
+ window.addEventListener('online', onlineHandler);
29
+ window.addEventListener('offline', onlineHandler);
30
+ return () => {
31
+ window.removeEventListener('online', onlineHandler);
32
+ window.removeEventListener('offline', onlineHandler);
33
+ };
34
+ }
35
+ isOnline() {
36
+ return navigator.onLine;
37
+ }
38
+ }
39
+ exports.WebPlatform = WebPlatform;
40
+ WebPlatform.prototype.log = logging_js_1.defaultLoggingHandler;
41
+ WebPlatform.prototype.beforeExit = exit_hook_js_1.beforeExit;
42
+ WebPlatform.prototype.utf8ByteLength = utf8_js_1.utf8ByteLength;
43
+ WebPlatform.prototype.utf8Encode = utf8_js_1.utf8Encode;
44
+ WebPlatform.prototype.utf8Decode = utf8_js_1.utf8Decode;
45
+ WebPlatform.prototype.hexEncode = hex_js_1.hexEncode;
46
+ WebPlatform.prototype.hexDecode = hex_js_1.hexDecode;
47
+ WebPlatform.prototype.base64Encode = base64_js_1.base64Encode;
48
+ WebPlatform.prototype.base64Decode = base64_js_1.base64Decode;
49
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":";;;AAEA,qDAAkE;AAClE,+CAAyD;AACzD,iDAA4E;AAC5E,iDAA2C;AAC3C,6CAAoD;AAEpD,MAAa,WAAW;IAKpB,cAAc;QACV,IAAI,OAAO,SAAS,KAAK,WAAW;YAAE,OAAO,SAAS,CAAA;QAEtD,OAAO,SAAS,CAAC,SAAS,CAAA;IAC9B,CAAC;IAED,kBAAkB;QACd,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;YACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,CAAC,gBAA0B,CAAC,CAAA;YAEvE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;gBACvB,OAAO,aAAa,CAAA;aACvB;SACJ;QAED,OAAO,IAAI,CAAA;IACf,CAAC;IAED,gBAAgB,CAAC,EAAgC;QAC7C,IAAI,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;QAE7C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAChD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QAChD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QAEjD,OAAO,GAAG,EAAE;YACR,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;YACnD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QACxD,CAAC,CAAA;IACL,CAAC;IAED,QAAQ;QACJ,OAAO,SAAS,CAAC,MAAM,CAAA;IAC3B,CAAC;CAWJ;AAjDD,kCAiDC;AAED,WAAW,CAAC,SAAS,CAAC,GAAG,GAAG,kCAAqB,CAAA;AACjD,WAAW,CAAC,SAAS,CAAC,UAAU,GAAG,yBAAU,CAAA;AAC7C,WAAW,CAAC,SAAS,CAAC,cAAc,GAAG,wBAAc,CAAA;AACrD,WAAW,CAAC,SAAS,CAAC,UAAU,GAAG,oBAAU,CAAA;AAC7C,WAAW,CAAC,SAAS,CAAC,UAAU,GAAG,oBAAU,CAAA;AAC7C,WAAW,CAAC,SAAS,CAAC,SAAS,GAAG,kBAAS,CAAA;AAC3C,WAAW,CAAC,SAAS,CAAC,SAAS,GAAG,kBAAS,CAAA;AAC3C,WAAW,CAAC,SAAS,CAAC,YAAY,GAAG,wBAAY,CAAA;AACjD,WAAW,CAAC,SAAS,CAAC,YAAY,GAAG,wBAAY,CAAA","sourcesContent":["import { ICorePlatform } from '@mtcute/core/platform.js'\n\nimport { base64Decode, base64Encode } from './encodings/base64.js'\nimport { hexDecode, hexEncode } from './encodings/hex.js'\nimport { utf8ByteLength, utf8Decode, utf8Encode } from './encodings/utf8.js'\nimport { beforeExit } from './exit-hook.js'\nimport { defaultLoggingHandler } from './logging.js'\n\nexport class WebPlatform implements ICorePlatform {\n // ICorePlatform\n log!: typeof defaultLoggingHandler\n beforeExit!: typeof beforeExit\n\n getDeviceModel(): string {\n if (typeof navigator === 'undefined') return 'Browser'\n\n return navigator.userAgent\n }\n\n getDefaultLogLevel(): number | null {\n if (typeof localStorage !== 'undefined') {\n const localLogLevel = parseInt(localStorage.MTCUTE_LOG_LEVEL as string)\n\n if (!isNaN(localLogLevel)) {\n return localLogLevel\n }\n }\n\n return null\n }\n\n onNetworkChanged(fn: (connected: boolean) => void) {\n if (!('onLine' in navigator)) return () => {}\n\n const onlineHandler = () => fn(navigator.onLine)\n window.addEventListener('online', onlineHandler)\n window.addEventListener('offline', onlineHandler)\n\n return () => {\n window.removeEventListener('online', onlineHandler)\n window.removeEventListener('offline', onlineHandler)\n }\n }\n\n isOnline(): boolean {\n return navigator.onLine\n }\n\n // ITlPlatform\n utf8ByteLength!: typeof utf8ByteLength\n utf8Encode!: typeof utf8Encode\n utf8Decode!: typeof utf8Decode\n hexEncode!: typeof hexEncode\n hexDecode!: typeof hexDecode\n\n base64Encode!: typeof base64Encode\n base64Decode!: typeof base64Decode\n}\n\nWebPlatform.prototype.log = defaultLoggingHandler\nWebPlatform.prototype.beforeExit = beforeExit\nWebPlatform.prototype.utf8ByteLength = utf8ByteLength\nWebPlatform.prototype.utf8Encode = utf8Encode\nWebPlatform.prototype.utf8Decode = utf8Decode\nWebPlatform.prototype.hexEncode = hexEncode\nWebPlatform.prototype.hexDecode = hexDecode\nWebPlatform.prototype.base64Encode = base64Encode\nWebPlatform.prototype.base64Decode = base64Decode\n"]}
package/cjs/wasm.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type WasmInitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
2
+ export declare function loadWasmBinary(input?: WasmInitInput): Promise<WebAssembly.Instance>;
package/cjs/wasm.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadWasmBinary = void 0;
4
+ const wasm_1 = require("@mtcute/wasm");
5
+ async function loadWasmBinary(input) {
6
+ if (typeof input === 'undefined') {
7
+ input = (0, wasm_1.getWasmUrl)();
8
+ }
9
+ if (typeof input === 'string' ||
10
+ (typeof Request === 'function' && input instanceof Request) ||
11
+ (typeof URL === 'function' && input instanceof URL)) {
12
+ input = await fetch(input);
13
+ }
14
+ if (typeof Response === 'function' && input instanceof Response) {
15
+ if (typeof WebAssembly.instantiateStreaming === 'function') {
16
+ try {
17
+ const { instance } = await WebAssembly.instantiateStreaming(input);
18
+ return instance;
19
+ }
20
+ catch (e) {
21
+ if (input.headers.get('Content-Type') !== 'application/wasm') {
22
+ console.warn('`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n', e);
23
+ }
24
+ else {
25
+ throw e;
26
+ }
27
+ }
28
+ }
29
+ const bytes = await input.arrayBuffer();
30
+ const { instance } = await WebAssembly.instantiate(bytes);
31
+ return instance;
32
+ }
33
+ return await WebAssembly.instantiate(input);
34
+ }
35
+ exports.loadWasmBinary = loadWasmBinary;
36
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/wasm.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAIlC,KAAK,UAAU,cAAc,CAAC,KAAqB;IACtD,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;QAC9B,KAAK,GAAG,IAAA,iBAAU,GAAE,CAAA;KACvB;IAED,IACI,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,OAAO,OAAO,KAAK,UAAU,IAAI,KAAK,YAAY,OAAO,CAAC;QAC3D,CAAC,OAAO,GAAG,KAAK,UAAU,IAAI,KAAK,YAAY,GAAG,CAAC,EACrD;QACE,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAA;KAC7B;IAED,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,KAAK,YAAY,QAAQ,EAAE;QAC7D,IAAI,OAAO,WAAW,CAAC,oBAAoB,KAAK,UAAU,EAAE;YACxD,IAAI;gBACA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;gBAElE,OAAO,QAAQ,CAAA;aAClB;YAAC,OAAO,CAAC,EAAE;gBACR,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,kBAAkB,EAAE;oBAC1D,OAAO,CAAC,IAAI,CACR,mMAAmM,EACnM,CAAC,CACJ,CAAA;iBACJ;qBAAM;oBACH,MAAM,CAAC,CAAA;iBACV;aACJ;SACJ;QAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;QAEvC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEzD,OAAO,QAAQ,CAAA;KAClB;IAED,OAAO,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AAC/C,CAAC;AAvCD,wCAuCC","sourcesContent":["import { getWasmUrl } from '@mtcute/wasm'\n\nexport type WasmInitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module\n\nexport async function loadWasmBinary(input?: WasmInitInput): Promise<WebAssembly.Instance> {\n if (typeof input === 'undefined') {\n input = getWasmUrl()\n }\n\n if (\n typeof input === 'string' ||\n (typeof Request === 'function' && input instanceof Request) ||\n (typeof URL === 'function' && input instanceof URL)\n ) {\n input = await fetch(input)\n }\n\n if (typeof Response === 'function' && input instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n const { instance } = await WebAssembly.instantiateStreaming(input)\n\n return instance\n } catch (e) {\n if (input.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\n '`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n',\n e,\n )\n } else {\n throw e\n }\n }\n }\n\n const bytes = await input.arrayBuffer()\n\n const { instance } = await WebAssembly.instantiate(bytes)\n\n return instance\n }\n\n return await WebAssembly.instantiate(input)\n}\n"]}
@@ -0,0 +1,45 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import EventEmitter from 'events';
3
+ import { IPacketCodec, ITelegramTransport, ObfuscatedPacketCodec, TransportState } from '@mtcute/core';
4
+ import { BasicDcOption, ICryptoProvider, Logger } from '@mtcute/core/utils.js';
5
+ export type WebSocketConstructor = {
6
+ new (address: string, protocol?: string): WebSocket;
7
+ };
8
+ /**
9
+ * Base for WebSocket transports.
10
+ * Subclasses must provide packet codec in `_packetCodec` property
11
+ */
12
+ export declare abstract class BaseWebSocketTransport extends EventEmitter implements ITelegramTransport {
13
+ private _currentDc;
14
+ private _state;
15
+ private _socket;
16
+ private _crypto;
17
+ protected log: Logger;
18
+ abstract _packetCodec: IPacketCodec;
19
+ packetCodecInitialized: boolean;
20
+ private _baseDomain;
21
+ private _subdomains;
22
+ private _WebSocket;
23
+ constructor({ ws, baseDomain, subdomains, }?: {
24
+ /** Custom implementation of WebSocket (e.g. https://npm.im/ws) */
25
+ ws?: WebSocketConstructor;
26
+ /** Base WebSocket domain */
27
+ baseDomain?: string;
28
+ /** Map of sub-domains (key is DC ID, value is string) */
29
+ subdomains?: Record<string, string>;
30
+ });
31
+ private _updateLogPrefix;
32
+ setup(crypto: ICryptoProvider, log: Logger): void;
33
+ state(): TransportState;
34
+ currentDc(): BasicDcOption | null;
35
+ connect(dc: BasicDcOption, testMode: boolean): void;
36
+ close(): void;
37
+ handleError(event: Event | {
38
+ error: Error;
39
+ }): void;
40
+ handleConnect(): void;
41
+ send(bytes: Uint8Array): Promise<void>;
42
+ }
43
+ export declare class WebSocketTransport extends BaseWebSocketTransport {
44
+ _packetCodec: ObfuscatedPacketCodec;
45
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WebSocketTransport = exports.BaseWebSocketTransport = void 0;
7
+ const events_1 = __importDefault(require("events"));
8
+ const core_1 = require("@mtcute/core");
9
+ const subdomainsMap = {
10
+ '1': 'pluto',
11
+ '2': 'venus',
12
+ '3': 'aurora',
13
+ '4': 'vesta',
14
+ '5': 'flora',
15
+ };
16
+ /**
17
+ * Base for WebSocket transports.
18
+ * Subclasses must provide packet codec in `_packetCodec` property
19
+ */
20
+ class BaseWebSocketTransport extends events_1.default {
21
+ constructor({ ws = WebSocket, baseDomain = 'web.telegram.org', subdomains = subdomainsMap, } = {}) {
22
+ super();
23
+ this._currentDc = null;
24
+ this._state = core_1.TransportState.Idle;
25
+ this._socket = null;
26
+ this.packetCodecInitialized = false;
27
+ if (!ws) {
28
+ throw new core_1.MtUnsupportedError('To use WebSocket transport with NodeJS, install `ws` package and pass it to constructor');
29
+ }
30
+ // gotta love cjs/esm compat
31
+ if ('default' in ws) {
32
+ ws = ws.default;
33
+ }
34
+ this._baseDomain = baseDomain;
35
+ this._subdomains = subdomains;
36
+ this._WebSocket = ws;
37
+ this.close = this.close.bind(this);
38
+ }
39
+ _updateLogPrefix() {
40
+ if (this._currentDc) {
41
+ this.log.prefix = `[WS:${this._subdomains[this._currentDc.id]}.${this._baseDomain}] `;
42
+ }
43
+ else {
44
+ this.log.prefix = '[WS:disconnected] ';
45
+ }
46
+ }
47
+ setup(crypto, log) {
48
+ this._crypto = crypto;
49
+ this.log = log.create('ws');
50
+ }
51
+ state() {
52
+ return this._state;
53
+ }
54
+ currentDc() {
55
+ return this._currentDc;
56
+ }
57
+ connect(dc, testMode) {
58
+ if (this._state !== core_1.TransportState.Idle) {
59
+ throw new core_1.MtcuteError('Transport is not IDLE');
60
+ }
61
+ if (!this.packetCodecInitialized) {
62
+ this._packetCodec.setup?.(this._crypto, this.log);
63
+ this._packetCodec.on('error', (err) => this.emit('error', err));
64
+ this._packetCodec.on('packet', (buf) => this.emit('message', buf));
65
+ this.packetCodecInitialized = true;
66
+ }
67
+ this._state = core_1.TransportState.Connecting;
68
+ this._currentDc = dc;
69
+ this._socket = new this._WebSocket(`wss://${this._subdomains[dc.id]}.${this._baseDomain}/apiws${testMode ? '_test' : ''}`, 'binary');
70
+ this._updateLogPrefix();
71
+ this.log.debug('connecting to %s (%j)', this._socket.url, dc);
72
+ this._socket.binaryType = 'arraybuffer';
73
+ this._socket.addEventListener('message', (evt) => this._packetCodec.feed(new Uint8Array(evt.data)));
74
+ this._socket.addEventListener('open', this.handleConnect.bind(this));
75
+ this._socket.addEventListener('error', this.handleError.bind(this));
76
+ this._socket.addEventListener('close', this.close);
77
+ }
78
+ close() {
79
+ if (this._state === core_1.TransportState.Idle)
80
+ return;
81
+ this.log.info('connection closed');
82
+ this.emit('close');
83
+ this._state = core_1.TransportState.Idle;
84
+ this._socket.removeEventListener('close', this.close);
85
+ this._socket.close();
86
+ this._socket = null;
87
+ this._currentDc = null;
88
+ this._packetCodec.reset();
89
+ }
90
+ handleError(event) {
91
+ const error = 'error' in event ? event.error : new Error('unknown WebSocket error');
92
+ this.log.error('error: %s', error.stack);
93
+ this.emit('error', error);
94
+ }
95
+ handleConnect() {
96
+ this.log.info('connected');
97
+ Promise.resolve(this._packetCodec.tag())
98
+ .then((initialMessage) => {
99
+ this._socket.send(initialMessage);
100
+ this._state = core_1.TransportState.Ready;
101
+ this.emit('ready');
102
+ })
103
+ .catch((err) => this.emit('error', err));
104
+ }
105
+ async send(bytes) {
106
+ if (this._state !== core_1.TransportState.Ready) {
107
+ throw new core_1.MtcuteError('Transport is not READY');
108
+ }
109
+ const framed = await this._packetCodec.encode(bytes);
110
+ this._socket.send(framed);
111
+ }
112
+ }
113
+ exports.BaseWebSocketTransport = BaseWebSocketTransport;
114
+ class WebSocketTransport extends BaseWebSocketTransport {
115
+ constructor() {
116
+ super(...arguments);
117
+ this._packetCodec = new core_1.ObfuscatedPacketCodec(new core_1.IntermediatePacketCodec());
118
+ }
119
+ }
120
+ exports.WebSocketTransport = WebSocketTransport;
121
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\n\nimport {\n IntermediatePacketCodec,\n IPacketCodec,\n ITelegramTransport,\n MtcuteError,\n MtUnsupportedError,\n ObfuscatedPacketCodec,\n TransportState,\n} from '@mtcute/core'\nimport { BasicDcOption, ICryptoProvider, Logger } from '@mtcute/core/utils.js'\n\nexport type WebSocketConstructor = {\n new (address: string, protocol?: string): WebSocket\n}\n\nconst subdomainsMap: Record<string, string> = {\n '1': 'pluto',\n '2': 'venus',\n '3': 'aurora',\n '4': 'vesta',\n '5': 'flora',\n}\n\n/**\n * Base for WebSocket transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseWebSocketTransport extends EventEmitter implements ITelegramTransport {\n private _currentDc: BasicDcOption | null = null\n private _state: TransportState = TransportState.Idle\n private _socket: WebSocket | null = null\n private _crypto!: ICryptoProvider\n protected log!: Logger\n\n abstract _packetCodec: IPacketCodec\n packetCodecInitialized = false\n\n private _baseDomain: string\n private _subdomains: Record<string, string>\n private _WebSocket: WebSocketConstructor\n\n constructor({\n ws = WebSocket,\n baseDomain = 'web.telegram.org',\n subdomains = subdomainsMap,\n }: {\n /** Custom implementation of WebSocket (e.g. https://npm.im/ws) */\n ws?: WebSocketConstructor\n /** Base WebSocket domain */\n baseDomain?: string\n /** Map of sub-domains (key is DC ID, value is string) */\n subdomains?: Record<string, string>\n } = {}) {\n super()\n\n if (!ws) {\n throw new MtUnsupportedError(\n 'To use WebSocket transport with NodeJS, install `ws` package and pass it to constructor',\n )\n }\n\n // gotta love cjs/esm compat\n if ('default' in ws) {\n ws = ws.default as WebSocketConstructor\n }\n\n this._baseDomain = baseDomain\n this._subdomains = subdomains\n this._WebSocket = ws\n\n this.close = this.close.bind(this)\n }\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[WS:${this._subdomains[this._currentDc.id]}.${this._baseDomain}] `\n } else {\n this.log.prefix = '[WS:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('ws')\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): BasicDcOption | null {\n return this._currentDc\n }\n\n connect(dc: BasicDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._socket = new this._WebSocket(\n `wss://${this._subdomains[dc.id]}.${this._baseDomain}/apiws${testMode ? '_test' : ''}`,\n 'binary',\n )\n\n this._updateLogPrefix()\n this.log.debug('connecting to %s (%j)', this._socket.url, dc)\n\n this._socket.binaryType = 'arraybuffer'\n\n this._socket.addEventListener('message', (evt) =>\n this._packetCodec.feed(new Uint8Array(evt.data as ArrayBuffer)),\n )\n this._socket.addEventListener('open', this.handleConnect.bind(this))\n this._socket.addEventListener('error', this.handleError.bind(this))\n this._socket.addEventListener('close', this.close)\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this.emit('close')\n this._state = TransportState.Idle\n this._socket!.removeEventListener('close', this.close)\n this._socket!.close()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n }\n\n handleError(event: Event | { error: Error }): void {\n const error = 'error' in event ? event.error : new Error('unknown WebSocket error')\n\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n this._socket!.send(initialMessage)\n this._state = TransportState.Ready\n this.emit('ready')\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n const framed = await this._packetCodec.encode(bytes)\n\n this._socket!.send(framed)\n }\n}\n\nexport class WebSocketTransport extends BaseWebSocketTransport {\n _packetCodec = new ObfuscatedPacketCodec(new IntermediatePacketCodec())\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { ClientMessageHandler, RespondFn, SendFn, SomeWorker, TelegramWorker as TelegramWorkerBase, TelegramWorkerOptions, TelegramWorkerPort as TelegramWorkerPortBase, TelegramWorkerPortOptions, WorkerCustomMethods, WorkerMessageHandler } from '@mtcute/core/worker.js';
2
+ export type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods };
3
+ export declare class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {
4
+ registerWorker(handler: WorkerMessageHandler): RespondFn;
5
+ }
6
+ export declare class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {
7
+ readonly options: TelegramWorkerPortOptions;
8
+ constructor(options: TelegramWorkerPortOptions);
9
+ connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void];
10
+ }
package/cjs/worker.js ADDED
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TelegramWorkerPort = exports.TelegramWorker = void 0;
4
+ const platform_js_1 = require("@mtcute/core/platform.js");
5
+ const worker_js_1 = require("@mtcute/core/worker.js");
6
+ const platform_js_2 = require("./platform.js");
7
+ let _registered = false;
8
+ class TelegramWorker extends worker_js_1.TelegramWorker {
9
+ registerWorker(handler) {
10
+ if (_registered) {
11
+ throw new Error('TelegramWorker must be created only once');
12
+ }
13
+ _registered = true;
14
+ if (typeof SharedWorkerGlobalScope !== 'undefined' && self instanceof SharedWorkerGlobalScope) {
15
+ const connections = [];
16
+ const broadcast = (message) => {
17
+ for (const port of connections) {
18
+ port.postMessage(message);
19
+ }
20
+ };
21
+ self.onconnect = (event) => {
22
+ const port = event.ports[0];
23
+ connections.push(port);
24
+ const respond = port.postMessage.bind(port);
25
+ // not very reliable, but better than nothing
26
+ // SharedWorker API doesn't provide a way to detect when the client closes the connection
27
+ // so we just assume that the client is done when it sends a 'close' message
28
+ // and keep a timeout for the case when the client closes without sending a 'close' message
29
+ const onClose = () => {
30
+ port.close();
31
+ const idx = connections.indexOf(port);
32
+ if (idx >= 0) {
33
+ connections.splice(connections.indexOf(port), 1);
34
+ }
35
+ };
36
+ const onTimeout = () => {
37
+ console.warn('some connection timed out!');
38
+ respond({ __type__: 'timeout' });
39
+ onClose();
40
+ };
41
+ // 60s should be a reasonable timeout considering that the client should send a ping every 10s
42
+ // so even if the browser has suspended the timers, we should still get a ping within a minute
43
+ let timeout = setTimeout(onTimeout, 60000);
44
+ port.addEventListener('message', (message) => {
45
+ if (message.data.__type__ === 'close') {
46
+ onClose();
47
+ return;
48
+ }
49
+ if (message.data.__type__ === 'ping') {
50
+ clearTimeout(timeout);
51
+ timeout = setTimeout(onTimeout, 60000);
52
+ return;
53
+ }
54
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
55
+ handler(message.data, respond);
56
+ });
57
+ port.start();
58
+ };
59
+ return broadcast;
60
+ }
61
+ if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
62
+ const respond = self.postMessage.bind(self);
63
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
64
+ self.addEventListener('message', (message) => handler(message.data, respond));
65
+ return respond;
66
+ }
67
+ throw new Error('TelegramWorker must be created from a worker');
68
+ }
69
+ }
70
+ exports.TelegramWorker = TelegramWorker;
71
+ const platform = new platform_js_2.WebPlatform();
72
+ class TelegramWorkerPort extends worker_js_1.TelegramWorkerPort {
73
+ constructor(options) {
74
+ (0, platform_js_1.setPlatform)(platform);
75
+ super(options);
76
+ this.options = options;
77
+ }
78
+ connectToWorker(worker, handler) {
79
+ if (worker instanceof Worker) {
80
+ const send = worker.postMessage.bind(worker);
81
+ const messageHandler = (ev) => {
82
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
83
+ handler(ev.data);
84
+ };
85
+ worker.addEventListener('message', messageHandler);
86
+ return [
87
+ send,
88
+ () => {
89
+ worker.removeEventListener('message', messageHandler);
90
+ },
91
+ ];
92
+ }
93
+ if (worker instanceof SharedWorker) {
94
+ const send = worker.port.postMessage.bind(worker.port);
95
+ const pingInterval = setInterval(() => {
96
+ worker.port.postMessage({ __type__: 'ping' });
97
+ }, 10000);
98
+ const messageHandler = (ev) => {
99
+ if (ev.data.__type__ === 'timeout') {
100
+ // we got disconnected from the worker due to timeout
101
+ // if the page is still alive (which is unlikely), we should reconnect
102
+ // however it's not really possible with SharedWorker API without re-creating the worker
103
+ // so we just reload the page for now
104
+ location.reload();
105
+ return;
106
+ }
107
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
108
+ handler(ev.data);
109
+ };
110
+ worker.port.addEventListener('message', messageHandler);
111
+ worker.port.start();
112
+ // eslint-disable-next-line prefer-const
113
+ let cancelBeforeExit;
114
+ const close = () => {
115
+ clearInterval(pingInterval);
116
+ worker.port.postMessage({ __type__: 'close' });
117
+ worker.port.removeEventListener('message', messageHandler);
118
+ worker.port.close();
119
+ cancelBeforeExit();
120
+ };
121
+ cancelBeforeExit = platform.beforeExit(close);
122
+ return [send, close];
123
+ }
124
+ throw new Error('Only workers and shared workers are supported');
125
+ }
126
+ }
127
+ exports.TelegramWorkerPort = TelegramWorkerPort;
128
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { setPlatform } from '@mtcute/core/platform.js'\nimport {\n ClientMessageHandler,\n RespondFn,\n SendFn,\n SomeWorker,\n TelegramWorker as TelegramWorkerBase,\n TelegramWorkerOptions,\n TelegramWorkerPort as TelegramWorkerPortBase,\n TelegramWorkerPortOptions,\n WorkerCustomMethods,\n WorkerMessageHandler,\n} from '@mtcute/core/worker.js'\n\nimport { WebPlatform } from './platform.js'\n\nexport type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods }\n\nlet _registered = false\n\nexport class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {\n registerWorker(handler: WorkerMessageHandler): RespondFn {\n if (_registered) {\n throw new Error('TelegramWorker must be created only once')\n }\n\n _registered = true\n\n if (typeof SharedWorkerGlobalScope !== 'undefined' && self instanceof SharedWorkerGlobalScope) {\n const connections: MessagePort[] = []\n\n const broadcast = (message: unknown) => {\n for (const port of connections) {\n port.postMessage(message)\n }\n }\n\n self.onconnect = (event) => {\n const port = event.ports[0]\n connections.push(port)\n\n const respond = port.postMessage.bind(port)\n\n // not very reliable, but better than nothing\n // SharedWorker API doesn't provide a way to detect when the client closes the connection\n // so we just assume that the client is done when it sends a 'close' message\n // and keep a timeout for the case when the client closes without sending a 'close' message\n const onClose = () => {\n port.close()\n const idx = connections.indexOf(port)\n\n if (idx >= 0) {\n connections.splice(connections.indexOf(port), 1)\n }\n }\n\n const onTimeout = () => {\n console.warn('some connection timed out!')\n respond({ __type__: 'timeout' })\n onClose()\n }\n\n // 60s should be a reasonable timeout considering that the client should send a ping every 10s\n // so even if the browser has suspended the timers, we should still get a ping within a minute\n let timeout = setTimeout(onTimeout, 60000)\n\n port.addEventListener('message', (message) => {\n if (message.data.__type__ === 'close') {\n onClose()\n\n return\n }\n\n if (message.data.__type__ === 'ping') {\n clearTimeout(timeout)\n timeout = setTimeout(onTimeout, 60000)\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(message.data, respond)\n })\n port.start()\n }\n\n return broadcast\n }\n\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n const respond: RespondFn = self.postMessage.bind(self)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n self.addEventListener('message', (message) => handler(message.data, respond))\n\n return respond\n }\n\n throw new Error('TelegramWorker must be created from a worker')\n }\n}\n\nconst platform = new WebPlatform()\n\nexport class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {\n constructor(readonly options: TelegramWorkerPortOptions) {\n setPlatform(platform)\n super(options)\n }\n\n connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void] {\n if (worker instanceof Worker) {\n const send: SendFn = worker.postMessage.bind(worker)\n\n const messageHandler = (ev: MessageEvent) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(ev.data)\n }\n\n worker.addEventListener('message', messageHandler)\n\n return [\n send,\n () => {\n worker.removeEventListener('message', messageHandler)\n },\n ]\n }\n\n if (worker instanceof SharedWorker) {\n const send: SendFn = worker.port.postMessage.bind(worker.port)\n\n const pingInterval = setInterval(() => {\n worker.port.postMessage({ __type__: 'ping' })\n }, 10000)\n\n const messageHandler = (ev: MessageEvent) => {\n if (ev.data.__type__ === 'timeout') {\n // we got disconnected from the worker due to timeout\n // if the page is still alive (which is unlikely), we should reconnect\n // however it's not really possible with SharedWorker API without re-creating the worker\n // so we just reload the page for now\n location.reload()\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n handler(ev.data)\n }\n\n worker.port.addEventListener('message', messageHandler)\n worker.port.start()\n\n // eslint-disable-next-line prefer-const\n let cancelBeforeExit: () => void\n\n const close = () => {\n clearInterval(pingInterval)\n worker.port.postMessage({ __type__: 'close' })\n worker.port.removeEventListener('message', messageHandler)\n worker.port.close()\n cancelBeforeExit()\n }\n\n cancelBeforeExit = platform.beforeExit(close)\n\n return [send, close]\n }\n\n throw new Error('Only workers and shared workers are supported')\n }\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import { ITelegramStorageProvider, PartialOnly } from '@mtcute/core';
2
+ import { BaseTelegramClient as BaseTelegramClientBase, BaseTelegramClientOptions as BaseTelegramClientOptionsBase, TelegramClient as TelegramClientBase, TelegramClientOptions } from '@mtcute/core/client.js';
3
+ export type { TelegramClientOptions };
4
+ export interface BaseTelegramClientOptions extends PartialOnly<Omit<BaseTelegramClientOptionsBase, 'storage'>, 'transport' | 'crypto'> {
5
+ /**
6
+ * Storage to use for this client.
7
+ *
8
+ * If a string is passed, it will be used as
9
+ * a name for an IndexedDB database.
10
+ *
11
+ * @default `"client.session"`
12
+ */
13
+ storage?: string | ITelegramStorageProvider;
14
+ /**
15
+ * **ADVANCED USE ONLY**
16
+ *
17
+ * Whether to not set up the platform.
18
+ * This is useful if you call `setPlatform` yourself.
19
+ */
20
+ platformless?: boolean;
21
+ }
22
+ export declare class BaseTelegramClient extends BaseTelegramClientBase {
23
+ constructor(opts: BaseTelegramClientOptions);
24
+ }
25
+ /**
26
+ * Telegram client for use in Node.js
27
+ */
28
+ export declare class TelegramClient extends TelegramClientBase {
29
+ constructor(opts: TelegramClientOptions);
30
+ }
package/esm/client.js ADDED
@@ -0,0 +1,35 @@
1
+ import { BaseTelegramClient as BaseTelegramClientBase, TelegramClient as TelegramClientBase, } from '@mtcute/core/client.js';
2
+ import { setPlatform } from '@mtcute/core/platform.js';
3
+ import { WebCryptoProvider } from './crypto.js';
4
+ import { IdbStorage } from './idb/index.js';
5
+ import { WebPlatform } from './platform.js';
6
+ import { WebSocketTransport } from './websocket.js';
7
+ export class BaseTelegramClient extends BaseTelegramClientBase {
8
+ constructor(opts) {
9
+ if (!opts.platformless)
10
+ setPlatform(new WebPlatform());
11
+ super({
12
+ crypto: new WebCryptoProvider(),
13
+ transport: () => new WebSocketTransport(),
14
+ ...opts,
15
+ storage: typeof opts.storage === 'string' ?
16
+ new IdbStorage(opts.storage) :
17
+ opts.storage ?? new IdbStorage('client.session'),
18
+ });
19
+ }
20
+ }
21
+ /**
22
+ * Telegram client for use in Node.js
23
+ */
24
+ export class TelegramClient extends TelegramClientBase {
25
+ constructor(opts) {
26
+ if ('client' in opts) {
27
+ super(opts);
28
+ return;
29
+ }
30
+ super({
31
+ client: new BaseTelegramClient(opts),
32
+ });
33
+ }
34
+ }
35
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EACH,kBAAkB,IAAI,sBAAsB,EAE5C,cAAc,IAAI,kBAAkB,GAEvC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAyBnD,MAAM,OAAO,kBAAmB,SAAQ,sBAAsB;IAC1D,YAAY,IAA+B;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC,CAAA;QAEtD,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,iBAAiB,EAAE;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,EAAE;YACzC,GAAG,IAAI;YACP,OAAO,EACH,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;gBAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,gBAAgB,CAAC;SAC3D,CAAC,CAAA;IACN,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAClD,YAAY,IAA2B;QACnC,IAAI,QAAQ,IAAI,IAAI,EAAE;YAClB,KAAK,CAAC,IAAI,CAAC,CAAA;YAEX,OAAM;SACT;QAED,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC;SACvC,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import { ITelegramStorageProvider, PartialOnly } from '@mtcute/core'\nimport {\n BaseTelegramClient as BaseTelegramClientBase,\n BaseTelegramClientOptions as BaseTelegramClientOptionsBase,\n TelegramClient as TelegramClientBase,\n TelegramClientOptions,\n} from '@mtcute/core/client.js'\nimport { setPlatform } from '@mtcute/core/platform.js'\n\nimport { WebCryptoProvider } from './crypto.js'\nimport { IdbStorage } from './idb/index.js'\nimport { WebPlatform } from './platform.js'\nimport { WebSocketTransport } from './websocket.js'\n\nexport type { TelegramClientOptions }\n\nexport interface BaseTelegramClientOptions\n extends PartialOnly<Omit<BaseTelegramClientOptionsBase, 'storage'>, 'transport' | 'crypto'> {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for an IndexedDB database.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n\n /**\n * **ADVANCED USE ONLY**\n *\n * Whether to not set up the platform.\n * This is useful if you call `setPlatform` yourself.\n */\n platformless?: boolean\n}\n\nexport class BaseTelegramClient extends BaseTelegramClientBase {\n constructor(opts: BaseTelegramClientOptions) {\n if (!opts.platformless) setPlatform(new WebPlatform())\n\n super({\n crypto: new WebCryptoProvider(),\n transport: () => new WebSocketTransport(),\n ...opts,\n storage:\n typeof opts.storage === 'string' ?\n new IdbStorage(opts.storage) :\n opts.storage ?? new IdbStorage('client.session'),\n })\n }\n}\n\n/**\n * Telegram client for use in Node.js\n */\nexport class TelegramClient extends TelegramClientBase {\n constructor(opts: TelegramClientOptions) {\n if ('client' in opts) {\n super(opts)\n\n return\n }\n\n super({\n client: new BaseTelegramClient(opts),\n })\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from '@mtcute/core/utils.js';
2
+ import { WasmInitInput } from './wasm.js';
3
+ export interface WebCryptoProviderOptions {
4
+ crypto?: Crypto;
5
+ wasmInput?: WasmInitInput;
6
+ }
7
+ export declare class WebCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
8
+ readonly crypto: Crypto;
9
+ private _wasmInput?;
10
+ sha1(data: Uint8Array): Uint8Array;
11
+ sha256(data: Uint8Array): Uint8Array;
12
+ createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr;
13
+ createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
14
+ gzip(data: Uint8Array, maxSize: number): Uint8Array | null;
15
+ gunzip(data: Uint8Array): Uint8Array;
16
+ constructor(params?: WebCryptoProviderOptions);
17
+ initialize(): Promise<void>;
18
+ pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number | undefined, algo?: string | undefined): Promise<Uint8Array>;
19
+ hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
20
+ randomFill(buf: Uint8Array): void;
21
+ }