@evolu/common 5.2.3 → 5.4.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/dist/src/Config.d.ts +14 -0
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Evolu.d.ts +1 -0
- package/dist/src/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu.js +12 -0
- package/dist/src/Socket.d.ts +8 -0
- package/dist/src/Socket.d.ts.map +1 -0
- package/dist/src/Socket.js +51 -0
- package/package.json +6 -6
- package/src/Config.ts +16 -0
- package/src/Evolu.ts +13 -0
- package/src/Socket.ts +83 -0
package/dist/src/Config.d.ts
CHANGED
|
@@ -34,6 +34,20 @@ export interface Config {
|
|
|
34
34
|
* events with values. For production, use `warning`.
|
|
35
35
|
*/
|
|
36
36
|
minimumLogLevel: "none" | "trace" | "debug" | "warning";
|
|
37
|
+
/**
|
|
38
|
+
* Enables websocket connection
|
|
39
|
+
*
|
|
40
|
+
* If set to true runs a websocket connection on the sync url
|
|
41
|
+
*/
|
|
42
|
+
enableWebsocketConnection?: true;
|
|
43
|
+
/**
|
|
44
|
+
* Allows to reuse websocket connections for multiple database setup
|
|
45
|
+
*
|
|
46
|
+
* Works INSTEAD of enableWebsocket and if set overrides enableWebsocket this
|
|
47
|
+
* attaches the database to a connection produced by a call back from another
|
|
48
|
+
* database that has enableWebsocketConnection
|
|
49
|
+
*/
|
|
50
|
+
externalWebsocketConnection?: WebSocket;
|
|
37
51
|
}
|
|
38
52
|
export declare const Config: Context.Tag<Config, Config>;
|
|
39
53
|
export declare const defaultConfig: Config;
|
package/dist/src/Config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAI1C,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAI1C,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAExD;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,IAAI,CAAC;IAEjC;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,SAAS,CAAC;CACzC;AAED,eAAO,MAAM,MAAM,6BAAuC,CAAC;AAE3D,eAAO,MAAM,aAAa,EAAE,MAM3B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,aAAa,mBACR,OAAO,CAAC,MAAM,CAAC,KAC9B,cAAc,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAsB7C,CAAC"}
|
package/dist/src/Evolu.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ import { SyncState } from "./Sync.js";
|
|
|
36
36
|
* - Ensuring the database schema's integrity with ensureSchema.
|
|
37
37
|
*/
|
|
38
38
|
export interface Evolu<T extends EvoluSchema = EvoluSchema> {
|
|
39
|
+
readonly socket: Promise<WebSocket | undefined>;
|
|
39
40
|
/**
|
|
40
41
|
* Subscribe to {@link EvoluError} changes.
|
|
41
42
|
*
|
package/dist/src/Evolu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAG3C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAKtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAgC,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu.js
CHANGED
|
@@ -12,6 +12,7 @@ import * as Record from "effect/Record";
|
|
|
12
12
|
import * as Kysely from "kysely";
|
|
13
13
|
import { Config, createRuntime, defaultConfig } from "./Config.js";
|
|
14
14
|
import { NanoIdGenerator } from "./Crypto.js";
|
|
15
|
+
import { createSocket } from "./Socket.js";
|
|
15
16
|
import { DbFactory, deserializeQuery, emptyRows, queryResultFromRows, serializeQuery, } from "./Db.js";
|
|
16
17
|
import { applyPatches } from "./Diff.js";
|
|
17
18
|
import { makeUnexpectedError } from "./Error.js";
|
|
@@ -102,6 +103,16 @@ const createEvolu = (schema, runtime, initialData, mnemonic) => Effect.gen(funct
|
|
|
102
103
|
};
|
|
103
104
|
db.init(schema, initialDataAsMutations, handleDbError, handleSyncStateChange, handleDbReceive, mnemonic).pipe(Effect.tap(sync({ refreshQueries: false })), Effect.flatMap(ownerStore.setState), Effect.catchTag("NotSupportedPlatformError", () => Effect.void), // no-op
|
|
104
105
|
runFork);
|
|
106
|
+
let socketResolved = false;
|
|
107
|
+
const socket = new Promise((resolve) => {
|
|
108
|
+
ownerStore.subscribe(() => {
|
|
109
|
+
const owner = ownerStore.getState();
|
|
110
|
+
if (!socketResolved && typeof owner?.id === "string") {
|
|
111
|
+
socketResolved = true;
|
|
112
|
+
resolve(createSocket(sync, config, owner));
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
105
116
|
const appStateReset = yield* appState.init({
|
|
106
117
|
onRequestSync: sync({ refreshQueries: true }),
|
|
107
118
|
reloadUrl: config.reloadUrl,
|
|
@@ -193,6 +204,7 @@ const createEvolu = (schema, runtime, initialData, mnemonic) => Effect.gen(funct
|
|
|
193
204
|
};
|
|
194
205
|
})();
|
|
195
206
|
const evolu = {
|
|
207
|
+
socket,
|
|
196
208
|
subscribeError: errorStore.subscribe,
|
|
197
209
|
getError: errorStore.getState,
|
|
198
210
|
createQuery: (queryCallback, options) => pipe(queryCallback(kysely).compile(), (compiledQuery) => {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Config } from "./Config.js";
|
|
2
|
+
import { Owner } from "./Owner.js";
|
|
3
|
+
type ForceSyncMethod = ({ refreshQueries, }: {
|
|
4
|
+
refreshQueries: boolean;
|
|
5
|
+
}) => () => void;
|
|
6
|
+
export declare const createSocket: (sync: ForceSyncMethod, config: Config, owner: Owner) => WebSocket | undefined;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=Socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Socket.d.ts","sourceRoot":"","sources":["../../src/Socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWnC,KAAK,eAAe,GAAG,CAAC,EACtB,cAAc,GACf,EAAE;IACD,cAAc,EAAE,OAAO,CAAC;CACzB,KAAK,MAAM,IAAI,CAAC;AAoBjB,eAAO,MAAM,YAAY,SACjB,eAAe,UACb,MAAM,SACP,KAAK,KACX,SAAS,GAAG,SA0Cd,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
let syncTimeout;
|
|
2
|
+
let lockTimeout;
|
|
3
|
+
let socketTimeout;
|
|
4
|
+
let isLocked = false;
|
|
5
|
+
const SocketTimeout = 3000;
|
|
6
|
+
const SyncTimeout = 500;
|
|
7
|
+
const SyncLockTimeout = 500;
|
|
8
|
+
let socket;
|
|
9
|
+
const processWebsocketEvent = (sync, event) => {
|
|
10
|
+
if (typeof event.data === "string" || isLocked === true)
|
|
11
|
+
return;
|
|
12
|
+
clearTimeout(syncTimeout);
|
|
13
|
+
syncTimeout = undefined;
|
|
14
|
+
syncTimeout = setTimeout(() => {
|
|
15
|
+
isLocked = true;
|
|
16
|
+
sync({ refreshQueries: true })();
|
|
17
|
+
clearTimeout(syncTimeout);
|
|
18
|
+
clearTimeout(lockTimeout);
|
|
19
|
+
lockTimeout = setTimeout(() => {
|
|
20
|
+
isLocked = false;
|
|
21
|
+
}, SyncLockTimeout);
|
|
22
|
+
}, SyncTimeout);
|
|
23
|
+
};
|
|
24
|
+
export const createSocket = (sync, config, owner) => {
|
|
25
|
+
if (config.externalWebsocketConnection) {
|
|
26
|
+
// Hook up to an external WebSocket connection
|
|
27
|
+
config.externalWebsocketConnection.send(JSON.stringify({ message: "subscribe", channelId: owner.id }));
|
|
28
|
+
config.externalWebsocketConnection.addEventListener("message", (event) => processWebsocketEvent(sync, event));
|
|
29
|
+
return config.externalWebsocketConnection;
|
|
30
|
+
}
|
|
31
|
+
if (config.enableWebsocketConnection) {
|
|
32
|
+
// Create a WebSocket connection
|
|
33
|
+
socket = new WebSocket(config.syncUrl?.replace("http", "ws"));
|
|
34
|
+
// Handle incoming WebSocket messages
|
|
35
|
+
socket.addEventListener("message", (event) => processWebsocketEvent(sync, event));
|
|
36
|
+
// Handle WebSocket errors
|
|
37
|
+
socket.onerror = (error) => {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.error("WebSocket error:", error);
|
|
40
|
+
};
|
|
41
|
+
// Handle WebSocket closure
|
|
42
|
+
socket.onclose = () => {
|
|
43
|
+
socketTimeout = setTimeout(() => createSocket(sync, config, owner), SocketTimeout);
|
|
44
|
+
};
|
|
45
|
+
socket.onopen = () => {
|
|
46
|
+
socket.send(JSON.stringify({ message: "subscribe", channelId: owner.id }));
|
|
47
|
+
clearTimeout(socketTimeout);
|
|
48
|
+
};
|
|
49
|
+
return socket;
|
|
50
|
+
}
|
|
51
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@evolu/common",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.0",
|
|
4
4
|
"description": "Local-first platform designed for privacy, ease of use, and no vendor lock-in to sync and backup people's lifetime data",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"evolu",
|
|
@@ -52,21 +52,21 @@
|
|
|
52
52
|
"nanoid": "^5.0.7"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@effect/platform": "^0.
|
|
56
|
-
"@effect/schema": "^0.
|
|
55
|
+
"@effect/platform": "^0.60.0",
|
|
56
|
+
"@effect/schema": "^0.69.0",
|
|
57
57
|
"@protobuf-ts/plugin": "^2.9.4",
|
|
58
58
|
"@protobuf-ts/protoc": "^2.9.4",
|
|
59
59
|
"array-shuffle": "^3.0.0",
|
|
60
60
|
"effect": "^3.2.1",
|
|
61
61
|
"eslint": "^8.57.0",
|
|
62
62
|
"typescript": "^5.4.5",
|
|
63
|
-
"vitest": "^
|
|
63
|
+
"vitest": "^2.0.0",
|
|
64
64
|
"@evolu/tsconfig": "0.0.2",
|
|
65
65
|
"eslint-config-evolu": "1.0.0"
|
|
66
66
|
},
|
|
67
67
|
"peerDependencies": {
|
|
68
|
-
"@effect/platform": "^0.
|
|
69
|
-
"@effect/schema": "^0.
|
|
68
|
+
"@effect/platform": "^0.60.0",
|
|
69
|
+
"@effect/schema": "^0.69.0",
|
|
70
70
|
"effect": "^3.1.2"
|
|
71
71
|
},
|
|
72
72
|
"publishConfig": {
|
package/src/Config.ts
CHANGED
|
@@ -43,6 +43,22 @@ export interface Config {
|
|
|
43
43
|
* events with values. For production, use `warning`.
|
|
44
44
|
*/
|
|
45
45
|
minimumLogLevel: "none" | "trace" | "debug" | "warning";
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Enables websocket connection
|
|
49
|
+
*
|
|
50
|
+
* If set to true runs a websocket connection on the sync url
|
|
51
|
+
*/
|
|
52
|
+
enableWebsocketConnection?: true;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Allows to reuse websocket connections for multiple database setup
|
|
56
|
+
*
|
|
57
|
+
* Works INSTEAD of enableWebsocket and if set overrides enableWebsocket this
|
|
58
|
+
* attaches the database to a connection produced by a call back from another
|
|
59
|
+
* database that has enableWebsocketConnection
|
|
60
|
+
*/
|
|
61
|
+
externalWebsocketConnection?: WebSocket;
|
|
46
62
|
}
|
|
47
63
|
|
|
48
64
|
export const Config = Context.GenericTag<Config>("Config");
|
package/src/Evolu.ts
CHANGED
|
@@ -15,6 +15,7 @@ import * as Kysely from "kysely";
|
|
|
15
15
|
import { Config, createRuntime, defaultConfig } from "./Config.js";
|
|
16
16
|
import { TimestampString } from "./Crdt.js";
|
|
17
17
|
import { Mnemonic, NanoIdGenerator } from "./Crypto.js";
|
|
18
|
+
import { createSocket } from "./Socket.js";
|
|
18
19
|
import {
|
|
19
20
|
DbFactory,
|
|
20
21
|
DbSchema,
|
|
@@ -67,6 +68,7 @@ import { SyncState, initialSyncState } from "./Sync.js";
|
|
|
67
68
|
* - Ensuring the database schema's integrity with ensureSchema.
|
|
68
69
|
*/
|
|
69
70
|
export interface Evolu<T extends EvoluSchema = EvoluSchema> {
|
|
71
|
+
readonly socket: Promise<WebSocket | undefined>;
|
|
70
72
|
/**
|
|
71
73
|
* Subscribe to {@link EvoluError} changes.
|
|
72
74
|
*
|
|
@@ -680,6 +682,16 @@ const createEvolu = (
|
|
|
680
682
|
Effect.catchTag("NotSupportedPlatformError", () => Effect.void), // no-op
|
|
681
683
|
runFork,
|
|
682
684
|
);
|
|
685
|
+
let socketResolved = false;
|
|
686
|
+
const socket: Promise<WebSocket | undefined> = new Promise((resolve) => {
|
|
687
|
+
ownerStore.subscribe(() => {
|
|
688
|
+
const owner = ownerStore.getState() as Owner;
|
|
689
|
+
if (!socketResolved && typeof owner?.id === "string") {
|
|
690
|
+
socketResolved = true;
|
|
691
|
+
resolve(createSocket(sync, config, owner));
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
});
|
|
683
695
|
|
|
684
696
|
const appStateReset = yield* appState.init({
|
|
685
697
|
onRequestSync: sync({ refreshQueries: true }),
|
|
@@ -804,6 +816,7 @@ const createEvolu = (
|
|
|
804
816
|
})();
|
|
805
817
|
|
|
806
818
|
const evolu: Evolu = {
|
|
819
|
+
socket,
|
|
807
820
|
subscribeError: errorStore.subscribe,
|
|
808
821
|
getError: errorStore.getState,
|
|
809
822
|
|
package/src/Socket.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Config } from "./Config.js";
|
|
2
|
+
import { Owner } from "./Owner.js";
|
|
3
|
+
|
|
4
|
+
let syncTimeout: number | NodeJS.Timeout | undefined;
|
|
5
|
+
let lockTimeout: number | NodeJS.Timeout | undefined;
|
|
6
|
+
let socketTimeout: number | NodeJS.Timeout | undefined;
|
|
7
|
+
let isLocked = false;
|
|
8
|
+
const SocketTimeout = 3000;
|
|
9
|
+
const SyncTimeout = 500;
|
|
10
|
+
const SyncLockTimeout = 500;
|
|
11
|
+
let socket: WebSocket;
|
|
12
|
+
|
|
13
|
+
type ForceSyncMethod = ({
|
|
14
|
+
refreshQueries,
|
|
15
|
+
}: {
|
|
16
|
+
refreshQueries: boolean;
|
|
17
|
+
}) => () => void;
|
|
18
|
+
|
|
19
|
+
const processWebsocketEvent = (
|
|
20
|
+
sync: ForceSyncMethod,
|
|
21
|
+
event: MessageEvent<any>,
|
|
22
|
+
) => {
|
|
23
|
+
if (typeof event.data === "string" || isLocked === true) return;
|
|
24
|
+
clearTimeout(syncTimeout);
|
|
25
|
+
syncTimeout = undefined;
|
|
26
|
+
syncTimeout = setTimeout(() => {
|
|
27
|
+
isLocked = true;
|
|
28
|
+
sync({ refreshQueries: true })();
|
|
29
|
+
clearTimeout(syncTimeout);
|
|
30
|
+
clearTimeout(lockTimeout);
|
|
31
|
+
lockTimeout = setTimeout(() => {
|
|
32
|
+
isLocked = false;
|
|
33
|
+
}, SyncLockTimeout);
|
|
34
|
+
}, SyncTimeout);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const createSocket = (
|
|
38
|
+
sync: ForceSyncMethod,
|
|
39
|
+
config: Config,
|
|
40
|
+
owner: Owner,
|
|
41
|
+
): WebSocket | undefined => {
|
|
42
|
+
if (config.externalWebsocketConnection) {
|
|
43
|
+
// Hook up to an external WebSocket connection
|
|
44
|
+
config.externalWebsocketConnection.send(
|
|
45
|
+
JSON.stringify({ message: "subscribe", channelId: owner.id }),
|
|
46
|
+
);
|
|
47
|
+
config.externalWebsocketConnection.addEventListener("message", (event) =>
|
|
48
|
+
processWebsocketEvent(sync, event),
|
|
49
|
+
);
|
|
50
|
+
return config.externalWebsocketConnection;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (config.enableWebsocketConnection) {
|
|
54
|
+
// Create a WebSocket connection
|
|
55
|
+
socket = new WebSocket(config.syncUrl?.replace("http", "ws"));
|
|
56
|
+
// Handle incoming WebSocket messages
|
|
57
|
+
socket.addEventListener("message", (event) =>
|
|
58
|
+
processWebsocketEvent(sync, event),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// Handle WebSocket errors
|
|
62
|
+
socket.onerror = (error) => {
|
|
63
|
+
// eslint-disable-next-line no-console
|
|
64
|
+
console.error("WebSocket error:", error);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Handle WebSocket closure
|
|
68
|
+
socket.onclose = () => {
|
|
69
|
+
socketTimeout = setTimeout(
|
|
70
|
+
() => createSocket(sync, config, owner),
|
|
71
|
+
SocketTimeout,
|
|
72
|
+
);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
socket.onopen = () => {
|
|
76
|
+
socket.send(
|
|
77
|
+
JSON.stringify({ message: "subscribe", channelId: owner.id }),
|
|
78
|
+
);
|
|
79
|
+
clearTimeout(socketTimeout);
|
|
80
|
+
};
|
|
81
|
+
return socket;
|
|
82
|
+
}
|
|
83
|
+
};
|