jazz-run 0.7.35-new-auth.0 → 0.7.35

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.
@@ -1,8 +1,8 @@
1
1
 
2
- > jazz-run@0.7.35-new-auth.0 build /Users/anselm/jazz/jazz/packages/jazz-run
2
+ > jazz-run@0.7.34 build /Users/anselm/jazz/jazz/packages/jazz-run
3
3
  > npm run lint && rm -rf ./dist && tsc --sourceMap --outDir dist
4
4
 
5
5
 
6
- > jazz-run@0.7.35-new-auth.0 lint
6
+ > jazz-run@0.7.34 lint
7
7
  > eslint . --ext ts,tsx
8
8
 
package/CHANGELOG.md CHANGED
@@ -1,11 +1,20 @@
1
1
  # jazz-autosub
2
2
 
3
- ## 0.7.35-new-auth.0
3
+ ## 0.7.35
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - Updated dependencies
8
- - jazz-tools@0.7.35-new-auth.0
7
+ - 403b430: Added sync command to start a local sync server
8
+ - f350e90: Added a priority system for the sync messages
9
+ - Updated dependencies [49a8b54]
10
+ - Updated dependencies [35bbcd9]
11
+ - Updated dependencies [6f80282]
12
+ - Updated dependencies [35bbcd9]
13
+ - Updated dependencies [f350e90]
14
+ - jazz-tools@0.7.35
15
+ - cojson@0.7.35
16
+ - cojson-storage-sqlite@0.7.35
17
+ - cojson-transport-ws@0.7.35
9
18
 
10
19
  ## 0.7.34
11
20
 
package/dist/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ /* istanbul ignore file -- @preserve */
2
3
  import { Command, Options } from "@effect/cli";
3
4
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
4
5
  import { Console, Effect } from "effect";
5
6
  import { createWebSocketPeer } from "cojson-transport-ws";
6
7
  import { WebSocket } from "ws";
7
- import { Account, WasmCrypto, createJazzContext, isControlledAccount, } from "jazz-tools";
8
- import { fixedCredentialsAuth, randomSessionProvider } from "jazz-tools/src/internal";
8
+ import { Account, WasmCrypto, cojsonInternals, isControlledAccount, } from "jazz-tools";
9
+ import { startSync } from "./startSync.js";
9
10
  const jazzTools = Command.make("jazz-tools");
10
11
  const name = Options.text("name").pipe(Options.withAlias("n"));
11
12
  const peer = Options.text("peer")
@@ -36,14 +37,12 @@ const accountCreate = Command.make("create", { name, peer }, ({ name, peer: peer
36
37
  websocket: new WebSocket(peerAddr),
37
38
  role: "server",
38
39
  });
39
- yield* Effect.promise(async () => createJazzContext({
40
- auth: fixedCredentialsAuth({
41
- accountID: account.id,
42
- secret: account._raw.agentSecret,
43
- }),
44
- sessionProvider: randomSessionProvider,
40
+ yield* Effect.promise(async () => Account.become({
41
+ accountID: account.id,
42
+ accountSecret: account._raw.agentSecret,
43
+ sessionID: cojsonInternals.newRandomSessionID(account.id),
45
44
  peersToLoadFrom: [peer2],
46
- crypto
45
+ crypto,
47
46
  }));
48
47
  yield* Console.log(`# Credentials for Jazz account "${name}":
49
48
  JAZZ_WORKER_ACCOUNT=${account.id}
@@ -53,7 +52,7 @@ JAZZ_WORKER_SECRET=${account._raw.agentSecret}
53
52
  });
54
53
  const accountBase = Command.make("account");
55
54
  const account = accountBase.pipe(Command.withSubcommands([accountCreate]));
56
- const command = jazzTools.pipe(Command.withSubcommands([account]));
55
+ const command = jazzTools.pipe(Command.withSubcommands([account, startSync]));
57
56
  const cli = Command.run(command, {
58
57
  name: "Jazz CLI Tools",
59
58
  version: "v0.7.0",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EACH,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,mBAAmB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;KAC5B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAC5B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACxD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAC9B,QAAQ,EACR,EAAE,IAAI,EAAE,IAAI,EAAE,EACd,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IACzB,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhE,MAAM,IAAI,GAAG,mBAAmB,CAAC;YAC7B,EAAE,EAAE,UAAU;YACd,SAAS,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC;YAClC,IAAI,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAY,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CACtD,OAAO,CAAC,MAAM,CAAC;YACX,aAAa,EAAE,EAAE,IAAI,EAAE;YACvB,eAAe,EAAE,CAAC,IAAI,CAAC;YACvB,MAAM;SACT,CAAC,CACL,CAAC;QACF,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CACpB,CACJ,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAC1C,OAAO,CAAC,OAAQ,CAAC,IAAI,CAAC,IAAI,CAC7B,CACJ,CAAC;QAEF,mEAAmE;QACnE,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,KAAK,GAAG,mBAAmB,CAAC;YAC9B,EAAE,EAAE,WAAW;YACf,SAAS,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC;YAClC,IAAI,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAC7B,iBAAiB,CAAC;YACd,IAAI,EAAE,oBAAoB,CAAC;gBACvB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;aACnC,CAAC;YACF,eAAe,EAAE,qBAAqB;YACtC,eAAe,EAAE,CAAC,KAAK,CAAC;YACxB,MAAM;SACT,CAAC,CACL,CAAC;QAEF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI;sBAChD,OAAO,CAAC,EAAE;qBACX,OAAO,CAAC,IAAI,CAAC,WAAW;CAC5C,CAAC,CAAC;IACK,CAAC,CAAC,CAAC;AACP,CAAC,CACJ,CAAC;AAEF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE5C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAE3E,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEnE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;IAC7B,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,QAAQ;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACxC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,WAAW,CAAC,OAAO,CACtB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /* istanbul ignore file -- @preserve */
2
+ import { Command, Options } from "@effect/cli";
3
+ import { ControlledAgent, LocalNode, WasmCrypto, cojsonInternals, } from "cojson";
4
+ import { WebSocketServer } from "ws";
5
+ import { createWebSocketPeer } from "cojson-transport-ws";
6
+ import { Effect } from "effect";
7
+ import { SQLiteStorage } from "cojson-storage-sqlite";
8
+ import { dirname } from "node:path";
9
+ import { mkdir } from "node:fs/promises";
10
+ const port = Options.text("port")
11
+ .pipe(Options.withAlias("p"))
12
+ .pipe(Options.withDescription("Select a different port for the WebSocket server. Default is 4200"))
13
+ .pipe(Options.withDefault("4200"));
14
+ const inMemory = Options.boolean("in-memory").pipe(Options.withDescription("Use an in-memory storage instead of file-based"));
15
+ const db = Options.file("db")
16
+ .pipe(Options.withDescription("The path to the file where to store the data. Default is 'sync-db/storage.db'"))
17
+ .pipe(Options.withDefault("sync-db/storage.db"));
18
+ export const startSync = Command.make("sync", { port, inMemory, db }, ({ port, inMemory, db }) => {
19
+ return Effect.gen(function* () {
20
+ const crypto = yield* Effect.promise(() => WasmCrypto.create());
21
+ const wss = new WebSocketServer({ port: parseInt(port) });
22
+ console.log("COJSON sync server listening on port " + wss.options.port);
23
+ const agentSecret = crypto.newRandomAgentSecret();
24
+ const agentID = crypto.getAgentID(agentSecret);
25
+ const localNode = new LocalNode(new ControlledAgent(agentSecret, crypto), cojsonInternals.newRandomSessionID(agentID), crypto);
26
+ if (!inMemory) {
27
+ yield* Effect.promise(() => mkdir(dirname(db), { recursive: true }));
28
+ const storage = yield* Effect.promise(() => SQLiteStorage.asPeer({ filename: db }));
29
+ localNode.syncManager.addPeer(storage);
30
+ }
31
+ wss.on("connection", function connection(ws, req) {
32
+ // ping/pong for the connection liveness
33
+ const pinging = setInterval(() => {
34
+ ws.send(JSON.stringify({
35
+ type: "ping",
36
+ time: Date.now(),
37
+ dc: "unknown",
38
+ }));
39
+ }, 1500);
40
+ ws.on("close", () => {
41
+ clearInterval(pinging);
42
+ });
43
+ const clientAddress = req.headers["x-forwarded-for"]
44
+ ?.split(",")[0]
45
+ ?.trim() || req.socket.remoteAddress;
46
+ const clientId = clientAddress + "@" + new Date().toISOString();
47
+ localNode.syncManager.addPeer(createWebSocketPeer({
48
+ id: clientId,
49
+ role: "client",
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ websocket: ws, // TODO: fix types
52
+ expectPings: false,
53
+ }));
54
+ ws.on("error", (e) => console.error(`Error on connection ${clientId}:`, e));
55
+ });
56
+ // Keep the server up
57
+ yield* Effect.never;
58
+ });
59
+ });
60
+ //# sourceMappingURL=startSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startSync.js","sourceRoot":"","sources":["../src/startSync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -3,19 +3,20 @@
3
3
  "bin": "./dist/index.js",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
- "version": "0.7.35-new-auth.0",
6
+ "version": "0.7.35",
7
7
  "dependencies": {
8
- "effect": "^3.6.5",
9
8
  "@effect/cli": "^0.41.2",
10
- "@effect/schema": "^0.71.1",
11
9
  "@effect/platform-node": "^0.57.2",
12
10
  "@effect/printer": "^0.34.5",
13
11
  "@effect/printer-ansi": "^0.34.5",
12
+ "@effect/schema": "^0.71.1",
14
13
  "@effect/typeclass": "^0.25.5",
14
+ "effect": "^3.6.5",
15
15
  "ws": "^8.14.2",
16
- "cojson": "0.7.34",
17
- "jazz-tools": "0.7.35-new-auth.0",
18
- "cojson-transport-ws": "0.7.34"
16
+ "cojson": "0.7.35",
17
+ "cojson-storage-sqlite": "0.7.35",
18
+ "cojson-transport-ws": "0.7.35",
19
+ "jazz-tools": "0.7.35"
19
20
  },
20
21
  "devDependencies": {
21
22
  "@types/ws": "^8.5.5",
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ /* istanbul ignore file -- @preserve */
2
3
  import { Command, Options } from "@effect/cli";
3
4
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
4
5
  import { Console, Effect } from "effect";
@@ -7,10 +8,11 @@ import { WebSocket } from "ws";
7
8
  import {
8
9
  Account,
9
10
  WasmCrypto,
10
- createJazzContext,
11
+ cojsonInternals,
11
12
  isControlledAccount,
12
13
  } from "jazz-tools";
13
- import { fixedCredentialsAuth, randomSessionProvider } from "jazz-tools/src/internal";
14
+ import type { AccountID } from "cojson";
15
+ import { startSync } from "./startSync.js";
14
16
 
15
17
  const jazzTools = Command.make("jazz-tools");
16
18
 
@@ -63,14 +65,14 @@ const accountCreate = Command.make(
63
65
  });
64
66
 
65
67
  yield* Effect.promise(async () =>
66
- createJazzContext({
67
- auth: fixedCredentialsAuth({
68
- accountID: account.id,
69
- secret: account._raw.agentSecret,
70
- }),
71
- sessionProvider: randomSessionProvider,
68
+ Account.become({
69
+ accountID: account.id,
70
+ accountSecret: account._raw.agentSecret,
71
+ sessionID: cojsonInternals.newRandomSessionID(
72
+ account.id as unknown as AccountID,
73
+ ),
72
74
  peersToLoadFrom: [peer2],
73
- crypto
75
+ crypto,
74
76
  }),
75
77
  );
76
78
 
@@ -86,7 +88,7 @@ const accountBase = Command.make("account");
86
88
 
87
89
  const account = accountBase.pipe(Command.withSubcommands([accountCreate]));
88
90
 
89
- const command = jazzTools.pipe(Command.withSubcommands([account]));
91
+ const command = jazzTools.pipe(Command.withSubcommands([account, startSync]));
90
92
 
91
93
  const cli = Command.run(command, {
92
94
  name: "Jazz CLI Tools",
@@ -0,0 +1,114 @@
1
+ /* istanbul ignore file -- @preserve */
2
+ import { Command, Options } from "@effect/cli";
3
+ import {
4
+ ControlledAgent,
5
+ LocalNode,
6
+ WasmCrypto,
7
+ cojsonInternals,
8
+ } from "cojson";
9
+ import { WebSocketServer } from "ws";
10
+
11
+ import { createWebSocketPeer } from "cojson-transport-ws";
12
+ import { Effect } from "effect";
13
+ import { SQLiteStorage } from "cojson-storage-sqlite";
14
+ import { dirname } from "node:path";
15
+ import { mkdir } from "node:fs/promises";
16
+
17
+ const port = Options.text("port")
18
+ .pipe(Options.withAlias("p"))
19
+ .pipe(
20
+ Options.withDescription(
21
+ "Select a different port for the WebSocket server. Default is 4200",
22
+ ),
23
+ )
24
+ .pipe(Options.withDefault("4200"));
25
+
26
+ const inMemory = Options.boolean("in-memory").pipe(
27
+ Options.withDescription("Use an in-memory storage instead of file-based"),
28
+ );
29
+
30
+ const db = Options.file("db")
31
+ .pipe(
32
+ Options.withDescription(
33
+ "The path to the file where to store the data. Default is 'sync-db/storage.db'",
34
+ ),
35
+ )
36
+ .pipe(Options.withDefault("sync-db/storage.db"));
37
+
38
+ export const startSync = Command.make(
39
+ "sync",
40
+ { port, inMemory, db },
41
+ ({ port, inMemory, db }) => {
42
+ return Effect.gen(function* () {
43
+ const crypto = yield* Effect.promise(() => WasmCrypto.create());
44
+
45
+ const wss = new WebSocketServer({ port: parseInt(port) });
46
+
47
+ console.log(
48
+ "COJSON sync server listening on port " + wss.options.port,
49
+ );
50
+
51
+ const agentSecret = crypto.newRandomAgentSecret();
52
+ const agentID = crypto.getAgentID(agentSecret);
53
+
54
+ const localNode = new LocalNode(
55
+ new ControlledAgent(agentSecret, crypto),
56
+ cojsonInternals.newRandomSessionID(agentID),
57
+ crypto,
58
+ );
59
+
60
+ if (!inMemory) {
61
+ yield* Effect.promise(() =>
62
+ mkdir(dirname(db), { recursive: true }),
63
+ );
64
+
65
+ const storage = yield* Effect.promise(() =>
66
+ SQLiteStorage.asPeer({ filename: db }),
67
+ );
68
+
69
+ localNode.syncManager.addPeer(storage);
70
+ }
71
+
72
+ wss.on("connection", function connection(ws, req) {
73
+ // ping/pong for the connection liveness
74
+ const pinging = setInterval(() => {
75
+ ws.send(
76
+ JSON.stringify({
77
+ type: "ping",
78
+ time: Date.now(),
79
+ dc: "unknown",
80
+ }),
81
+ );
82
+ }, 1500);
83
+
84
+ ws.on("close", () => {
85
+ clearInterval(pinging);
86
+ });
87
+
88
+ const clientAddress =
89
+ (req.headers["x-forwarded-for"] as string | undefined)
90
+ ?.split(",")[0]
91
+ ?.trim() || req.socket.remoteAddress;
92
+
93
+ const clientId = clientAddress + "@" + new Date().toISOString();
94
+
95
+ localNode.syncManager.addPeer(
96
+ createWebSocketPeer({
97
+ id: clientId,
98
+ role: "client",
99
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
+ websocket: ws as any, // TODO: fix types
101
+ expectPings: false,
102
+ }),
103
+ );
104
+
105
+ ws.on("error", (e) =>
106
+ console.error(`Error on connection ${clientId}:`, e),
107
+ );
108
+ });
109
+
110
+ // Keep the server up
111
+ yield* Effect.never;
112
+ });
113
+ },
114
+ );