@evolu/common 6.0.1-preview.29 → 6.0.1-preview.30
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/dist/src/Buffer.js +7 -6
- package/dist/src/Callbacks.d.ts +53 -0
- package/dist/src/Callbacks.d.ts.map +1 -0
- package/dist/src/Callbacks.js +25 -0
- package/dist/src/Crypto.js +3 -3
- package/dist/src/Evolu/Db.d.ts +1 -1
- package/dist/src/Evolu/Db.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.js +12 -12
- package/dist/src/Evolu/Owner.d.ts +1 -1
- package/dist/src/Evolu/Owner.d.ts.map +1 -1
- package/dist/src/Evolu/Owner.js +2 -2
- package/dist/src/Evolu/Protocol.d.ts +12 -12
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +30 -27
- package/dist/src/Evolu/Relay.d.ts +4 -3
- package/dist/src/Evolu/Relay.d.ts.map +1 -1
- package/dist/src/Evolu/Relay.js +6 -8
- package/dist/src/Evolu/Storage.d.ts +7 -8
- package/dist/src/Evolu/Storage.d.ts.map +1 -1
- package/dist/src/Evolu/Storage.js +5 -5
- package/dist/src/Evolu/Sync.d.ts.map +1 -1
- package/dist/src/Evolu/Sync.js +4 -3
- package/dist/src/Evolu/Timestamp.d.ts +1 -0
- package/dist/src/Evolu/Timestamp.d.ts.map +1 -1
- package/dist/src/Evolu/Timestamp.js +1 -0
- package/dist/src/Instances.d.ts +1 -1
- package/dist/src/Instances.d.ts.map +1 -1
- package/dist/src/Instances.js +1 -1
- package/dist/src/Number.d.ts +2 -2
- package/dist/src/Number.d.ts.map +1 -1
- package/dist/src/Number.js +5 -4
- package/dist/src/{RefCountedResourceManager.d.ts → Resources.d.ts} +14 -15
- package/dist/src/Resources.d.ts.map +1 -0
- package/dist/src/{RefCountedResourceManager.js → Resources.js} +24 -24
- package/dist/src/Result.d.ts +1 -1
- package/dist/src/Skiplist.js +2 -1
- package/dist/src/Task.js +3 -3
- package/dist/src/Time.js +2 -2
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/package.json +1 -1
- package/src/Buffer.ts +6 -6
- package/src/{CallbackRegistry.ts → Callbacks.ts} +28 -29
- package/src/Crypto.ts +3 -3
- package/src/Evolu/Db.ts +1 -1
- package/src/Evolu/Evolu.ts +12 -16
- package/src/Evolu/Owner.ts +1 -1
- package/src/Evolu/Protocol.ts +32 -26
- package/src/Evolu/Relay.ts +13 -14
- package/src/Evolu/Storage.ts +10 -11
- package/src/Evolu/Sync.ts +4 -3
- package/src/Evolu/Timestamp.ts +1 -0
- package/src/Instances.ts +1 -1
- package/src/Number.ts +4 -4
- package/src/{RefCountedResourceManager.ts → Resources.ts} +29 -30
- package/src/Result.ts +1 -1
- package/src/Skiplist.ts +1 -1
- package/src/Task.ts +2 -2
- package/src/Time.ts +1 -1
- package/src/index.ts +2 -1
- package/dist/src/CallbackRegistry.d.ts +0 -53
- package/dist/src/CallbackRegistry.d.ts.map +0 -1
- package/dist/src/CallbackRegistry.js +0 -25
- package/dist/src/RefCountedResourceManager.d.ts.map +0 -1
package/dist/src/Evolu/Relay.js
CHANGED
|
@@ -93,14 +93,12 @@ export const createRelaySqliteStorage = (deps) => (config) => {
|
|
|
93
93
|
const storedBytes = storedBytesResult.value.rows[0]?.storedBytes ?? 0;
|
|
94
94
|
const incomingBytes = newMessages.reduce((sum, m) => sum + m.change.length, 0);
|
|
95
95
|
const newStoredBytes = PositiveInt.orThrow(storedBytes + incomingBytes);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return err({ type: "StorageQuotaError", ownerId });
|
|
103
|
-
}
|
|
96
|
+
const withinQuotaResult = config.isOwnerWithinQuota(ownerId, newStoredBytes);
|
|
97
|
+
const isWithinQuota = isAsync(withinQuotaResult)
|
|
98
|
+
? await withinQuotaResult
|
|
99
|
+
: withinQuotaResult;
|
|
100
|
+
if (!isWithinQuota) {
|
|
101
|
+
return err({ type: "StorageQuotaError", ownerId });
|
|
104
102
|
}
|
|
105
103
|
return deps.sqlite.transaction(() => {
|
|
106
104
|
for (const { timestamp, change } of newMessages) {
|
|
@@ -9,13 +9,12 @@ import { BaseOwnerError, OwnerId, OwnerIdBytes, OwnerWriteKey } from "./Owner.js
|
|
|
9
9
|
import { Timestamp, TimestampBytes } from "./Timestamp.js";
|
|
10
10
|
export interface StorageConfig {
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* allowed regardless of size.
|
|
12
|
+
* Callback called before an attempt to write, to check if an {@link OwnerId}
|
|
13
|
+
* has sufficient quota for the write.
|
|
15
14
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* The callback receives the {@link OwnerId} and the number of bytes required
|
|
16
|
+
* for the write, and returns a {@link MaybeAsync} boolean: `true` to allow the
|
|
17
|
+
* write, or `false` to deny it due to quota limits.
|
|
19
18
|
*
|
|
20
19
|
* The callback can be synchronous (for SQLite or in-memory checks) or
|
|
21
20
|
* asynchronous (for calling remote APIs).
|
|
@@ -38,7 +37,7 @@ export interface StorageConfig {
|
|
|
38
37
|
* };
|
|
39
38
|
* ```
|
|
40
39
|
*/
|
|
41
|
-
readonly isOwnerWithinQuota
|
|
40
|
+
readonly isOwnerWithinQuota: (ownerId: OwnerId, requiredBytes: PositiveInt) => MaybeAsync<boolean>;
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
43
|
* Evolu Storage
|
|
@@ -115,7 +114,7 @@ export interface StorageQuotaError extends BaseOwnerError {
|
|
|
115
114
|
* one or more timestamps.
|
|
116
115
|
*/
|
|
117
116
|
export type Fingerprint = Uint8Array & Brand<"Fingerprint">;
|
|
118
|
-
export declare const fingerprintSize:
|
|
117
|
+
export declare const fingerprintSize: number & Brand<"Int"> & Brand<"NonNegative">;
|
|
119
118
|
/** A fingerprint of an empty range. */
|
|
120
119
|
export declare const zeroFingerprint: Fingerprint;
|
|
121
120
|
export interface BaseRange {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAM,MAAM,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAO,SAAS,EAAE,WAAW,EAAe,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAGL,cAAc,EAEd,WAAW,EAGZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EAEd,OAAO,EACP,YAAY,EAEZ,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B
|
|
1
|
+
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAM,MAAM,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAO,SAAS,EAAE,WAAW,EAAe,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAGL,cAAc,EAEd,WAAW,EAGZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EAEd,OAAO,EACP,YAAY,EAEZ,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,WAAW,KACvB,UAAU,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,cAAc,GAAG,IAAI,CAAC;IAEnE,QAAQ,CAAC,WAAW,EAAE,CACpB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,KAChB,WAAW,GAAG,IAAI,CAAC;IAExB;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,EACtC,UAAU,CAAC,EAAE,eAAe,KACzB,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAE5C,QAAQ,CAAC,cAAc,EAAE,CACvB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,eAAe,KACxB,cAAc,GAAG,IAAI,CAAC;IAE3B,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,KAAK,OAAO,KACpE,IAAI,CAAC;IAEV;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,CACzB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,aAAa,KACpB,OAAO,CAAC;IAEb,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,CACpB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,aAAa,KACpB,OAAO,CAAC;IAEb;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,EAAE,CACtB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,qBAAqB,CAAC,oBAAoB,CAAC,KAClD,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAErE,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,CACrB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc,KACtB,iBAAiB,GAAG,IAAI,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC;CAC1D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;AAE5D,eAAO,MAAM,eAAe,8CAA6B,CAAC;AAE1D,uCAAuC;AACvC,eAAO,MAAM,eAAe,EAAsC,WAAW,CAAC;AAE9E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAElE,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,QAAQ,CAAC,IAAI,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,SAAS,CAAC,WAAW,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,QAAQ,CAAC,IAAI,EAAE,OAAO,SAAS,CAAC,UAAU,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEnE,wCAAwC;AACxC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED,yBAAyB;AACzB,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;EAInB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,WAAW,iBACf,SAAQ,IAAI,CACV,OAAO,EACL,SAAS,GACT,aAAa,GACb,mBAAmB,GACnB,gBAAgB,GAChB,SAAS,GACT,aAAa,CAChB;IACD;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,CACxB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc,KACtB,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE/B;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,EAAE,CAC9B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,qBAAqB,CAAC,cAAc,CAAC,KACnD,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,6BAA8B,SAAQ,aAAa;IAClE,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC9C;AAED,eAAO,MAAM,uBAAuB,GACjC,MAAM,iBAAiB,MACvB,QAAQ,6BAA6B,KAAG,iBAgLxC,CAAC;AAMJ,eAAO,MAAM,6BAA6B,GACxC,MAAM,SAAS,KACd,MAAM,CAAC,IAAI,EAAE,WAAW,CA6E1B,CAAC;AA2hBF,eAAO,MAAM,2BAA2B,GACtC,WAAW,cAAc,KACxB,WAGF,CAAC;AAuYF,eAAO,MAAM,mBAAmB,GAC7B,MAAM,SAAS,MAEd,SAAS,YAAY,EACrB,OAAO,cAAc,KACpB,MAAM,CAAC,cAAc,EAAE,WAAW,CA6EpC,CAAC"}
|
|
@@ -4,10 +4,10 @@ import { concatBytes } from "../Buffer.js";
|
|
|
4
4
|
import { decrement } from "../Number.js";
|
|
5
5
|
import { ok } from "../Result.js";
|
|
6
6
|
import { sql, SqliteValue } from "../Sqlite.js";
|
|
7
|
-
import { Id, object, record, String, } from "../Type.js";
|
|
7
|
+
import { Id, NonNegativeInt, object, PositiveInt, record, String, } from "../Type.js";
|
|
8
8
|
import { ownerIdBytesToOwnerId, } from "./Owner.js";
|
|
9
9
|
import { orderTimestampBytes } from "./Timestamp.js";
|
|
10
|
-
export const fingerprintSize = 12;
|
|
10
|
+
export const fingerprintSize = NonNegativeInt.orThrow(12);
|
|
11
11
|
/** A fingerprint of an empty range. */
|
|
12
12
|
export const zeroFingerprint = new Uint8Array(fingerprintSize);
|
|
13
13
|
export const InfiniteUpperBound = Symbol("InfiniteUpperBound");
|
|
@@ -99,7 +99,7 @@ export const createBaseSqliteStorage = (deps) => (config) => {
|
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
for (let i = 0; i < result.value.rows.length; i++) {
|
|
102
|
-
const index = (begin + 1 + i);
|
|
102
|
+
const index = NonNegativeInt.orThrow(begin + 1 + i);
|
|
103
103
|
if (!callback(result.value.rows[i].t, index))
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
@@ -785,7 +785,7 @@ const randomSkiplistLevel = (deps) => {
|
|
|
785
785
|
level < skiplistMaxLevel) {
|
|
786
786
|
level += 1;
|
|
787
787
|
}
|
|
788
|
-
return level;
|
|
788
|
+
return PositiveInt.orThrow(level);
|
|
789
789
|
};
|
|
790
790
|
/**
|
|
791
791
|
* Probability used for generating Skiplist levels.
|
|
@@ -888,7 +888,7 @@ const findLowerBound = (deps) => (ownerId, begin, end, upperBound) => {
|
|
|
888
888
|
if (!count.ok)
|
|
889
889
|
return count;
|
|
890
890
|
// `decrement` converts a count to an index.
|
|
891
|
-
return ok(decrement(count.value));
|
|
891
|
+
return ok(NonNegativeInt.orThrow(decrement(count.value)));
|
|
892
892
|
};
|
|
893
893
|
const getTimestampCount = (deps) => (ownerId, timestamp) => {
|
|
894
894
|
const result = deps.sqlite.exec(sql.prepared `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sync.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Sync.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Sync.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Sync.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu/Sync.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { assert } from "../Assert.js";
|
|
2
2
|
import { eqArrayNumber } from "../Eq.js";
|
|
3
3
|
import { createTransferableError } from "../Error.js";
|
|
4
|
-
import { constFalse } from "../Function.js";
|
|
4
|
+
import { constFalse, constTrue } from "../Function.js";
|
|
5
5
|
import { objectToEntries } from "../Object.js";
|
|
6
|
-
import {
|
|
6
|
+
import { createResources } from "../Resources.js";
|
|
7
7
|
import { err, ok } from "../Result.js";
|
|
8
8
|
import { sql } from "../Sqlite.js";
|
|
9
9
|
import { createMutex } from "../Task.js";
|
|
@@ -101,7 +101,7 @@ export const createSync = (deps) => (config) => {
|
|
|
101
101
|
},
|
|
102
102
|
});
|
|
103
103
|
};
|
|
104
|
-
const transports =
|
|
104
|
+
const transports = createResources({
|
|
105
105
|
createResource,
|
|
106
106
|
getResourceKey: createTransportKey,
|
|
107
107
|
getConsumerId: (owner) => owner.id,
|
|
@@ -221,6 +221,7 @@ export const createClock = (deps) => (initialTimestamp = createInitialTimestamp(
|
|
|
221
221
|
const createClientStorage = (deps) => (config) => {
|
|
222
222
|
const sqliteStorageBase = createBaseSqliteStorage(deps)({
|
|
223
223
|
onStorageError: config.onError,
|
|
224
|
+
isOwnerWithinQuota: constTrue, // Clients don't have quota limits
|
|
224
225
|
});
|
|
225
226
|
// TODO: Mutex per OwnerId
|
|
226
227
|
const mutex = createMutex();
|
|
@@ -112,6 +112,7 @@ export declare const maxNodeId: NodeId;
|
|
|
112
112
|
* - https://muratbuffalo.blogspot.com/2014/07/hybrid-logical-clocks.html
|
|
113
113
|
* - https://sergeiturukin.com/2017/06/26/hybrid-logical-clocks.html
|
|
114
114
|
* - https://jaredforsyth.com/posts/hybrid-logical-clocks/
|
|
115
|
+
* - https://willowprotocol.org/more/timestamps_really/index.html
|
|
115
116
|
*
|
|
116
117
|
* ### Privacy Considerations
|
|
117
118
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timestamp.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Timestamp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,KAAK,EAAmB,MAAM,aAAa,CAAC;AACrD,OAAO,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAEL,SAAS,EAOV,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C;AAED,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,6BAA6B,GAC7B,4BAA4B,CAAC;AAEjC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC;CAChD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,gsBAGlB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC;AAExC,eAAO,MAAM,SAAS,EAAQ,MAAM,CAAC;AACrC,eAAO,MAAM,SAAS,EAA4B,MAAM,CAAC;AAEzD,eAAO,MAAM,OAAO,4rBAGnB,CAAC;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAQ,OAAO,CAAC;AACvC,eAAO,MAAM,UAAU,EAAY,OAAO,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,MAAM,wPAA4C,CAAC;AAChE,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC;AAExC,eAAO,MAAM,SAAS,EAAyB,MAAM,CAAC;AACtD,eAAO,MAAM,SAAS,EAAyB,MAAM,CAAC;AAEtD
|
|
1
|
+
{"version":3,"file":"Timestamp.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Timestamp.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,7 @@ export const maxNodeId = "ffffffffffffffff";
|
|
|
87
87
|
* - https://muratbuffalo.blogspot.com/2014/07/hybrid-logical-clocks.html
|
|
88
88
|
* - https://sergeiturukin.com/2017/06/26/hybrid-logical-clocks.html
|
|
89
89
|
* - https://jaredforsyth.com/posts/hybrid-logical-clocks/
|
|
90
|
+
* - https://willowprotocol.org/more/timestamps_really/index.html
|
|
90
91
|
*
|
|
91
92
|
* ### Privacy Considerations
|
|
92
93
|
*
|
package/dist/src/Instances.d.ts
CHANGED
|
@@ -29,6 +29,6 @@ export interface Instances<K extends string, T extends Disposable> extends Dispo
|
|
|
29
29
|
*/
|
|
30
30
|
readonly delete: (key: K) => boolean;
|
|
31
31
|
}
|
|
32
|
-
/** Creates an {@link Instances}
|
|
32
|
+
/** Creates an {@link Instances}. */
|
|
33
33
|
export declare const createInstances: <K extends string, T extends Disposable>() => Instances<K, T>;
|
|
34
34
|
//# sourceMappingURL=Instances.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instances.d.ts","sourceRoot":"","sources":["../../src/Instances.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,CAC/D,SAAQ,UAAU;IAClB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,CAAC,EACN,MAAM,EAAE,MAAM,CAAC,EACf,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,KAC/B,CAAC,CAAC;IAEP,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAEnC,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CACtC;AAED,
|
|
1
|
+
{"version":3,"file":"Instances.d.ts","sourceRoot":"","sources":["../../src/Instances.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,UAAU,CAC/D,SAAQ,UAAU;IAClB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,CAAC,EACN,MAAM,EAAE,MAAM,CAAC,EACf,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,KAC/B,CAAC,CAAC;IAEP,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAEnC,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CACtC;AAED,oCAAoC;AACpC,eAAO,MAAM,eAAe,GAC1B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,UAAU,OACjB,SAAS,CAAC,CAAC,EAAE,CAAC,CA6ClB,CAAC"}
|
package/dist/src/Instances.js
CHANGED
package/dist/src/Number.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare const max: <T extends number>(...values: [T, ...ReadonlyArray<T>]
|
|
|
37
37
|
*/
|
|
38
38
|
export declare const computeBalancedBuckets: (numberOfItems: NonNegativeInt,
|
|
39
39
|
/** Default: 16 */
|
|
40
|
-
numberOfBuckets?:
|
|
40
|
+
numberOfBuckets?: number & import("./Brand.js").Brand<"Int"> & import("./Brand.js").Brand<"NonNegative"> & import("./Brand.js").Brand<"Positive">,
|
|
41
41
|
/** Default: 2 */
|
|
42
|
-
minNumberOfItemsPerBucket?:
|
|
42
|
+
minNumberOfItemsPerBucket?: number & import("./Brand.js").Brand<"Int"> & import("./Brand.js").Brand<"NonNegative"> & import("./Brand.js").Brand<"Positive">) => Result<NonEmptyReadonlyArray<PositiveInt>, PositiveInt>;
|
|
43
43
|
//# sourceMappingURL=Number.d.ts.map
|
package/dist/src/Number.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Number.d.ts","sourceRoot":"","sources":["../../src/Number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAW,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAoB,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAAe,CAAC;AAEtD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAAe,CAAC;AAEtD,4CAA4C;AAC5C,eAAO,MAAM,KAAK,GACf,KAAK,MAAM,EAAE,KAAK,MAAM,MACxB,GAAG,MAAM,KAAG,MACoB,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GACnB,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,SAAS,CAAC,MAAM,CAEd,CAAC;AAEjC,wEAAwE;AACxE,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,EAClC,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAClC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CACa,CAAC;AAE/D,wEAAwE;AACxE,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,EAClC,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAClC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CACa,CAAC;AAE/D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GACjC,eAAe,cAAc;AAE7B,kBAAkB;AAClB,
|
|
1
|
+
{"version":3,"file":"Number.d.ts","sourceRoot":"","sources":["../../src/Number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAW,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAoB,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAAe,CAAC;AAEtD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAAe,CAAC;AAEtD,4CAA4C;AAC5C,eAAO,MAAM,KAAK,GACf,KAAK,MAAM,EAAE,KAAK,MAAM,MACxB,GAAG,MAAM,KAAG,MACoB,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GACnB,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,SAAS,CAAC,MAAM,CAEd,CAAC;AAEjC,wEAAwE;AACxE,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,EAClC,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAClC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CACa,CAAC;AAE/D,wEAAwE;AACxE,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,EAClC,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAClC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CACa,CAAC;AAE/D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GACjC,eAAe,cAAc;AAE7B,kBAAkB;AAClB,iJAAyC;AAEzC,iBAAiB;AACjB,2JAAkD,KACjD,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,EAAE,WAAW,CAoBxD,CAAC"}
|
package/dist/src/Number.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assertNonEmptyReadonlyArray } from "./Assert.js";
|
|
2
2
|
import { err, ok } from "./Result.js";
|
|
3
|
+
import { PositiveInt } from "./Type.js";
|
|
3
4
|
export const increment = (n) => n + 1;
|
|
4
5
|
export const decrement = (n) => n - 1;
|
|
5
6
|
/** Clamps a number within a given range. */
|
|
@@ -34,12 +35,12 @@ export const max = (...values) => values.reduce((a, b) => (a > b ? a : b));
|
|
|
34
35
|
*/
|
|
35
36
|
export const computeBalancedBuckets = (numberOfItems,
|
|
36
37
|
/** Default: 16 */
|
|
37
|
-
numberOfBuckets = 16,
|
|
38
|
+
numberOfBuckets = PositiveInt.orThrow(16),
|
|
38
39
|
/** Default: 2 */
|
|
39
|
-
minNumberOfItemsPerBucket = 2) => {
|
|
40
|
+
minNumberOfItemsPerBucket = PositiveInt.orThrow(2)) => {
|
|
40
41
|
const minRequiredItems = numberOfBuckets * minNumberOfItemsPerBucket;
|
|
41
42
|
if (numberOfItems < minRequiredItems)
|
|
42
|
-
return err(minRequiredItems);
|
|
43
|
+
return err(PositiveInt.orThrow(minRequiredItems));
|
|
43
44
|
const indexes = [];
|
|
44
45
|
const itemsPerBucket = Math.floor(numberOfItems / numberOfBuckets);
|
|
45
46
|
const extraItems = numberOfItems % numberOfBuckets;
|
|
@@ -48,7 +49,7 @@ minNumberOfItemsPerBucket = 2) => {
|
|
|
48
49
|
const hasExtraItem = i < extraItems;
|
|
49
50
|
const itemsInThisBucket = itemsPerBucket + (hasExtraItem ? 1 : 0);
|
|
50
51
|
bucketBoundary += itemsInThisBucket;
|
|
51
|
-
indexes.push(bucketBoundary);
|
|
52
|
+
indexes.push(PositiveInt.orThrow(bucketBoundary));
|
|
52
53
|
}
|
|
53
54
|
assertNonEmptyReadonlyArray(indexes);
|
|
54
55
|
return ok(indexes);
|
|
@@ -2,10 +2,9 @@ import { Result } from "./Result.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* A generic resource manager that handles reference counting and delayed
|
|
4
4
|
* disposal of shared resources. Useful for managing expensive resources like
|
|
5
|
-
* WebSocket connections
|
|
6
|
-
* shared among multiple consumers.
|
|
5
|
+
* WebSocket connections that need to be shared among multiple consumers.
|
|
7
6
|
*/
|
|
8
|
-
export interface
|
|
7
|
+
export interface Resources<TResource extends Disposable, TResourceKey extends string, TResourceConfig, TConsumer, TConsumerId extends string> extends Disposable {
|
|
9
8
|
/**
|
|
10
9
|
* Adds a consumer to resources, creating them if necessary. Increments
|
|
11
10
|
* reference counts for existing consumer-resource pairs.
|
|
@@ -42,7 +41,7 @@ export interface ConsumerNotFoundError<TConsumerId extends string = string, TRes
|
|
|
42
41
|
readonly consumerId: TConsumerId;
|
|
43
42
|
readonly resourceKey: TResourceKey;
|
|
44
43
|
}
|
|
45
|
-
export interface
|
|
44
|
+
export interface ResourcesConfig<TResource extends Disposable, TResourceKey extends string, TResourceConfig, TConsumer, TConsumerId extends string> {
|
|
46
45
|
/** Creates a new resource for the given config. */
|
|
47
46
|
readonly createResource: (config: TResourceConfig) => TResource;
|
|
48
47
|
/** Extracts a unique key from a resource config for deduplication. */
|
|
@@ -67,16 +66,16 @@ export interface ResourceManagerConfig<TResource extends Disposable, TResourceKe
|
|
|
67
66
|
readonly onConsumerRemoved?: (consumer: TConsumer, resource: TResource, resourceKey: TResourceKey) => void;
|
|
68
67
|
}
|
|
69
68
|
/**
|
|
70
|
-
* Creates
|
|
69
|
+
* Creates {@link Resources}.
|
|
71
70
|
*
|
|
72
|
-
* This
|
|
73
|
-
*
|
|
74
|
-
*
|
|
71
|
+
* This tracks which consumers are using which resources and maintains reference
|
|
72
|
+
* counts to know when it's safe to dispose resources. Resources are created
|
|
73
|
+
* on-demand and disposed with a configurable delay to avoid churn.
|
|
75
74
|
*
|
|
76
75
|
* ### Example Usage
|
|
77
76
|
*
|
|
78
77
|
* ```ts
|
|
79
|
-
* // WebSocket connections
|
|
78
|
+
* // WebSocket connections
|
|
80
79
|
* interface WebSocketConfig {
|
|
81
80
|
* readonly url: WebSocketUrl;
|
|
82
81
|
* }
|
|
@@ -84,7 +83,7 @@ export interface ResourceManagerConfig<TResource extends Disposable, TResourceKe
|
|
|
84
83
|
* type WebSocketUrl = string & Brand<"WebSocketUrl">;
|
|
85
84
|
* type UserId = string & Brand<"UserId">;
|
|
86
85
|
*
|
|
87
|
-
* const
|
|
86
|
+
* const webSockets = createResources<
|
|
88
87
|
* WebSocket,
|
|
89
88
|
* WebSocketUrl,
|
|
90
89
|
* WebSocketConfig,
|
|
@@ -98,16 +97,16 @@ export interface ResourceManagerConfig<TResource extends Disposable, TResourceKe
|
|
|
98
97
|
* });
|
|
99
98
|
*
|
|
100
99
|
* // Add users to WebSocket connections
|
|
101
|
-
*
|
|
100
|
+
* webSockets.addConsumer(user1, [
|
|
102
101
|
* { url: "ws://server1.com" as WebSocketUrl },
|
|
103
102
|
* { url: "ws://server2.com" as WebSocketUrl },
|
|
104
103
|
* ]);
|
|
105
|
-
*
|
|
104
|
+
* webSockets.addConsumer(user2, [
|
|
106
105
|
* { url: "ws://server1.com" as WebSocketUrl },
|
|
107
106
|
* ]);
|
|
108
107
|
*
|
|
109
108
|
* // Remove users - server1 stays alive (user2 still using it)
|
|
110
|
-
*
|
|
109
|
+
* webSockets.removeConsumer(user1, [
|
|
111
110
|
* { url: "ws://server1.com" as WebSocketUrl },
|
|
112
111
|
* { url: "ws://server2.com" as WebSocketUrl },
|
|
113
112
|
* ]);
|
|
@@ -115,5 +114,5 @@ export interface ResourceManagerConfig<TResource extends Disposable, TResourceKe
|
|
|
115
114
|
* // server2 gets disposed after delay, server1 stays alive
|
|
116
115
|
* ```
|
|
117
116
|
*/
|
|
118
|
-
export declare const
|
|
119
|
-
//# sourceMappingURL=
|
|
117
|
+
export declare const createResources: <TResource extends Disposable, TResourceKey extends string, TResourceConfig, TConsumer, TConsumerId extends string>(config: ResourcesConfig<TResource, TResourceKey, TResourceConfig, TConsumer, TConsumerId>) => Resources<TResource, TResourceKey, TResourceConfig, TConsumer, TConsumerId>;
|
|
118
|
+
//# sourceMappingURL=Resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resources.d.ts","sourceRoot":"","sources":["../../src/Resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { err, ok } from "./Result.js";
|
|
2
2
|
import { PositiveInt } from "./Type.js";
|
|
3
3
|
/**
|
|
4
|
-
* Creates
|
|
4
|
+
* Creates {@link Resources}.
|
|
5
5
|
*
|
|
6
|
-
* This
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* This tracks which consumers are using which resources and maintains reference
|
|
7
|
+
* counts to know when it's safe to dispose resources. Resources are created
|
|
8
|
+
* on-demand and disposed with a configurable delay to avoid churn.
|
|
9
9
|
*
|
|
10
10
|
* ### Example Usage
|
|
11
11
|
*
|
|
12
12
|
* ```ts
|
|
13
|
-
* // WebSocket connections
|
|
13
|
+
* // WebSocket connections
|
|
14
14
|
* interface WebSocketConfig {
|
|
15
15
|
* readonly url: WebSocketUrl;
|
|
16
16
|
* }
|
|
@@ -18,7 +18,7 @@ import { PositiveInt } from "./Type.js";
|
|
|
18
18
|
* type WebSocketUrl = string & Brand<"WebSocketUrl">;
|
|
19
19
|
* type UserId = string & Brand<"UserId">;
|
|
20
20
|
*
|
|
21
|
-
* const
|
|
21
|
+
* const webSockets = createResources<
|
|
22
22
|
* WebSocket,
|
|
23
23
|
* WebSocketUrl,
|
|
24
24
|
* WebSocketConfig,
|
|
@@ -32,16 +32,16 @@ import { PositiveInt } from "./Type.js";
|
|
|
32
32
|
* });
|
|
33
33
|
*
|
|
34
34
|
* // Add users to WebSocket connections
|
|
35
|
-
*
|
|
35
|
+
* webSockets.addConsumer(user1, [
|
|
36
36
|
* { url: "ws://server1.com" as WebSocketUrl },
|
|
37
37
|
* { url: "ws://server2.com" as WebSocketUrl },
|
|
38
38
|
* ]);
|
|
39
|
-
*
|
|
39
|
+
* webSockets.addConsumer(user2, [
|
|
40
40
|
* { url: "ws://server1.com" as WebSocketUrl },
|
|
41
41
|
* ]);
|
|
42
42
|
*
|
|
43
43
|
* // Remove users - server1 stays alive (user2 still using it)
|
|
44
|
-
*
|
|
44
|
+
* webSockets.removeConsumer(user1, [
|
|
45
45
|
* { url: "ws://server1.com" as WebSocketUrl },
|
|
46
46
|
* { url: "ws://server2.com" as WebSocketUrl },
|
|
47
47
|
* ]);
|
|
@@ -49,9 +49,9 @@ import { PositiveInt } from "./Type.js";
|
|
|
49
49
|
* // server2 gets disposed after delay, server1 stays alive
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export const
|
|
52
|
+
export const createResources = (config) => {
|
|
53
53
|
let isDisposed = false;
|
|
54
|
-
const
|
|
54
|
+
const resourcesMap = new Map();
|
|
55
55
|
const consumerCounts = new Map();
|
|
56
56
|
const consumers = new Map();
|
|
57
57
|
const disposalTimeouts = new Map();
|
|
@@ -63,23 +63,23 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
63
63
|
clearTimeout(timeout);
|
|
64
64
|
disposalTimeouts.delete(key);
|
|
65
65
|
}
|
|
66
|
-
if (!
|
|
66
|
+
if (!resourcesMap.has(key)) {
|
|
67
67
|
const resource = config.createResource(resourceConfig);
|
|
68
|
-
|
|
68
|
+
resourcesMap.set(key, resource);
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
71
|
const scheduleDisposal = (key) => {
|
|
72
72
|
const timeout = setTimeout(() => {
|
|
73
|
-
const resource =
|
|
73
|
+
const resource = resourcesMap.get(key);
|
|
74
74
|
if (resource) {
|
|
75
75
|
resource[Symbol.dispose]();
|
|
76
|
-
|
|
76
|
+
resourcesMap.delete(key);
|
|
77
77
|
}
|
|
78
78
|
disposalTimeouts.delete(key);
|
|
79
79
|
}, disposalDelay);
|
|
80
80
|
disposalTimeouts.set(key, timeout);
|
|
81
81
|
};
|
|
82
|
-
const
|
|
82
|
+
const resources = {
|
|
83
83
|
addConsumer: (consumer, resourceConfigs) => {
|
|
84
84
|
if (isDisposed)
|
|
85
85
|
return;
|
|
@@ -99,7 +99,7 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
99
99
|
counts.set(consumerId, PositiveInt.orThrow(newCount));
|
|
100
100
|
// Call onConsumerAdded callback only when consumer is added for the first time (0 -> 1)
|
|
101
101
|
if (currentCount === 0 && config.onConsumerAdded) {
|
|
102
|
-
const resource =
|
|
102
|
+
const resource = resourcesMap.get(resourceKey);
|
|
103
103
|
if (resource) {
|
|
104
104
|
config.onConsumerAdded(consumer, resource, resourceKey);
|
|
105
105
|
}
|
|
@@ -128,7 +128,7 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
128
128
|
counts.delete(consumerId);
|
|
129
129
|
// Call onConsumerRemoved callback only when consumer is completely removed (1 -> 0)
|
|
130
130
|
if (config.onConsumerRemoved) {
|
|
131
|
-
const resource =
|
|
131
|
+
const resource = resourcesMap.get(key);
|
|
132
132
|
if (resource) {
|
|
133
133
|
config.onConsumerRemoved(consumer, resource, key);
|
|
134
134
|
}
|
|
@@ -142,7 +142,7 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
142
142
|
counts.set(consumerId, PositiveInt.orThrow(currentCount - 1));
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
if (!
|
|
145
|
+
if (!resources.hasConsumerAnyResource(consumer)) {
|
|
146
146
|
consumers.delete(consumerId);
|
|
147
147
|
}
|
|
148
148
|
return ok();
|
|
@@ -150,7 +150,7 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
150
150
|
getResource: (key) => {
|
|
151
151
|
if (isDisposed)
|
|
152
152
|
return null;
|
|
153
|
-
return
|
|
153
|
+
return resourcesMap.get(key) ?? null;
|
|
154
154
|
},
|
|
155
155
|
getConsumersForResource: (key) => {
|
|
156
156
|
if (isDisposed)
|
|
@@ -172,7 +172,7 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
172
172
|
if (!consumer)
|
|
173
173
|
return null;
|
|
174
174
|
// Only return consumer if it's currently using any resources
|
|
175
|
-
if (!
|
|
175
|
+
if (!resources.hasConsumerAnyResource(consumer)) {
|
|
176
176
|
return null;
|
|
177
177
|
}
|
|
178
178
|
return consumer;
|
|
@@ -185,13 +185,13 @@ export const createRefCountedResourceManager = (config) => {
|
|
|
185
185
|
clearTimeout(timeout);
|
|
186
186
|
}
|
|
187
187
|
disposalTimeouts.clear();
|
|
188
|
-
for (const resource of
|
|
188
|
+
for (const resource of resourcesMap.values()) {
|
|
189
189
|
resource[Symbol.dispose]();
|
|
190
190
|
}
|
|
191
|
-
|
|
191
|
+
resourcesMap.clear();
|
|
192
192
|
consumerCounts.clear();
|
|
193
193
|
consumers.clear();
|
|
194
194
|
},
|
|
195
195
|
};
|
|
196
|
-
return
|
|
196
|
+
return resources;
|
|
197
197
|
};
|
package/dist/src/Result.d.ts
CHANGED
package/dist/src/Skiplist.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PositiveInt } from "./Type.js";
|
|
1
2
|
// TODO: Use in Storage.
|
|
2
3
|
export const createSkiplistLevel = (deps) => (config = {}) => {
|
|
3
4
|
const { probability = 0.5, maxLevel = 32 } = config;
|
|
@@ -7,7 +8,7 @@ export const createSkiplistLevel = (deps) => (config = {}) => {
|
|
|
7
8
|
while (deps.random.next() <= probability && level < maxLevel) {
|
|
8
9
|
level += 1;
|
|
9
10
|
}
|
|
10
|
-
return level;
|
|
11
|
+
return PositiveInt.orThrow(level);
|
|
11
12
|
},
|
|
12
13
|
};
|
|
13
14
|
};
|
package/dist/src/Task.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { isNonEmptyArray, shiftArray } from "./Array.js";
|
|
7
7
|
import { err, ok } from "./Result.js";
|
|
8
8
|
import { durationToNonNegativeInt } from "./Time.js";
|
|
9
|
-
import { PositiveInt } from "./Type.js";
|
|
9
|
+
import { NonNegativeInt, PositiveInt } from "./Type.js";
|
|
10
10
|
/** Narrower check to detect AbortError objects at runtime. */
|
|
11
11
|
const isAbortError = (error) => typeof error === "object" &&
|
|
12
12
|
error !== null &&
|
|
@@ -262,7 +262,7 @@ export const retry = ({ retries, initialDelay = "1s", maxDelay = "30s", factor =
|
|
|
262
262
|
onRetry(result.error, attempt, delay);
|
|
263
263
|
}
|
|
264
264
|
// Wait before retry
|
|
265
|
-
const delayResult = await wait(delay)(context);
|
|
265
|
+
const delayResult = await wait(NonNegativeInt.orThrow(delay))(context);
|
|
266
266
|
if (!delayResult.ok) {
|
|
267
267
|
// If delay was aborted, return AbortError (will be handled by toTask)
|
|
268
268
|
return delayResult;
|
|
@@ -405,7 +405,7 @@ export const createSemaphore = (maxConcurrent) => {
|
|
|
405
405
|
* ```
|
|
406
406
|
*/
|
|
407
407
|
export const createMutex = () => {
|
|
408
|
-
const mutex = createSemaphore(1);
|
|
408
|
+
const mutex = createSemaphore(PositiveInt.orThrow(1));
|
|
409
409
|
return {
|
|
410
410
|
withLock: mutex.withPermit,
|
|
411
411
|
[Symbol.dispose]: mutex[Symbol.dispose],
|
package/dist/src/Time.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { assert } from "./Assert.js";
|
|
7
|
-
import { DateIso } from "./Type.js";
|
|
7
|
+
import { DateIso, NonNegativeInt } from "./Type.js";
|
|
8
8
|
/**
|
|
9
9
|
* Creates a {@link Time} using Date.now().
|
|
10
10
|
*
|
|
@@ -115,5 +115,5 @@ export const durationToNonNegativeInt = (duration) => {
|
|
|
115
115
|
const value = parseInt(numStr, 10);
|
|
116
116
|
total += value * units[unit];
|
|
117
117
|
}
|
|
118
|
-
return total;
|
|
118
|
+
return NonNegativeInt.orThrow(total);
|
|
119
119
|
};
|
package/dist/src/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export * from "./BigInt.js";
|
|
|
4
4
|
export * from "./Brand.js";
|
|
5
5
|
export * from "./Buffer.js";
|
|
6
6
|
export * from "./Cache.js";
|
|
7
|
-
export * from "./
|
|
7
|
+
export * from "./Callbacks.js";
|
|
8
8
|
export * from "./Console.js";
|
|
9
9
|
export * from "./Crypto.js";
|
|
10
10
|
export * from "./Eq.js";
|
|
@@ -20,6 +20,7 @@ export * from "./Order.js";
|
|
|
20
20
|
export * from "./Platform.js";
|
|
21
21
|
export * from "./Random.js";
|
|
22
22
|
export * from "./Ref.js";
|
|
23
|
+
export * from "./Resources.js";
|
|
23
24
|
export * from "./Result.js";
|
|
24
25
|
export * from "./Sqlite.js";
|
|
25
26
|
export * from "./Store.js";
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export * from "./BigInt.js";
|
|
|
4
4
|
export * from "./Brand.js";
|
|
5
5
|
export * from "./Buffer.js";
|
|
6
6
|
export * from "./Cache.js";
|
|
7
|
-
export * from "./
|
|
7
|
+
export * from "./Callbacks.js";
|
|
8
8
|
export * from "./Console.js";
|
|
9
9
|
export * from "./Crypto.js";
|
|
10
10
|
export * from "./Eq.js";
|
|
@@ -20,6 +20,7 @@ export * from "./Order.js";
|
|
|
20
20
|
export * from "./Platform.js";
|
|
21
21
|
export * from "./Random.js";
|
|
22
22
|
export * from "./Ref.js";
|
|
23
|
+
export * from "./Resources.js";
|
|
23
24
|
export * from "./Result.js";
|
|
24
25
|
export * from "./Sqlite.js";
|
|
25
26
|
export * from "./Store.js";
|