@mtcute/web 0.17.0 → 0.18.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/client.cjs +39 -0
- package/client.d.cts +23 -0
- package/client.d.ts +1 -8
- package/client.js +34 -0
- package/common-internals-web/logging.cjs +48 -0
- package/common-internals-web/logging.d.cts +2 -0
- package/common-internals-web/logging.js +43 -0
- package/crypto.cjs +84 -0
- package/crypto.d.cts +21 -0
- package/crypto.js +79 -0
- package/exit-hook.cjs +28 -0
- package/exit-hook.d.cts +1 -0
- package/exit-hook.js +23 -0
- package/idb/driver.cjs +123 -0
- package/idb/driver.d.cts +18 -0
- package/idb/driver.js +118 -0
- package/idb/index.cjs +29 -0
- package/idb/index.d.cts +22 -0
- package/idb/index.js +24 -0
- package/idb/repository/auth-keys.cjs +70 -0
- package/idb/repository/auth-keys.d.cts +14 -0
- package/idb/repository/auth-keys.js +65 -0
- package/idb/repository/kv.cjs +36 -0
- package/idb/repository/kv.d.cts +11 -0
- package/idb/repository/kv.js +31 -0
- package/idb/repository/peers.cjs +47 -0
- package/idb/repository/peers.d.cts +12 -0
- package/idb/repository/peers.js +42 -0
- package/idb/repository/ref-messages.cjs +62 -0
- package/idb/repository/ref-messages.d.cts +12 -0
- package/idb/repository/ref-messages.js +57 -0
- package/idb/utils.cjs +21 -0
- package/idb/utils.d.cts +2 -0
- package/idb/utils.js +16 -0
- package/index.cjs +18 -953
- package/index.js +7 -943
- package/methods.cjs +2 -2
- package/package.json +12 -11
- package/platform.cjs +41 -0
- package/platform.d.cts +11 -0
- package/platform.d.ts +1 -11
- package/platform.js +36 -0
- package/utils.cjs +2 -2
- package/wasm.cjs +38 -0
- package/wasm.d.cts +2 -0
- package/wasm.js +33 -0
- package/websocket.cjs +50 -0
- package/websocket.d.cts +18 -0
- package/websocket.d.ts +6 -34
- package/websocket.js +45 -0
- package/worker.cjs +116 -0
- package/worker.d.cts +12 -0
- package/worker.d.ts +5 -3
- package/worker.js +111 -0
- package/common-internals-web/base64.d.ts +0 -2
- package/common-internals-web/hex.d.ts +0 -2
- package/common-internals-web/utf8.d.ts +0 -3
- /package/{websocket.test.d.ts → idb/idb.test.d.cts} +0 -0
package/idb/driver.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { BaseStorageDriver, MtUnsupportedError } from "@mtcute/core";
|
|
2
|
+
import { txToPromise } from "./utils.js";
|
|
3
|
+
const REPO_VERSION_PREFIX = "__version:";
|
|
4
|
+
class IdbStorageDriver extends BaseStorageDriver {
|
|
5
|
+
constructor(_dbName) {
|
|
6
|
+
super();
|
|
7
|
+
this._dbName = _dbName;
|
|
8
|
+
if (typeof indexedDB === "undefined") {
|
|
9
|
+
throw new MtUnsupportedError("IndexedDB is not available");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
db;
|
|
13
|
+
_pendingWrites = [];
|
|
14
|
+
_pendingWritesOses = /* @__PURE__ */ new Set();
|
|
15
|
+
_migrations = /* @__PURE__ */ new Map();
|
|
16
|
+
_maxVersion = /* @__PURE__ */ new Map();
|
|
17
|
+
registerMigration(repo, version, migration) {
|
|
18
|
+
if (this.loaded) {
|
|
19
|
+
throw new Error("Cannot register migrations after loading");
|
|
20
|
+
}
|
|
21
|
+
let map = this._migrations.get(repo);
|
|
22
|
+
if (!map) {
|
|
23
|
+
map = /* @__PURE__ */ new Map();
|
|
24
|
+
this._migrations.set(repo, map);
|
|
25
|
+
}
|
|
26
|
+
if (map.has(version)) {
|
|
27
|
+
throw new Error(`Migration for ${repo} version ${version} is already registered`);
|
|
28
|
+
}
|
|
29
|
+
map.set(version, migration);
|
|
30
|
+
const prevMax = this._maxVersion.get(repo) ?? 0;
|
|
31
|
+
if (version > prevMax) {
|
|
32
|
+
this._maxVersion.set(repo, version);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
writeLater(os, obj) {
|
|
36
|
+
this._pendingWrites.push([os, obj]);
|
|
37
|
+
this._pendingWritesOses.add(os);
|
|
38
|
+
}
|
|
39
|
+
async _load() {
|
|
40
|
+
this.db = await new Promise((resolve, reject) => {
|
|
41
|
+
const req = indexedDB.open(this._dbName, Date.now());
|
|
42
|
+
req.onerror = () => reject(req.error);
|
|
43
|
+
const postUpgrade = [];
|
|
44
|
+
req.onsuccess = async () => {
|
|
45
|
+
try {
|
|
46
|
+
for (const cb of postUpgrade) {
|
|
47
|
+
await cb(req.result);
|
|
48
|
+
}
|
|
49
|
+
resolve(req.result);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
reject(e);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
req.onupgradeneeded = () => {
|
|
55
|
+
const db = req.result;
|
|
56
|
+
const didUpgrade = /* @__PURE__ */ new Set();
|
|
57
|
+
const doUpgrade = (repo, fromVersion) => {
|
|
58
|
+
const migrations = this._migrations.get(repo);
|
|
59
|
+
if (!migrations) return;
|
|
60
|
+
const targetVer = this._maxVersion.get(repo);
|
|
61
|
+
while (fromVersion < targetVer) {
|
|
62
|
+
const nextVersion = fromVersion + 1;
|
|
63
|
+
const migration = migrations.get(nextVersion);
|
|
64
|
+
if (!migration) {
|
|
65
|
+
throw new Error(`No migration for ${repo} to version ${nextVersion}`);
|
|
66
|
+
}
|
|
67
|
+
const result = migration(db);
|
|
68
|
+
if (result) {
|
|
69
|
+
postUpgrade.push(result);
|
|
70
|
+
}
|
|
71
|
+
fromVersion = nextVersion;
|
|
72
|
+
}
|
|
73
|
+
didUpgrade.add(repo);
|
|
74
|
+
db.createObjectStore(`${REPO_VERSION_PREFIX}${repo}:${targetVer}`);
|
|
75
|
+
};
|
|
76
|
+
for (const key of db.objectStoreNames) {
|
|
77
|
+
if (!key.startsWith(REPO_VERSION_PREFIX)) continue;
|
|
78
|
+
const [, repo, version] = key.split(":");
|
|
79
|
+
const currentVer = Number(version);
|
|
80
|
+
db.deleteObjectStore(key);
|
|
81
|
+
doUpgrade(repo, currentVer);
|
|
82
|
+
didUpgrade.add(repo);
|
|
83
|
+
}
|
|
84
|
+
for (const repo of this._migrations.keys()) {
|
|
85
|
+
if (didUpgrade.has(repo)) continue;
|
|
86
|
+
doUpgrade(repo, 0);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async _save() {
|
|
92
|
+
if (this._pendingWritesOses.size === 0) return;
|
|
93
|
+
const writes = this._pendingWrites;
|
|
94
|
+
const oses = this._pendingWritesOses;
|
|
95
|
+
this._pendingWrites = [];
|
|
96
|
+
this._pendingWritesOses = /* @__PURE__ */ new Set();
|
|
97
|
+
const tx = this.db.transaction(oses, "readwrite");
|
|
98
|
+
const osMap = /* @__PURE__ */ new Map();
|
|
99
|
+
for (const table of oses) {
|
|
100
|
+
osMap.set(table, tx.objectStore(table));
|
|
101
|
+
}
|
|
102
|
+
for (const [table, obj] of writes) {
|
|
103
|
+
const os = osMap.get(table);
|
|
104
|
+
if (obj === null) {
|
|
105
|
+
os.delete(table);
|
|
106
|
+
} else {
|
|
107
|
+
os.put(obj);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
await txToPromise(tx);
|
|
111
|
+
}
|
|
112
|
+
_destroy() {
|
|
113
|
+
this.db.close();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export {
|
|
117
|
+
IdbStorageDriver
|
|
118
|
+
};
|
package/idb/index.cjs
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
|
|
2
|
+
globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
|
|
3
|
+
console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
|
|
4
|
+
console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
|
|
5
|
+
}
|
|
6
|
+
"use strict";
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
8
|
+
const driver = require("./driver.cjs");
|
|
9
|
+
const authKeys = require("./repository/auth-keys.cjs");
|
|
10
|
+
const kv = require("./repository/kv.cjs");
|
|
11
|
+
const peers = require("./repository/peers.cjs");
|
|
12
|
+
const refMessages = require("./repository/ref-messages.cjs");
|
|
13
|
+
class IdbStorage {
|
|
14
|
+
constructor(dbName) {
|
|
15
|
+
this.dbName = dbName;
|
|
16
|
+
this.driver = new driver.IdbStorageDriver(this.dbName);
|
|
17
|
+
this.kv = new kv.IdbKvRepository(this.driver);
|
|
18
|
+
this.authKeys = new authKeys.IdbAuthKeysRepository(this.driver);
|
|
19
|
+
this.peers = new peers.IdbPeersRepository(this.driver);
|
|
20
|
+
this.refMessages = new refMessages.IdbRefMsgRepository(this.driver);
|
|
21
|
+
}
|
|
22
|
+
driver;
|
|
23
|
+
kv;
|
|
24
|
+
authKeys;
|
|
25
|
+
peers;
|
|
26
|
+
refMessages;
|
|
27
|
+
}
|
|
28
|
+
exports.IdbStorageDriver = driver.IdbStorageDriver;
|
|
29
|
+
exports.IdbStorage = IdbStorage;
|
package/idb/index.d.cts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IMtStorageProvider } from '@mtcute/core';
|
|
2
|
+
import { IdbStorageDriver } from './driver.js';
|
|
3
|
+
import { IdbAuthKeysRepository } from './repository/auth-keys.js';
|
|
4
|
+
import { IdbKvRepository } from './repository/kv.js';
|
|
5
|
+
import { IdbPeersRepository } from './repository/peers.js';
|
|
6
|
+
import { IdbRefMsgRepository } from './repository/ref-messages.js';
|
|
7
|
+
export { IdbStorageDriver } from './driver.js';
|
|
8
|
+
/**
|
|
9
|
+
* mtcute storage that uses IndexedDB as a backend.
|
|
10
|
+
*
|
|
11
|
+
* This storage is the default one for browsers, and is generally
|
|
12
|
+
* recommended over local storage based one.
|
|
13
|
+
*/
|
|
14
|
+
export declare class IdbStorage implements IMtStorageProvider {
|
|
15
|
+
readonly dbName: string;
|
|
16
|
+
readonly driver: IdbStorageDriver;
|
|
17
|
+
readonly kv: IdbKvRepository;
|
|
18
|
+
readonly authKeys: IdbAuthKeysRepository;
|
|
19
|
+
readonly peers: IdbPeersRepository;
|
|
20
|
+
readonly refMessages: IdbRefMsgRepository;
|
|
21
|
+
constructor(dbName: string);
|
|
22
|
+
}
|
package/idb/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { IdbStorageDriver } from "./driver.js";
|
|
2
|
+
import { IdbAuthKeysRepository } from "./repository/auth-keys.js";
|
|
3
|
+
import { IdbKvRepository } from "./repository/kv.js";
|
|
4
|
+
import { IdbPeersRepository } from "./repository/peers.js";
|
|
5
|
+
import { IdbRefMsgRepository } from "./repository/ref-messages.js";
|
|
6
|
+
class IdbStorage {
|
|
7
|
+
constructor(dbName) {
|
|
8
|
+
this.dbName = dbName;
|
|
9
|
+
this.driver = new IdbStorageDriver(this.dbName);
|
|
10
|
+
this.kv = new IdbKvRepository(this.driver);
|
|
11
|
+
this.authKeys = new IdbAuthKeysRepository(this.driver);
|
|
12
|
+
this.peers = new IdbPeersRepository(this.driver);
|
|
13
|
+
this.refMessages = new IdbRefMsgRepository(this.driver);
|
|
14
|
+
}
|
|
15
|
+
driver;
|
|
16
|
+
kv;
|
|
17
|
+
authKeys;
|
|
18
|
+
peers;
|
|
19
|
+
refMessages;
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
IdbStorage,
|
|
23
|
+
IdbStorageDriver
|
|
24
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
|
|
2
|
+
globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
|
|
3
|
+
console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
|
|
4
|
+
console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
|
|
5
|
+
}
|
|
6
|
+
"use strict";
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
8
|
+
const utils = require("../utils.cjs");
|
|
9
|
+
const TABLE_AUTH_KEYS = "authKeys";
|
|
10
|
+
const TABLE_TEMP_AUTH_KEYS = "tempAuthKeys";
|
|
11
|
+
class IdbAuthKeysRepository {
|
|
12
|
+
constructor(_driver) {
|
|
13
|
+
this._driver = _driver;
|
|
14
|
+
_driver.registerMigration(TABLE_AUTH_KEYS, 1, (db) => {
|
|
15
|
+
db.createObjectStore(TABLE_AUTH_KEYS, { keyPath: "dc" });
|
|
16
|
+
db.createObjectStore(TABLE_TEMP_AUTH_KEYS, { keyPath: ["dc", "idx"] });
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
os(mode) {
|
|
20
|
+
return this._driver.db.transaction(TABLE_AUTH_KEYS, mode).objectStore(TABLE_AUTH_KEYS);
|
|
21
|
+
}
|
|
22
|
+
async set(dc, key) {
|
|
23
|
+
const os = this.os("readwrite");
|
|
24
|
+
if (key === null) {
|
|
25
|
+
return utils.reqToPromise(os.delete(dc));
|
|
26
|
+
}
|
|
27
|
+
await utils.reqToPromise(os.put({ dc, key }));
|
|
28
|
+
}
|
|
29
|
+
async get(dc) {
|
|
30
|
+
const os = this.os();
|
|
31
|
+
const it = await utils.reqToPromise(os.get(dc));
|
|
32
|
+
if (it === void 0) return null;
|
|
33
|
+
return it.key;
|
|
34
|
+
}
|
|
35
|
+
osTemp(mode) {
|
|
36
|
+
return this._driver.db.transaction(TABLE_TEMP_AUTH_KEYS, mode).objectStore(TABLE_TEMP_AUTH_KEYS);
|
|
37
|
+
}
|
|
38
|
+
async setTemp(dc, idx, key, expires) {
|
|
39
|
+
const os = this.osTemp("readwrite");
|
|
40
|
+
if (!key) {
|
|
41
|
+
return utils.reqToPromise(os.delete([dc, idx]));
|
|
42
|
+
}
|
|
43
|
+
await utils.reqToPromise(os.put({ dc, idx, key, expiresAt: expires }));
|
|
44
|
+
}
|
|
45
|
+
async getTemp(dc, idx, now) {
|
|
46
|
+
const os = this.osTemp();
|
|
47
|
+
const row = await utils.reqToPromise(os.get([dc, idx]));
|
|
48
|
+
if (row === void 0 || row.expiresAt < now) return null;
|
|
49
|
+
return row.key;
|
|
50
|
+
}
|
|
51
|
+
async deleteByDc(dc) {
|
|
52
|
+
const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], "readwrite");
|
|
53
|
+
tx.objectStore(TABLE_AUTH_KEYS).delete(dc);
|
|
54
|
+
const tempOs = tx.objectStore(TABLE_TEMP_AUTH_KEYS);
|
|
55
|
+
const keys = await utils.reqToPromise(tempOs.getAllKeys());
|
|
56
|
+
for (const key of keys) {
|
|
57
|
+
if (key[0] === dc) {
|
|
58
|
+
tempOs.delete(key);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
await utils.txToPromise(tx);
|
|
62
|
+
}
|
|
63
|
+
deleteAll() {
|
|
64
|
+
const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], "readwrite");
|
|
65
|
+
tx.objectStore(TABLE_AUTH_KEYS).clear();
|
|
66
|
+
tx.objectStore(TABLE_TEMP_AUTH_KEYS).clear();
|
|
67
|
+
return utils.txToPromise(tx);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.IdbAuthKeysRepository = IdbAuthKeysRepository;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IAuthKeysRepository } from '@mtcute/core';
|
|
2
|
+
import { IdbStorageDriver } from '../driver.js';
|
|
3
|
+
export declare class IdbAuthKeysRepository implements IAuthKeysRepository {
|
|
4
|
+
readonly _driver: IdbStorageDriver;
|
|
5
|
+
constructor(_driver: IdbStorageDriver);
|
|
6
|
+
private os;
|
|
7
|
+
set(dc: number, key: Uint8Array | null): Promise<void>;
|
|
8
|
+
get(dc: number): Promise<Uint8Array | null>;
|
|
9
|
+
private osTemp;
|
|
10
|
+
setTemp(dc: number, idx: number, key: Uint8Array | null, expires: number): Promise<void>;
|
|
11
|
+
getTemp(dc: number, idx: number, now: number): Promise<Uint8Array | null>;
|
|
12
|
+
deleteByDc(dc: number): Promise<void>;
|
|
13
|
+
deleteAll(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { reqToPromise, txToPromise } from "../utils.js";
|
|
2
|
+
const TABLE_AUTH_KEYS = "authKeys";
|
|
3
|
+
const TABLE_TEMP_AUTH_KEYS = "tempAuthKeys";
|
|
4
|
+
class IdbAuthKeysRepository {
|
|
5
|
+
constructor(_driver) {
|
|
6
|
+
this._driver = _driver;
|
|
7
|
+
_driver.registerMigration(TABLE_AUTH_KEYS, 1, (db) => {
|
|
8
|
+
db.createObjectStore(TABLE_AUTH_KEYS, { keyPath: "dc" });
|
|
9
|
+
db.createObjectStore(TABLE_TEMP_AUTH_KEYS, { keyPath: ["dc", "idx"] });
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
os(mode) {
|
|
13
|
+
return this._driver.db.transaction(TABLE_AUTH_KEYS, mode).objectStore(TABLE_AUTH_KEYS);
|
|
14
|
+
}
|
|
15
|
+
async set(dc, key) {
|
|
16
|
+
const os = this.os("readwrite");
|
|
17
|
+
if (key === null) {
|
|
18
|
+
return reqToPromise(os.delete(dc));
|
|
19
|
+
}
|
|
20
|
+
await reqToPromise(os.put({ dc, key }));
|
|
21
|
+
}
|
|
22
|
+
async get(dc) {
|
|
23
|
+
const os = this.os();
|
|
24
|
+
const it = await reqToPromise(os.get(dc));
|
|
25
|
+
if (it === void 0) return null;
|
|
26
|
+
return it.key;
|
|
27
|
+
}
|
|
28
|
+
osTemp(mode) {
|
|
29
|
+
return this._driver.db.transaction(TABLE_TEMP_AUTH_KEYS, mode).objectStore(TABLE_TEMP_AUTH_KEYS);
|
|
30
|
+
}
|
|
31
|
+
async setTemp(dc, idx, key, expires) {
|
|
32
|
+
const os = this.osTemp("readwrite");
|
|
33
|
+
if (!key) {
|
|
34
|
+
return reqToPromise(os.delete([dc, idx]));
|
|
35
|
+
}
|
|
36
|
+
await reqToPromise(os.put({ dc, idx, key, expiresAt: expires }));
|
|
37
|
+
}
|
|
38
|
+
async getTemp(dc, idx, now) {
|
|
39
|
+
const os = this.osTemp();
|
|
40
|
+
const row = await reqToPromise(os.get([dc, idx]));
|
|
41
|
+
if (row === void 0 || row.expiresAt < now) return null;
|
|
42
|
+
return row.key;
|
|
43
|
+
}
|
|
44
|
+
async deleteByDc(dc) {
|
|
45
|
+
const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], "readwrite");
|
|
46
|
+
tx.objectStore(TABLE_AUTH_KEYS).delete(dc);
|
|
47
|
+
const tempOs = tx.objectStore(TABLE_TEMP_AUTH_KEYS);
|
|
48
|
+
const keys = await reqToPromise(tempOs.getAllKeys());
|
|
49
|
+
for (const key of keys) {
|
|
50
|
+
if (key[0] === dc) {
|
|
51
|
+
tempOs.delete(key);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
await txToPromise(tx);
|
|
55
|
+
}
|
|
56
|
+
deleteAll() {
|
|
57
|
+
const tx = this._driver.db.transaction([TABLE_AUTH_KEYS, TABLE_TEMP_AUTH_KEYS], "readwrite");
|
|
58
|
+
tx.objectStore(TABLE_AUTH_KEYS).clear();
|
|
59
|
+
tx.objectStore(TABLE_TEMP_AUTH_KEYS).clear();
|
|
60
|
+
return txToPromise(tx);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
IdbAuthKeysRepository
|
|
65
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
|
|
2
|
+
globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
|
|
3
|
+
console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
|
|
4
|
+
console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
|
|
5
|
+
}
|
|
6
|
+
"use strict";
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
8
|
+
const utils = require("../utils.cjs");
|
|
9
|
+
const KV_TABLE = "kv";
|
|
10
|
+
class IdbKvRepository {
|
|
11
|
+
constructor(_driver) {
|
|
12
|
+
this._driver = _driver;
|
|
13
|
+
_driver.registerMigration(KV_TABLE, 1, (db) => {
|
|
14
|
+
db.createObjectStore(KV_TABLE, { keyPath: "key" });
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
set(key, value) {
|
|
18
|
+
this._driver.writeLater(KV_TABLE, { key, value });
|
|
19
|
+
}
|
|
20
|
+
os(mode) {
|
|
21
|
+
return this._driver.db.transaction(KV_TABLE, mode).objectStore(KV_TABLE);
|
|
22
|
+
}
|
|
23
|
+
async get(key) {
|
|
24
|
+
const os = this.os();
|
|
25
|
+
const res = await utils.reqToPromise(os.get(key));
|
|
26
|
+
if (res === void 0) return null;
|
|
27
|
+
return res.value;
|
|
28
|
+
}
|
|
29
|
+
async delete(key) {
|
|
30
|
+
await utils.reqToPromise(this.os("readwrite").delete(key));
|
|
31
|
+
}
|
|
32
|
+
async deleteAll() {
|
|
33
|
+
await utils.reqToPromise(this.os("readwrite").clear());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.IdbKvRepository = IdbKvRepository;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IKeyValueRepository } from '@mtcute/core';
|
|
2
|
+
import { IdbStorageDriver } from '../driver.js';
|
|
3
|
+
export declare class IdbKvRepository implements IKeyValueRepository {
|
|
4
|
+
readonly _driver: IdbStorageDriver;
|
|
5
|
+
constructor(_driver: IdbStorageDriver);
|
|
6
|
+
set(key: string, value: Uint8Array): void;
|
|
7
|
+
private os;
|
|
8
|
+
get(key: string): Promise<Uint8Array | null>;
|
|
9
|
+
delete(key: string): Promise<void>;
|
|
10
|
+
deleteAll(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { reqToPromise } from "../utils.js";
|
|
2
|
+
const KV_TABLE = "kv";
|
|
3
|
+
class IdbKvRepository {
|
|
4
|
+
constructor(_driver) {
|
|
5
|
+
this._driver = _driver;
|
|
6
|
+
_driver.registerMigration(KV_TABLE, 1, (db) => {
|
|
7
|
+
db.createObjectStore(KV_TABLE, { keyPath: "key" });
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
set(key, value) {
|
|
11
|
+
this._driver.writeLater(KV_TABLE, { key, value });
|
|
12
|
+
}
|
|
13
|
+
os(mode) {
|
|
14
|
+
return this._driver.db.transaction(KV_TABLE, mode).objectStore(KV_TABLE);
|
|
15
|
+
}
|
|
16
|
+
async get(key) {
|
|
17
|
+
const os = this.os();
|
|
18
|
+
const res = await reqToPromise(os.get(key));
|
|
19
|
+
if (res === void 0) return null;
|
|
20
|
+
return res.value;
|
|
21
|
+
}
|
|
22
|
+
async delete(key) {
|
|
23
|
+
await reqToPromise(this.os("readwrite").delete(key));
|
|
24
|
+
}
|
|
25
|
+
async deleteAll() {
|
|
26
|
+
await reqToPromise(this.os("readwrite").clear());
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
IdbKvRepository
|
|
31
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
|
|
2
|
+
globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
|
|
3
|
+
console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
|
|
4
|
+
console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
|
|
5
|
+
}
|
|
6
|
+
"use strict";
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
8
|
+
const utils = require("../utils.cjs");
|
|
9
|
+
const TABLE = "peers";
|
|
10
|
+
class IdbPeersRepository {
|
|
11
|
+
constructor(_driver) {
|
|
12
|
+
this._driver = _driver;
|
|
13
|
+
_driver.registerMigration(TABLE, 1, (db) => {
|
|
14
|
+
const os = db.createObjectStore(TABLE, { keyPath: "id" });
|
|
15
|
+
os.createIndex("by_username", "usernames", { unique: true, multiEntry: true });
|
|
16
|
+
os.createIndex("by_phone", "phone", { unique: true });
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
store(peer) {
|
|
20
|
+
this._driver.writeLater(TABLE, peer);
|
|
21
|
+
}
|
|
22
|
+
os(mode) {
|
|
23
|
+
return this._driver.db.transaction(TABLE, mode).objectStore(TABLE);
|
|
24
|
+
}
|
|
25
|
+
async getById(id, allowMin) {
|
|
26
|
+
const it = await utils.reqToPromise(this.os().get(id));
|
|
27
|
+
if (!it) return null;
|
|
28
|
+
if (it.isMin && !allowMin) return null;
|
|
29
|
+
return it;
|
|
30
|
+
}
|
|
31
|
+
async getByUsername(username) {
|
|
32
|
+
const it = await utils.reqToPromise(
|
|
33
|
+
this.os().index("by_username").get(username)
|
|
34
|
+
);
|
|
35
|
+
if (!it || it.isMin) return null;
|
|
36
|
+
return it;
|
|
37
|
+
}
|
|
38
|
+
async getByPhone(phone) {
|
|
39
|
+
const it = await utils.reqToPromise(this.os().index("by_phone").get(phone));
|
|
40
|
+
if (!it || it.isMin) return null;
|
|
41
|
+
return it;
|
|
42
|
+
}
|
|
43
|
+
deleteAll() {
|
|
44
|
+
return utils.reqToPromise(this.os("readwrite").clear());
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.IdbPeersRepository = IdbPeersRepository;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IPeersRepository } from '@mtcute/core';
|
|
2
|
+
import { IdbStorageDriver } from '../driver.js';
|
|
3
|
+
export declare class IdbPeersRepository implements IPeersRepository {
|
|
4
|
+
readonly _driver: IdbStorageDriver;
|
|
5
|
+
constructor(_driver: IdbStorageDriver);
|
|
6
|
+
store(peer: IPeersRepository.PeerInfo): void;
|
|
7
|
+
private os;
|
|
8
|
+
getById(id: number, allowMin: boolean): Promise<IPeersRepository.PeerInfo | null>;
|
|
9
|
+
getByUsername(username: string): Promise<IPeersRepository.PeerInfo | null>;
|
|
10
|
+
getByPhone(phone: string): Promise<IPeersRepository.PeerInfo | null>;
|
|
11
|
+
deleteAll(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { reqToPromise } from "../utils.js";
|
|
2
|
+
const TABLE = "peers";
|
|
3
|
+
class IdbPeersRepository {
|
|
4
|
+
constructor(_driver) {
|
|
5
|
+
this._driver = _driver;
|
|
6
|
+
_driver.registerMigration(TABLE, 1, (db) => {
|
|
7
|
+
const os = db.createObjectStore(TABLE, { keyPath: "id" });
|
|
8
|
+
os.createIndex("by_username", "usernames", { unique: true, multiEntry: true });
|
|
9
|
+
os.createIndex("by_phone", "phone", { unique: true });
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
store(peer) {
|
|
13
|
+
this._driver.writeLater(TABLE, peer);
|
|
14
|
+
}
|
|
15
|
+
os(mode) {
|
|
16
|
+
return this._driver.db.transaction(TABLE, mode).objectStore(TABLE);
|
|
17
|
+
}
|
|
18
|
+
async getById(id, allowMin) {
|
|
19
|
+
const it = await reqToPromise(this.os().get(id));
|
|
20
|
+
if (!it) return null;
|
|
21
|
+
if (it.isMin && !allowMin) return null;
|
|
22
|
+
return it;
|
|
23
|
+
}
|
|
24
|
+
async getByUsername(username) {
|
|
25
|
+
const it = await reqToPromise(
|
|
26
|
+
this.os().index("by_username").get(username)
|
|
27
|
+
);
|
|
28
|
+
if (!it || it.isMin) return null;
|
|
29
|
+
return it;
|
|
30
|
+
}
|
|
31
|
+
async getByPhone(phone) {
|
|
32
|
+
const it = await reqToPromise(this.os().index("by_phone").get(phone));
|
|
33
|
+
if (!it || it.isMin) return null;
|
|
34
|
+
return it;
|
|
35
|
+
}
|
|
36
|
+
deleteAll() {
|
|
37
|
+
return reqToPromise(this.os("readwrite").clear());
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
IdbPeersRepository
|
|
42
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
|
|
2
|
+
globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
|
|
3
|
+
console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
|
|
4
|
+
console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
|
|
5
|
+
}
|
|
6
|
+
"use strict";
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
8
|
+
const utils = require("../utils.cjs");
|
|
9
|
+
const TABLE = "messageRefs";
|
|
10
|
+
class IdbRefMsgRepository {
|
|
11
|
+
constructor(_driver) {
|
|
12
|
+
this._driver = _driver;
|
|
13
|
+
_driver.registerMigration(TABLE, 1, (db) => {
|
|
14
|
+
const os = db.createObjectStore(TABLE, { keyPath: ["peerId", "chatId", "msgId"] });
|
|
15
|
+
os.createIndex("by_peer", "peerId");
|
|
16
|
+
os.createIndex("by_msg", ["chatId", "msgId"]);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
os(mode) {
|
|
20
|
+
return this._driver.db.transaction(TABLE, mode).objectStore(TABLE);
|
|
21
|
+
}
|
|
22
|
+
async store(peerId, chatId, msgId) {
|
|
23
|
+
const os = this.os("readwrite");
|
|
24
|
+
await utils.reqToPromise(os.put({ peerId, chatId, msgId }));
|
|
25
|
+
}
|
|
26
|
+
async getByPeer(peerId) {
|
|
27
|
+
const os = this.os();
|
|
28
|
+
const index = os.index("by_peer");
|
|
29
|
+
const it = await utils.reqToPromise(index.get(peerId));
|
|
30
|
+
if (!it) return null;
|
|
31
|
+
return [it.chatId, it.msgId];
|
|
32
|
+
}
|
|
33
|
+
async delete(chatId, msgIds) {
|
|
34
|
+
const tx = this._driver.db.transaction(TABLE, "readwrite");
|
|
35
|
+
const os = tx.objectStore(TABLE);
|
|
36
|
+
const index = os.index("by_msg");
|
|
37
|
+
for (const msgId of msgIds) {
|
|
38
|
+
const keys = await utils.reqToPromise(index.getAllKeys([chatId, msgId]));
|
|
39
|
+
for (const key of keys) {
|
|
40
|
+
os.delete(key);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return utils.txToPromise(tx);
|
|
44
|
+
}
|
|
45
|
+
async deleteByPeer(peerId) {
|
|
46
|
+
const tx = this._driver.db.transaction(TABLE, "readwrite");
|
|
47
|
+
const os = tx.objectStore(TABLE);
|
|
48
|
+
const index = os.index("by_peer");
|
|
49
|
+
const req = index.openCursor(peerId);
|
|
50
|
+
let cursor = await utils.reqToPromise(req);
|
|
51
|
+
while (cursor) {
|
|
52
|
+
cursor.delete();
|
|
53
|
+
cursor.continue();
|
|
54
|
+
cursor = await utils.reqToPromise(req);
|
|
55
|
+
}
|
|
56
|
+
return utils.txToPromise(tx);
|
|
57
|
+
}
|
|
58
|
+
async deleteAll() {
|
|
59
|
+
await utils.reqToPromise(this.os("readwrite").clear());
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.IdbRefMsgRepository = IdbRefMsgRepository;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IReferenceMessagesRepository } from '@mtcute/core';
|
|
2
|
+
import { IdbStorageDriver } from '../driver.js';
|
|
3
|
+
export declare class IdbRefMsgRepository implements IReferenceMessagesRepository {
|
|
4
|
+
readonly _driver: IdbStorageDriver;
|
|
5
|
+
constructor(_driver: IdbStorageDriver);
|
|
6
|
+
private os;
|
|
7
|
+
store(peerId: number, chatId: number, msgId: number): Promise<void>;
|
|
8
|
+
getByPeer(peerId: number): Promise<[number, number] | null>;
|
|
9
|
+
delete(chatId: number, msgIds: number[]): Promise<void>;
|
|
10
|
+
deleteByPeer(peerId: number): Promise<void>;
|
|
11
|
+
deleteAll(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { reqToPromise, txToPromise } from "../utils.js";
|
|
2
|
+
const TABLE = "messageRefs";
|
|
3
|
+
class IdbRefMsgRepository {
|
|
4
|
+
constructor(_driver) {
|
|
5
|
+
this._driver = _driver;
|
|
6
|
+
_driver.registerMigration(TABLE, 1, (db) => {
|
|
7
|
+
const os = db.createObjectStore(TABLE, { keyPath: ["peerId", "chatId", "msgId"] });
|
|
8
|
+
os.createIndex("by_peer", "peerId");
|
|
9
|
+
os.createIndex("by_msg", ["chatId", "msgId"]);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
os(mode) {
|
|
13
|
+
return this._driver.db.transaction(TABLE, mode).objectStore(TABLE);
|
|
14
|
+
}
|
|
15
|
+
async store(peerId, chatId, msgId) {
|
|
16
|
+
const os = this.os("readwrite");
|
|
17
|
+
await reqToPromise(os.put({ peerId, chatId, msgId }));
|
|
18
|
+
}
|
|
19
|
+
async getByPeer(peerId) {
|
|
20
|
+
const os = this.os();
|
|
21
|
+
const index = os.index("by_peer");
|
|
22
|
+
const it = await reqToPromise(index.get(peerId));
|
|
23
|
+
if (!it) return null;
|
|
24
|
+
return [it.chatId, it.msgId];
|
|
25
|
+
}
|
|
26
|
+
async delete(chatId, msgIds) {
|
|
27
|
+
const tx = this._driver.db.transaction(TABLE, "readwrite");
|
|
28
|
+
const os = tx.objectStore(TABLE);
|
|
29
|
+
const index = os.index("by_msg");
|
|
30
|
+
for (const msgId of msgIds) {
|
|
31
|
+
const keys = await reqToPromise(index.getAllKeys([chatId, msgId]));
|
|
32
|
+
for (const key of keys) {
|
|
33
|
+
os.delete(key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return txToPromise(tx);
|
|
37
|
+
}
|
|
38
|
+
async deleteByPeer(peerId) {
|
|
39
|
+
const tx = this._driver.db.transaction(TABLE, "readwrite");
|
|
40
|
+
const os = tx.objectStore(TABLE);
|
|
41
|
+
const index = os.index("by_peer");
|
|
42
|
+
const req = index.openCursor(peerId);
|
|
43
|
+
let cursor = await reqToPromise(req);
|
|
44
|
+
while (cursor) {
|
|
45
|
+
cursor.delete();
|
|
46
|
+
cursor.continue();
|
|
47
|
+
cursor = await reqToPromise(req);
|
|
48
|
+
}
|
|
49
|
+
return txToPromise(tx);
|
|
50
|
+
}
|
|
51
|
+
async deleteAll() {
|
|
52
|
+
await reqToPromise(this.os("readwrite").clear());
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
IdbRefMsgRepository
|
|
57
|
+
};
|