document-drive 1.0.0-alpha.73 → 1.0.0-alpha.74

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "document-drive",
3
- "version": "1.0.0-alpha.73",
3
+ "version": "1.0.0-alpha.74",
4
4
  "license": "AGPL-3.0-only",
5
5
  "type": "module",
6
6
  "module": "./src/index.ts",
@@ -432,7 +432,7 @@ export class DocumentDriveServer extends BaseDocumentDriveServer {
432
432
  public async getSynchronizationUnitIdInfo(
433
433
  driveId: string,
434
434
  syncId: string
435
- ): Promise<Omit<SynchronizationUnit, "revision" | "lastUpdated"> | undefined> {
435
+ ): Promise<SynchronizationUnitQuery | undefined> {
436
436
  const drive = await this.getDrive(driveId);
437
437
  const node = drive.state.global.nodes.find(
438
438
  node =>
@@ -605,9 +605,18 @@ export class DocumentDriveServer extends BaseDocumentDriveServer {
605
605
  }
606
606
 
607
607
  async deleteDrive(id: string) {
608
- this.stopSyncRemoteDrive(id);
609
- await this.cache.deleteDocument('drives', id);
610
- return this.storage.deleteDrive(id);
608
+ const result = await Promise.allSettled([
609
+ this.stopSyncRemoteDrive(id),
610
+ this.listenerStateManager.removeDrive(id),
611
+ this.cache.deleteDocument('drives', id),
612
+ this.storage.deleteDrive(id)
613
+ ]);
614
+
615
+ result.forEach(r => {
616
+ if (r.status === "rejected") {
617
+ throw r.reason;
618
+ }
619
+ });
611
620
  }
612
621
 
613
622
  getDrives() {
@@ -53,7 +53,7 @@ export class ListenerManager extends BaseListenerManager {
53
53
  driveId: string,
54
54
  listenerId: string
55
55
  ): Promise<ITransmitter | undefined> {
56
- return this.transmitters[driveId]?.[listenerId];
56
+ return Promise.resolve(this.transmitters[driveId]?.[listenerId]);
57
57
  }
58
58
 
59
59
  async addListener(listener: Listener) {
@@ -106,7 +106,7 @@ export class ListenerManager extends BaseListenerManager {
106
106
  const driveTransmitters = this.transmitters[drive] || {};
107
107
  driveTransmitters[listener.listenerId] = transmitter;
108
108
  this.transmitters[drive] = driveTransmitters;
109
- return transmitter;
109
+ return Promise.resolve(transmitter);
110
110
  }
111
111
 
112
112
  async removeListener(driveId: string, listenerId: string) {
@@ -115,7 +115,7 @@ export class ListenerManager extends BaseListenerManager {
115
115
  return false;
116
116
  }
117
117
 
118
- return driveMap.delete(listenerId);
118
+ return Promise.resolve(driveMap.delete(listenerId));
119
119
  }
120
120
 
121
121
  async removeSyncUnits(driveId: string, syncUnits: Pick<SynchronizationUnit, "syncId">[]) {
@@ -128,6 +128,7 @@ export class ListenerManager extends BaseListenerManager {
128
128
  listener.syncUnits.delete(syncUnit.syncId);
129
129
  }
130
130
  }
131
+ return Promise.resolve();
131
132
  }
132
133
 
133
134
  async updateSynchronizationRevisions(
@@ -203,6 +204,8 @@ export class ListenerManager extends BaseListenerManager {
203
204
  } else {
204
205
  listener.syncUnits.set(syncId, { listenerRev, lastUpdated });
205
206
  }
207
+
208
+ return Promise.resolve();
206
209
  }
207
210
 
208
211
  triggerUpdate = debounce(
@@ -243,7 +246,7 @@ export class ListenerManager extends BaseListenerManager {
243
246
 
244
247
  const opData: OperationUpdate[] = [];
245
248
  try {
246
- const data = await this.drive.getOperationData( // DEAL WITH INVALID SYNC ID ERROR
249
+ const data = await this.drive.getOperationData( // TODO - join queries, DEAL WITH INVALID SYNC ID ERROR
247
250
  driveId,
248
251
  syncUnit.syncId,
249
252
  {
@@ -413,6 +416,14 @@ export class ListenerManager extends BaseListenerManager {
413
416
  }
414
417
  }
415
418
 
419
+ async removeDrive(driveId: string): Promise<void> {
420
+ this.listenerState.delete(driveId);
421
+ const transmitters = this.transmitters[driveId];
422
+ if (transmitters) {
423
+ await Promise.all(Object.values(transmitters).map(t => t.disconnect?.()));
424
+ }
425
+ }
426
+
416
427
  getListener(driveId: string, listenerId: string): Promise<ListenerState> {
417
428
  const drive = this.listenerState.get(driveId);
418
429
  if (!drive) throw new Error('Drive not found');
@@ -12,6 +12,7 @@ import { logger } from '../../../utils/logger';
12
12
 
13
13
  export interface IReceiver {
14
14
  transmit: (strands: InternalTransmitterUpdate[]) => Promise<void>;
15
+ disconnect: () => Promise<void>;
15
16
  }
16
17
 
17
18
  export type InternalTransmitterUpdate<
@@ -88,4 +89,8 @@ export class InternalTransmitter implements ITransmitter {
88
89
  setReceiver(receiver: IReceiver) {
89
90
  this.receiver = receiver;
90
91
  }
92
+
93
+ async disconnect(): Promise<void> {
94
+ await this.receiver?.disconnect();
95
+ }
91
96
  }
@@ -6,6 +6,7 @@ import { ListenerRevision, StrandUpdate } from '../..';
6
6
 
7
7
  export interface ITransmitter {
8
8
  transmit(strands: StrandUpdate[]): Promise<ListenerRevision[]>;
9
+ disconnect?(): Promise<void>;
9
10
  }
10
11
 
11
12
  export interface InternalTransmitterService extends ITransmitter {
@@ -351,6 +351,7 @@ export abstract class BaseListenerManager {
351
351
  }
352
352
 
353
353
  abstract initDrive(drive: DocumentDriveDocument): Promise<void>;
354
+ abstract removeDrive(driveId: DocumentDriveState["id"]): Promise<void>;
354
355
 
355
356
  abstract addListener(listener: Listener): Promise<ITransmitter>;
356
357
  abstract removeListener(