cojson 0.13.5 → 0.13.7

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.
Files changed (87) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +10 -0
  3. package/LICENSE.txt +1 -1
  4. package/dist/PeerState.d.ts +6 -0
  5. package/dist/PeerState.d.ts.map +1 -1
  6. package/dist/PeerState.js +43 -0
  7. package/dist/PeerState.js.map +1 -1
  8. package/dist/coValueCore.d.ts.map +1 -1
  9. package/dist/coValueCore.js +1 -0
  10. package/dist/coValueCore.js.map +1 -1
  11. package/dist/coValueState.d.ts +1 -0
  12. package/dist/coValueState.d.ts.map +1 -1
  13. package/dist/coValueState.js +27 -2
  14. package/dist/coValueState.js.map +1 -1
  15. package/dist/coValues/group.d.ts +1 -0
  16. package/dist/coValues/group.d.ts.map +1 -1
  17. package/dist/coValues/group.js +45 -21
  18. package/dist/coValues/group.js.map +1 -1
  19. package/dist/crypto/crypto.d.ts +2 -2
  20. package/dist/crypto/crypto.d.ts.map +1 -1
  21. package/dist/permissions.d.ts +1 -0
  22. package/dist/permissions.d.ts.map +1 -1
  23. package/dist/permissions.js +19 -3
  24. package/dist/permissions.js.map +1 -1
  25. package/dist/storage/FileSystem.d.ts +2 -2
  26. package/dist/storage/FileSystem.d.ts.map +1 -1
  27. package/dist/sync.d.ts +14 -4
  28. package/dist/sync.d.ts.map +1 -1
  29. package/dist/sync.js +146 -146
  30. package/dist/sync.js.map +1 -1
  31. package/dist/tests/SyncStateManager.test.js +51 -46
  32. package/dist/tests/SyncStateManager.test.js.map +1 -1
  33. package/dist/tests/coValueCore.test.js +51 -2
  34. package/dist/tests/coValueCore.test.js.map +1 -1
  35. package/dist/tests/coValueState.test.js +31 -4
  36. package/dist/tests/coValueState.test.js.map +1 -1
  37. package/dist/tests/group.test.js +135 -2
  38. package/dist/tests/group.test.js.map +1 -1
  39. package/dist/tests/messagesTestUtils.d.ts +13 -0
  40. package/dist/tests/messagesTestUtils.d.ts.map +1 -0
  41. package/dist/tests/messagesTestUtils.js +42 -0
  42. package/dist/tests/messagesTestUtils.js.map +1 -0
  43. package/dist/tests/sync.load.test.d.ts +2 -0
  44. package/dist/tests/sync.load.test.d.ts.map +1 -0
  45. package/dist/tests/sync.load.test.js +249 -0
  46. package/dist/tests/sync.load.test.js.map +1 -0
  47. package/dist/tests/sync.mesh.test.d.ts +2 -0
  48. package/dist/tests/sync.mesh.test.d.ts.map +1 -0
  49. package/dist/tests/sync.mesh.test.js +157 -0
  50. package/dist/tests/sync.mesh.test.js.map +1 -0
  51. package/dist/tests/sync.peerReconciliation.test.d.ts +2 -0
  52. package/dist/tests/sync.peerReconciliation.test.d.ts.map +1 -0
  53. package/dist/tests/sync.peerReconciliation.test.js +130 -0
  54. package/dist/tests/sync.peerReconciliation.test.js.map +1 -0
  55. package/dist/tests/sync.storage.test.d.ts +2 -0
  56. package/dist/tests/sync.storage.test.d.ts.map +1 -0
  57. package/dist/tests/sync.storage.test.js +201 -0
  58. package/dist/tests/sync.storage.test.js.map +1 -0
  59. package/dist/tests/sync.test.js +139 -1048
  60. package/dist/tests/sync.test.js.map +1 -1
  61. package/dist/tests/sync.upload.test.d.ts +2 -0
  62. package/dist/tests/sync.upload.test.d.ts.map +1 -0
  63. package/dist/tests/sync.upload.test.js +156 -0
  64. package/dist/tests/sync.upload.test.js.map +1 -0
  65. package/dist/tests/testUtils.d.ts +76 -33
  66. package/dist/tests/testUtils.d.ts.map +1 -1
  67. package/dist/tests/testUtils.js +153 -47
  68. package/dist/tests/testUtils.js.map +1 -1
  69. package/package.json +2 -2
  70. package/src/PeerState.ts +59 -1
  71. package/src/coValueCore.ts +1 -0
  72. package/src/coValueState.ts +34 -3
  73. package/src/coValues/group.ts +83 -45
  74. package/src/permissions.ts +31 -3
  75. package/src/sync.ts +169 -185
  76. package/src/tests/SyncStateManager.test.ts +58 -70
  77. package/src/tests/coValueCore.test.ts +70 -1
  78. package/src/tests/coValueState.test.ts +59 -5
  79. package/src/tests/group.test.ts +250 -2
  80. package/src/tests/messagesTestUtils.ts +75 -0
  81. package/src/tests/sync.load.test.ts +327 -0
  82. package/src/tests/sync.mesh.test.ts +219 -0
  83. package/src/tests/sync.peerReconciliation.test.ts +201 -0
  84. package/src/tests/sync.storage.test.ts +259 -0
  85. package/src/tests/sync.test.ts +170 -1245
  86. package/src/tests/sync.upload.test.ts +202 -0
  87. package/src/tests/testUtils.ts +213 -61
@@ -6,6 +6,7 @@ import { WasmCrypto } from "../crypto/WasmCrypto.js";
6
6
  import { LocalNode } from "../localNode.js";
7
7
  import { connectedPeers } from "../streamUtils.js";
8
8
  import { expectGroup } from "../typeUtils/expectGroup.js";
9
+ import { toSimplifiedMessages } from "./messagesTestUtils.js";
9
10
  const Crypto = await WasmCrypto.create();
10
11
  const syncServer = {
11
12
  current: undefined,
@@ -141,17 +142,17 @@ export function shouldNotResolve(promise, ops) {
141
142
  }
142
143
  export function waitFor(callback) {
143
144
  return new Promise((resolve, reject) => {
144
- const checkPassed = () => {
145
+ const checkPassed = async () => {
145
146
  try {
146
- return { ok: callback(), error: null };
147
+ return { ok: await callback(), error: null };
147
148
  }
148
149
  catch (error) {
149
150
  return { ok: false, error };
150
151
  }
151
152
  };
152
153
  let retries = 0;
153
- const interval = setInterval(() => {
154
- const { ok, error } = checkPassed();
154
+ const interval = setInterval(async () => {
155
+ const { ok, error } = await checkPassed();
155
156
  if (ok !== false) {
156
157
  clearInterval(interval);
157
158
  resolve();
@@ -250,66 +251,171 @@ export function createTestMetricReader() {
250
251
  export function tearDownTestMetricReader() {
251
252
  metrics.disable();
252
253
  }
253
- export function setupSyncServer() {
254
- syncServer.current = createTestNode();
255
- return syncServer.current;
256
- }
257
- export async function createConnectedTestAgentNode(opts = { connected: true }) {
258
- if (!syncServer.current) {
259
- throw new Error("Sync server not initialized");
254
+ export class SyncMessagesLog {
255
+ static add(message) {
256
+ this.messages.push(message);
257
+ }
258
+ static clear() {
259
+ this.messages.length = 0;
260
+ }
261
+ static getMessages(coValueMapping) {
262
+ return toSimplifiedMessages(coValueMapping, SyncMessagesLog.messages);
263
+ }
264
+ static debugMessages(coValueMapping) {
265
+ console.log(SyncMessagesLog.getMessages(coValueMapping));
260
266
  }
261
- const [admin, session] = randomAnonymousAccountAndSessionID();
262
- const node = new LocalNode(admin, session, Crypto);
263
- const { nodeToServerPeer, serverToNodePeer, messages, addServerPeer } = connectNodeToSyncServer(node, opts.connected);
264
- return { node, nodeToServerPeer, serverToNodePeer, messages, addServerPeer };
265
267
  }
266
- export async function createConnectedTestNode(opts = { connected: true }) {
267
- if (!syncServer.current) {
268
- throw new Error("Sync server not initialized");
268
+ SyncMessagesLog.messages = [];
269
+ export function setupTestNode(opts = {}) {
270
+ const [admin, session] = randomAnonymousAccountAndSessionID();
271
+ let node = new LocalNode(admin, session, Crypto);
272
+ if (opts.isSyncServer) {
273
+ syncServer.current = node;
274
+ }
275
+ function connectToSyncServer(opts) {
276
+ const currentSyncServer = opts?.syncServer ?? syncServer.current;
277
+ if (!currentSyncServer) {
278
+ throw new Error("Sync server not initialized");
279
+ }
280
+ if (currentSyncServer.account.id === node.account.id) {
281
+ throw new Error("Cannot connect to self");
282
+ }
283
+ const { peer1, peer2 } = connectedPeersWithMessagesTracking({
284
+ peer1: {
285
+ id: currentSyncServer.account.id,
286
+ role: "server",
287
+ name: opts?.syncServerName,
288
+ },
289
+ peer2: { id: node.account.id, role: "client", name: opts?.ourName },
290
+ });
291
+ node.syncManager.addPeer(peer1);
292
+ currentSyncServer.syncManager.addPeer(peer2);
293
+ return {
294
+ peerState: node.syncManager.peers[peer1.id],
295
+ peer: peer1,
296
+ peerStateOnServer: currentSyncServer.syncManager.peers[peer2.id],
297
+ peerOnServer: peer2,
298
+ };
299
+ }
300
+ function addStoragePeer(opts = {}) {
301
+ const storage = createTestNode();
302
+ const { peer1, peer2 } = connectedPeersWithMessagesTracking({
303
+ peer1: { id: storage.account.id, role: "storage" },
304
+ peer2: { id: node.account.id, role: "client", name: opts.ourName },
305
+ });
306
+ peer1.priority = 100;
307
+ node.syncManager.addPeer(peer1);
308
+ storage.syncManager.addPeer(peer2);
309
+ return {
310
+ storage,
311
+ peer: node.syncManager.peers[peer1.id],
312
+ };
269
313
  }
314
+ if (opts.connected) {
315
+ connectToSyncServer();
316
+ }
317
+ return {
318
+ node,
319
+ connectToSyncServer,
320
+ addStoragePeer,
321
+ restart: () => {
322
+ node.gracefulShutdown();
323
+ node = new LocalNode(admin, session, Crypto);
324
+ if (opts.isSyncServer) {
325
+ syncServer.current = node;
326
+ }
327
+ return node;
328
+ },
329
+ };
330
+ }
331
+ export async function setupTestAccount(opts = {}) {
270
332
  const ctx = await LocalNode.withNewlyCreatedAccount({
271
333
  peersToLoadFrom: [],
272
334
  crypto: Crypto,
273
335
  creationProps: { name: "Client" },
274
336
  });
275
- const { nodeToServerPeer, serverToNodePeer, messages, addServerPeer } = connectNodeToSyncServer(ctx.node, opts.connected);
337
+ if (opts.isSyncServer) {
338
+ syncServer.current = ctx.node;
339
+ }
340
+ function connectToSyncServer(opts) {
341
+ const currentSyncServer = opts?.syncServer ?? syncServer.current;
342
+ if (!currentSyncServer) {
343
+ throw new Error("Sync server not initialized");
344
+ }
345
+ if (currentSyncServer.account.id === ctx.node.account.id) {
346
+ throw new Error("Cannot connect to self");
347
+ }
348
+ const { peer1, peer2 } = connectedPeersWithMessagesTracking({
349
+ peer1: {
350
+ id: currentSyncServer.account.id,
351
+ role: "server",
352
+ name: opts?.syncServerName,
353
+ },
354
+ peer2: { id: ctx.node.account.id, role: "client", name: opts?.ourName },
355
+ });
356
+ ctx.node.syncManager.addPeer(peer1);
357
+ currentSyncServer.syncManager.addPeer(peer2);
358
+ function getCurrentPeerState() {
359
+ return ctx.node.syncManager.peers[peer1.id];
360
+ }
361
+ return {
362
+ peerState: getCurrentPeerState(),
363
+ peer: peer1,
364
+ peerStateOnServer: currentSyncServer.syncManager.peers[peer2.id],
365
+ peerOnServer: peer2,
366
+ getCurrentPeerState,
367
+ };
368
+ }
369
+ function addStoragePeer(opts = {}) {
370
+ const storage = createTestNode();
371
+ const { peer1, peer2 } = connectedPeersWithMessagesTracking({
372
+ peer1: { id: storage.account.id, role: "storage" },
373
+ peer2: { id: ctx.node.account.id, role: "client", name: opts.ourName },
374
+ });
375
+ peer1.priority = 100;
376
+ ctx.node.syncManager.addPeer(peer1);
377
+ storage.syncManager.addPeer(peer2);
378
+ return {
379
+ storage,
380
+ peer: ctx.node.syncManager.peers[peer1.id],
381
+ };
382
+ }
383
+ if (opts.connected) {
384
+ connectToSyncServer();
385
+ }
276
386
  return {
277
387
  node: ctx.node,
278
388
  accountID: ctx.accountID,
279
- nodeToServerPeer,
280
- serverToNodePeer,
281
- messages,
282
- addServerPeer,
389
+ connectToSyncServer,
390
+ addStoragePeer,
283
391
  };
284
392
  }
285
- export function connectNodeToSyncServer(node, connected = true) {
286
- if (!syncServer.current) {
287
- throw new Error("Sync server not initialized");
288
- }
289
- const [nodeToServerPeer, serverToNodePeer] = connectedPeers(syncServer.current.account.id, node.account.id, {
290
- peer1role: "server",
291
- peer2role: "client",
393
+ export function connectedPeersWithMessagesTracking(opts) {
394
+ const [peer1, peer2] = connectedPeers(opts.peer1.id, opts.peer2.id, {
395
+ peer1role: opts.peer1.role,
396
+ peer2role: opts.peer2.role,
292
397
  });
293
- const messages = [];
294
- const serverPush = serverToNodePeer.outgoing.push;
295
- serverToNodePeer.outgoing.push = (msg) => {
296
- messages.push({ from: "server", msg });
297
- return serverPush.call(serverToNodePeer.outgoing, msg);
398
+ const peer1Push = peer1.outgoing.push;
399
+ peer1.outgoing.push = (msg) => {
400
+ SyncMessagesLog.add({
401
+ from: opts.peer2.name ?? opts.peer2.role,
402
+ to: opts.peer1.name ?? opts.peer1.role,
403
+ msg,
404
+ });
405
+ return peer1Push.call(peer1.outgoing, msg);
298
406
  };
299
- const clientPush = nodeToServerPeer.outgoing.push;
300
- nodeToServerPeer.outgoing.push = (msg) => {
301
- messages.push({ from: "client", msg });
302
- return clientPush.call(nodeToServerPeer.outgoing, msg);
407
+ const peer2Push = peer2.outgoing.push;
408
+ peer2.outgoing.push = (msg) => {
409
+ SyncMessagesLog.add({
410
+ from: opts.peer1.name ?? opts.peer1.role,
411
+ to: opts.peer2.name ?? opts.peer2.role,
412
+ msg,
413
+ });
414
+ return peer2Push.call(peer2.outgoing, msg);
303
415
  };
304
- syncServer.current.syncManager.addPeer(serverToNodePeer);
305
- if (connected) {
306
- node.syncManager.addPeer(nodeToServerPeer);
307
- }
308
416
  return {
309
- nodeToServerPeer,
310
- serverToNodePeer,
311
- messages,
312
- addServerPeer: () => node.syncManager.addPeer(nodeToServerPeer),
417
+ peer1,
418
+ peer2,
313
419
  };
314
420
  }
315
421
  //# sourceMappingURL=testUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "type": "module",
27
27
  "license": "MIT",
28
- "version": "0.13.5",
28
+ "version": "0.13.7",
29
29
  "devDependencies": {
30
30
  "@opentelemetry/sdk-metrics": "^2.0.0",
31
- "typescript": "~5.6.2"
31
+ "typescript": "5.6.2"
32
32
  },
33
33
  "dependencies": {
34
34
  "@noble/ciphers": "^0.1.3",
package/src/PeerState.ts CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  QueueEntry,
5
5
  } from "./PriorityBasedMessageQueue.js";
6
6
  import { TryAddTransactionsError } from "./coValueCore.js";
7
- import { RawCoID } from "./ids.js";
7
+ import { RawCoID, SessionID } from "./ids.js";
8
8
  import { logger } from "./logger.js";
9
9
  import { CO_VALUE_PRIORITY } from "./priority.js";
10
10
  import { Peer, SyncMessage } from "./sync.js";
@@ -12,6 +12,9 @@ import { Peer, SyncMessage } from "./sync.js";
12
12
  export class PeerState {
13
13
  private queue: PriorityBasedMessageQueue;
14
14
 
15
+ incomingMessagesProcessingPromise: Promise<void> | undefined;
16
+ nextPeer: Peer | undefined;
17
+
15
18
  constructor(
16
19
  private peer: Peer,
17
20
  knownStates: PeerKnownStates | undefined,
@@ -141,6 +144,29 @@ export class PeerState {
141
144
  }
142
145
  }
143
146
 
147
+ closeListeners = new Set<() => void>();
148
+
149
+ addCloseListener(listener: () => void) {
150
+ if (this.closed) {
151
+ listener();
152
+ return () => {};
153
+ }
154
+
155
+ this.closeListeners.add(listener);
156
+
157
+ return () => {
158
+ this.closeListeners.delete(listener);
159
+ };
160
+ }
161
+
162
+ emitClose() {
163
+ for (const listener of this.closeListeners) {
164
+ listener();
165
+ }
166
+
167
+ this.closeListeners.clear();
168
+ }
169
+
144
170
  gracefulShutdown() {
145
171
  logger.debug("Gracefully closing", {
146
172
  peerId: this.id,
@@ -149,5 +175,37 @@ export class PeerState {
149
175
  this.closeQueue();
150
176
  this.peer.outgoing.close();
151
177
  this.closed = true;
178
+ this.emitClose();
179
+ }
180
+
181
+ async processIncomingMessages(callback: (msg: SyncMessage) => Promise<void>) {
182
+ if (this.closed) {
183
+ throw new Error("Peer is closed");
184
+ }
185
+
186
+ if (this.incomingMessagesProcessingPromise) {
187
+ throw new Error("Incoming messages processing already in progress");
188
+ }
189
+
190
+ const processIncomingMessages = async () => {
191
+ for await (const msg of this.incoming) {
192
+ if (msg === "Disconnected") {
193
+ break;
194
+ }
195
+ if (msg === "PingTimeout") {
196
+ logger.error("Ping timeout from peer", {
197
+ peerId: this.id,
198
+ peerRole: this.role,
199
+ });
200
+ break;
201
+ }
202
+
203
+ await callback(msg);
204
+ }
205
+ };
206
+
207
+ this.incomingMessagesProcessingPromise = processIncomingMessages();
208
+
209
+ return this.incomingMessagesProcessingPromise;
152
210
  }
153
211
  }
@@ -460,6 +460,7 @@ export class CoValueCore {
460
460
  )._unsafeUnwrap({ withStackTrace: true });
461
461
 
462
462
  if (success) {
463
+ this.node.syncManager.recordTransactionsSize([transaction], "local");
463
464
  void this.node.syncManager.syncCoValue(this);
464
465
  }
465
466
 
@@ -1,3 +1,5 @@
1
+ import { ValueType } from "@opentelemetry/api";
2
+ import { UpDownCounter, metrics } from "@opentelemetry/api";
1
3
  import { PeerState } from "./PeerState.js";
2
4
  import { CoValueCore } from "./coValueCore.js";
3
5
  import { RawCoID } from "./ids.js";
@@ -106,11 +108,24 @@ type CoValueStateType =
106
108
  export class CoValueState {
107
109
  promise?: Promise<CoValueCore | "unavailable">;
108
110
  private resolve?: (value: CoValueCore | "unavailable") => void;
111
+ private counter: UpDownCounter;
109
112
 
110
113
  constructor(
111
114
  public id: RawCoID,
112
115
  public state: CoValueStateType,
113
- ) {}
116
+ ) {
117
+ this.counter = metrics
118
+ .getMeter("cojson")
119
+ .createUpDownCounter("jazz.covalues.loaded", {
120
+ description: "The number of covalues in the system",
121
+ unit: "covalue",
122
+ valueType: ValueType.INT,
123
+ });
124
+
125
+ this.counter.add(1, {
126
+ state: this.state.type,
127
+ });
128
+ }
114
129
 
115
130
  static Unknown(id: RawCoID) {
116
131
  return new CoValueState(id, new CoValueUnknownState());
@@ -151,8 +166,15 @@ export class CoValueState {
151
166
  }
152
167
 
153
168
  private moveToState(value: CoValueStateType) {
169
+ this.counter.add(-1, {
170
+ state: this.state.type,
171
+ });
154
172
  this.state = value;
155
173
 
174
+ this.counter.add(1, {
175
+ state: this.state.type,
176
+ });
177
+
156
178
  if (!this.resolve) {
157
179
  return;
158
180
  }
@@ -274,6 +296,10 @@ async function loadCoValueFromPeers(
274
296
  ) {
275
297
  for (const peer of peers) {
276
298
  if (peer.closed) {
299
+ coValueEntry.dispatch({
300
+ type: "not-found-in-peer",
301
+ peerId: peer.id,
302
+ });
277
303
  continue;
278
304
  }
279
305
 
@@ -326,7 +352,7 @@ async function loadCoValueFromPeers(
326
352
  ? CO_VALUE_LOADING_CONFIG.TIMEOUT * 10
327
353
  : CO_VALUE_LOADING_CONFIG.TIMEOUT;
328
354
 
329
- const timeout = setTimeout(() => {
355
+ const handleTimeoutOrClose = () => {
330
356
  if (coValueEntry.state.type === "loading") {
331
357
  logger.warn("Failed to load coValue from peer", {
332
358
  coValueId: coValueEntry.id,
@@ -339,9 +365,14 @@ async function loadCoValueFromPeers(
339
365
  });
340
366
  resolve();
341
367
  }
342
- }, timeoutDuration);
368
+ };
369
+
370
+ const timeout = setTimeout(handleTimeoutOrClose, timeoutDuration);
371
+ const closeListener = peer.addCloseListener(handleTimeoutOrClose);
372
+
343
373
  await Promise.race([promise, coValueEntry.state.waitForPeer(peer.id)]);
344
374
  clearTimeout(timeout);
375
+ closeListener();
345
376
  }
346
377
  }
347
378
  }
@@ -258,29 +258,38 @@ export class RawGroup<
258
258
  role: Role,
259
259
  ) {
260
260
  if (account === EVERYONE) {
261
- if (!(role === "reader" || role === "writer")) {
261
+ if (!(role === "reader" || role === "writer" || role === "writeOnly")) {
262
262
  throw new Error(
263
- "Can't make everyone something other than reader or writer",
263
+ "Can't make everyone something other than reader, writer or writeOnly",
264
264
  );
265
265
  }
266
-
267
266
  const currentReadKey = this.core.getCurrentReadKey();
268
267
 
269
268
  if (!currentReadKey.secret) {
270
269
  throw new Error("Can't add member without read key secret");
271
270
  }
272
271
 
272
+ const previousRole = this.get(account);
273
+
273
274
  this.set(account, role, "trusting");
274
275
 
275
276
  if (this.get(account) !== role) {
276
277
  throw new Error("Failed to set role");
277
278
  }
278
279
 
279
- this.set(
280
- `${currentReadKey.id}_for_${EVERYONE}`,
281
- currentReadKey.secret,
282
- "trusting",
283
- );
280
+ if (role === "writeOnly") {
281
+ if (previousRole === "reader" || previousRole === "writer") {
282
+ this.rotateReadKey();
283
+ }
284
+
285
+ this.delete(`${currentReadKey.id}_for_${EVERYONE}`);
286
+ } else {
287
+ this.set(
288
+ `${currentReadKey.id}_for_${EVERYONE}`,
289
+ currentReadKey.secret,
290
+ "trusting",
291
+ );
292
+ }
284
293
 
285
294
  return;
286
295
  }
@@ -299,44 +308,18 @@ export class RawGroup<
299
308
  * invite.
300
309
  */
301
310
  if (role === "writeOnly" || role === "writeOnlyInvite") {
302
- const writeKeyForNewMember = this.core.crypto.newRandomKeySecret();
311
+ const previousRole = this.get(memberKey);
303
312
 
304
- this.set(memberKey, role, "trusting");
305
- this.set(`writeKeyFor_${memberKey}`, writeKeyForNewMember.id, "trusting");
306
-
307
- this.storeKeyRevelationForMember(
308
- memberKey,
309
- agent,
310
- writeKeyForNewMember.id,
311
- writeKeyForNewMember.secret,
312
- );
313
-
314
- for (const otherMemberKey of this.getMemberKeys()) {
315
- const memberRole = this.get(otherMemberKey);
316
-
317
- if (
318
- memberRole === "reader" ||
319
- memberRole === "writer" ||
320
- memberRole === "admin" ||
321
- memberRole === "readerInvite" ||
322
- memberRole === "writerInvite" ||
323
- memberRole === "adminInvite"
324
- ) {
325
- const otherMemberAgent = this.core.node
326
- .resolveAccountAgent(
327
- otherMemberKey,
328
- "Expected member agent to be loaded",
329
- )
330
- ._unsafeUnwrap({ withStackTrace: true });
331
-
332
- this.storeKeyRevelationForMember(
333
- otherMemberKey,
334
- otherMemberAgent,
335
- writeKeyForNewMember.id,
336
- writeKeyForNewMember.secret,
337
- );
338
- }
313
+ if (
314
+ previousRole === "reader" ||
315
+ previousRole === "writer" ||
316
+ previousRole === "admin"
317
+ ) {
318
+ this.rotateReadKey();
339
319
  }
320
+
321
+ this.set(memberKey, role, "trusting");
322
+ this.internalCreateWriteOnlyKeyForMember(memberKey, agent);
340
323
  } else {
341
324
  const currentReadKey = this.core.getCurrentReadKey();
342
325
 
@@ -370,6 +353,49 @@ export class RawGroup<
370
353
  }
371
354
  }
372
355
 
356
+ internalCreateWriteOnlyKeyForMember(
357
+ memberKey: RawAccountID | AgentID,
358
+ agent: AgentID,
359
+ ) {
360
+ const writeKeyForNewMember = this.core.crypto.newRandomKeySecret();
361
+
362
+ this.set(`writeKeyFor_${memberKey}`, writeKeyForNewMember.id, "trusting");
363
+
364
+ this.storeKeyRevelationForMember(
365
+ memberKey,
366
+ agent,
367
+ writeKeyForNewMember.id,
368
+ writeKeyForNewMember.secret,
369
+ );
370
+
371
+ for (const otherMemberKey of this.getMemberKeys()) {
372
+ const memberRole = this.get(otherMemberKey);
373
+
374
+ if (
375
+ memberRole === "reader" ||
376
+ memberRole === "writer" ||
377
+ memberRole === "admin" ||
378
+ memberRole === "readerInvite" ||
379
+ memberRole === "writerInvite" ||
380
+ memberRole === "adminInvite"
381
+ ) {
382
+ const otherMemberAgent = this.core.node
383
+ .resolveAccountAgent(
384
+ otherMemberKey,
385
+ "Expected member agent to be loaded",
386
+ )
387
+ ._unsafeUnwrap({ withStackTrace: true });
388
+
389
+ this.storeKeyRevelationForMember(
390
+ otherMemberKey,
391
+ otherMemberAgent,
392
+ writeKeyForNewMember.id,
393
+ writeKeyForNewMember.secret,
394
+ );
395
+ }
396
+ }
397
+ }
398
+
373
399
  private storeKeyRevelationForMember(
374
400
  memberKey: RawAccountID | AgentID,
375
401
  agent: AgentID,
@@ -409,7 +435,19 @@ export class RawGroup<
409
435
  if (this.myRole() === "writeOnly") {
410
436
  const accountId = this.core.node.account.id;
411
437
 
412
- return this.get(`writeKeyFor_${accountId}`) as KeyID;
438
+ const key = this.get(`writeKeyFor_${accountId}`) as KeyID;
439
+
440
+ // When everyone is writeOnly, we need to create a writeOnly key for the current account if missing
441
+ if (!key && this.get("everyone") === "writeOnly") {
442
+ this.internalCreateWriteOnlyKeyForMember(
443
+ accountId,
444
+ this.core.node.account.currentAgentID(),
445
+ );
446
+
447
+ return this.get(`writeKeyFor_${accountId}`) as KeyID;
448
+ }
449
+
450
+ return key;
413
451
  }
414
452
 
415
453
  return this.get("readKey");