@mtcute/web 0.19.3 → 0.20.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/idb/driver.cjs CHANGED
@@ -8,6 +8,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
8
  const core = require("@mtcute/core");
9
9
  const utils = require("./utils.cjs");
10
10
  const REPO_VERSION_PREFIX = "__version:";
11
+ const V2_MIGRATIONS_EPOCH = 2e12;
11
12
  class IdbStorageDriver extends core.BaseStorageDriver {
12
13
  constructor(_dbName) {
13
14
  super();
@@ -39,21 +40,42 @@ class IdbStorageDriver extends core.BaseStorageDriver {
39
40
  this._maxVersion.set(repo, version);
40
41
  }
41
42
  }
43
+ _repoCountOverride;
44
+ setRepoCountOverride(repoCount) {
45
+ if (repoCount < this._maxVersion.size) {
46
+ throw new Error(`Cannot override repo count with a lower value (we already have ${this._maxVersion.size} repos registered)`);
47
+ }
48
+ this._repoCountOverride = repoCount;
49
+ }
50
+ calculateVersion() {
51
+ const repoCount = this._maxVersion.size;
52
+ let version = (this._repoCountOverride ?? repoCount) << 8;
53
+ for (const repo of this._maxVersion.keys()) {
54
+ version += this._maxVersion.get(repo);
55
+ }
56
+ return V2_MIGRATIONS_EPOCH + version;
57
+ }
42
58
  writeLater(os, obj) {
43
59
  this._pendingWrites.push([os, obj]);
44
60
  this._pendingWritesOses.add(os);
45
61
  }
46
62
  async _load() {
47
63
  this.db = await new Promise((resolve, reject) => {
48
- const req = indexedDB.open(this._dbName, Date.now());
64
+ const req = indexedDB.open(this._dbName, this.calculateVersion());
49
65
  req.onerror = () => reject(req.error);
50
66
  const postUpgrade = [];
51
67
  req.onsuccess = async () => {
68
+ const db = req.result;
69
+ if (db.version !== this.calculateVersion()) {
70
+ const ourRepoCount = this._maxVersion.size;
71
+ const dbRepoCount = db.version - V2_MIGRATIONS_EPOCH >> 8;
72
+ reject(new Error(`IDB version number mismatch. Did some repository get removed? If so, please use \`setRepoCountOverride\` (DB has ${dbRepoCount} repos, but we have ${ourRepoCount})`));
73
+ }
52
74
  try {
53
75
  for (const cb of postUpgrade) {
54
- await cb(req.result);
76
+ await cb(db);
55
77
  }
56
- resolve(req.result);
78
+ resolve(db);
57
79
  } catch (e) {
58
80
  reject(e);
59
81
  }
package/idb/driver.d.cts CHANGED
@@ -10,6 +10,9 @@ export declare class IdbStorageDriver extends BaseStorageDriver {
10
10
  private _migrations;
11
11
  private _maxVersion;
12
12
  registerMigration(repo: string, version: number, migration: MigrationFunction): void;
13
+ private _repoCountOverride;
14
+ setRepoCountOverride(repoCount: number): void;
15
+ calculateVersion(): number;
13
16
  writeLater(os: string, obj: unknown): void;
14
17
  _load(): Promise<void>;
15
18
  _save(): Promise<void>;
package/idb/driver.d.ts CHANGED
@@ -10,6 +10,9 @@ export declare class IdbStorageDriver extends BaseStorageDriver {
10
10
  private _migrations;
11
11
  private _maxVersion;
12
12
  registerMigration(repo: string, version: number, migration: MigrationFunction): void;
13
+ private _repoCountOverride;
14
+ setRepoCountOverride(repoCount: number): void;
15
+ calculateVersion(): number;
13
16
  writeLater(os: string, obj: unknown): void;
14
17
  _load(): Promise<void>;
15
18
  _save(): Promise<void>;
package/idb/driver.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { BaseStorageDriver, MtUnsupportedError } from "@mtcute/core";
2
2
  import { txToPromise } from "./utils.js";
3
3
  const REPO_VERSION_PREFIX = "__version:";
4
+ const V2_MIGRATIONS_EPOCH = 2e12;
4
5
  class IdbStorageDriver extends BaseStorageDriver {
5
6
  constructor(_dbName) {
6
7
  super();
@@ -32,21 +33,42 @@ class IdbStorageDriver extends BaseStorageDriver {
32
33
  this._maxVersion.set(repo, version);
33
34
  }
34
35
  }
36
+ _repoCountOverride;
37
+ setRepoCountOverride(repoCount) {
38
+ if (repoCount < this._maxVersion.size) {
39
+ throw new Error(`Cannot override repo count with a lower value (we already have ${this._maxVersion.size} repos registered)`);
40
+ }
41
+ this._repoCountOverride = repoCount;
42
+ }
43
+ calculateVersion() {
44
+ const repoCount = this._maxVersion.size;
45
+ let version = (this._repoCountOverride ?? repoCount) << 8;
46
+ for (const repo of this._maxVersion.keys()) {
47
+ version += this._maxVersion.get(repo);
48
+ }
49
+ return V2_MIGRATIONS_EPOCH + version;
50
+ }
35
51
  writeLater(os, obj) {
36
52
  this._pendingWrites.push([os, obj]);
37
53
  this._pendingWritesOses.add(os);
38
54
  }
39
55
  async _load() {
40
56
  this.db = await new Promise((resolve, reject) => {
41
- const req = indexedDB.open(this._dbName, Date.now());
57
+ const req = indexedDB.open(this._dbName, this.calculateVersion());
42
58
  req.onerror = () => reject(req.error);
43
59
  const postUpgrade = [];
44
60
  req.onsuccess = async () => {
61
+ const db = req.result;
62
+ if (db.version !== this.calculateVersion()) {
63
+ const ourRepoCount = this._maxVersion.size;
64
+ const dbRepoCount = db.version - V2_MIGRATIONS_EPOCH >> 8;
65
+ reject(new Error(`IDB version number mismatch. Did some repository get removed? If so, please use \`setRepoCountOverride\` (DB has ${dbRepoCount} repos, but we have ${ourRepoCount})`));
66
+ }
45
67
  try {
46
68
  for (const cb of postUpgrade) {
47
- await cb(req.result);
69
+ await cb(db);
48
70
  }
49
- resolve(req.result);
71
+ resolve(db);
50
72
  } catch (e) {
51
73
  reject(e);
52
74
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@mtcute/web",
3
3
  "type": "module",
4
- "version": "0.19.3",
4
+ "version": "0.20.0",
5
5
  "description": "Meta-package for the web platform",
6
6
  "license": "MIT",
7
7
  "dependencies": {
8
- "@mtcute/core": "^0.19.3",
9
- "@mtcute/wasm": "^0.19.0",
8
+ "@mtcute/core": "^0.20.0",
9
+ "@mtcute/wasm": "^0.19.9",
10
10
  "@fuman/net": "0.0.9"
11
11
  },
12
12
  "exports": {
package/platform.cjs CHANGED
@@ -25,11 +25,11 @@ class WebPlatform {
25
25
  if (!("onLine" in navigator)) return () => {
26
26
  };
27
27
  const onlineHandler = () => fn(navigator.onLine);
28
- window.addEventListener("online", onlineHandler);
29
- window.addEventListener("offline", onlineHandler);
28
+ globalThis.addEventListener("online", onlineHandler);
29
+ globalThis.addEventListener("offline", onlineHandler);
30
30
  return () => {
31
- window.removeEventListener("online", onlineHandler);
32
- window.removeEventListener("offline", onlineHandler);
31
+ globalThis.removeEventListener("online", onlineHandler);
32
+ globalThis.removeEventListener("offline", onlineHandler);
33
33
  };
34
34
  }
35
35
  isOnline() {
package/platform.js CHANGED
@@ -18,11 +18,11 @@ class WebPlatform {
18
18
  if (!("onLine" in navigator)) return () => {
19
19
  };
20
20
  const onlineHandler = () => fn(navigator.onLine);
21
- window.addEventListener("online", onlineHandler);
22
- window.addEventListener("offline", onlineHandler);
21
+ globalThis.addEventListener("online", onlineHandler);
22
+ globalThis.addEventListener("offline", onlineHandler);
23
23
  return () => {
24
- window.removeEventListener("online", onlineHandler);
25
- window.removeEventListener("offline", onlineHandler);
24
+ globalThis.removeEventListener("online", onlineHandler);
25
+ globalThis.removeEventListener("offline", onlineHandler);
26
26
  };
27
27
  }
28
28
  isOnline() {