@towns-protocol/sdk 0.0.242 → 0.0.245
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/client.d.ts +5 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +61 -18
- package/dist/client.js.map +1 -1
- package/dist/id.d.ts +3 -1
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +3 -0
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +4 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -8
- package/dist/index.js.map +1 -1
- package/dist/makeAuthenticationRpcClient.d.ts +1 -1
- package/dist/makeAuthenticationRpcClient.d.ts.map +1 -1
- package/dist/makeAuthenticationRpcClient.js +2 -2
- package/dist/makeAuthenticationRpcClient.js.map +1 -1
- package/dist/makeNotificationRpcClient.d.ts +1 -1
- package/dist/makeNotificationRpcClient.d.ts.map +1 -1
- package/dist/makeNotificationRpcClient.js +2 -2
- package/dist/makeNotificationRpcClient.js.map +1 -1
- package/dist/makeStreamRpcClient.d.ts +1 -1
- package/dist/makeStreamRpcClient.d.ts.map +1 -1
- package/dist/makeStreamRpcClient.js +2 -2
- package/dist/makeStreamRpcClient.js.map +1 -1
- package/dist/notificationService.d.ts.map +1 -1
- package/dist/notificationService.js +2 -1
- package/dist/notificationService.js.map +1 -1
- package/dist/riverConfig.js +1 -1
- package/dist/riverConfig.js.map +1 -1
- package/dist/rpcCommon.d.ts +1 -3
- package/dist/rpcCommon.d.ts.map +1 -1
- package/dist/rpcCommon.js +1 -13
- package/dist/rpcCommon.js.map +1 -1
- package/dist/sign.d.ts +1 -1
- package/dist/sign.d.ts.map +1 -1
- package/dist/sign.js +13 -7
- package/dist/sign.js.map +1 -1
- package/dist/stream.d.ts +4 -2
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +9 -6
- package/dist/stream.js.map +1 -1
- package/dist/streamEvents.d.ts +3 -3
- package/dist/streamEvents.d.ts.map +1 -1
- package/dist/streamStateView.d.ts +9 -6
- package/dist/streamStateView.d.ts.map +1 -1
- package/dist/streamStateView.js +58 -62
- package/dist/streamStateView.js.map +1 -1
- package/dist/streamStateView_Space.js +1 -1
- package/dist/streamStateView_Space.js.map +1 -1
- package/dist/streamStateView_UserMetadata.js +1 -1
- package/dist/streamStateView_UserMetadata.js.map +1 -1
- package/dist/streamUtils.d.ts.map +1 -1
- package/dist/streamUtils.js +2 -0
- package/dist/streamUtils.js.map +1 -1
- package/dist/streams-view/streamsView.d.ts +7 -0
- package/dist/streams-view/streamsView.d.ts.map +1 -0
- package/dist/streams-view/streamsView.js +10 -0
- package/dist/streams-view/streamsView.js.map +1 -0
- package/dist/streams-view/timelineEvents.d.ts +11 -0
- package/dist/streams-view/timelineEvents.d.ts.map +1 -0
- package/dist/{sync-agent/timeline/models/timelineEvent.js → streams-view/timelineEvents.js} +240 -303
- package/dist/streams-view/timelineEvents.js.map +1 -0
- package/dist/streams-view/timelinesView.d.ts +26 -0
- package/dist/streams-view/timelinesView.d.ts.map +1 -0
- package/dist/streams-view/timelinesView.js +111 -0
- package/dist/streams-view/timelinesView.js.map +1 -0
- package/dist/streams-view/timelinesViewModel.d.ts +38 -0
- package/dist/streams-view/timelinesViewModel.d.ts.map +1 -0
- package/dist/streams-view/timelinesViewModel.js +681 -0
- package/dist/streams-view/timelinesViewModel.js.map +1 -0
- package/dist/sync-agent/dms/models/dm.js +2 -2
- package/dist/sync-agent/dms/models/dm.js.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.js +2 -2
- package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
- package/dist/sync-agent/spaces/models/channel.js +3 -3
- package/dist/sync-agent/spaces/models/channel.js.map +1 -1
- package/dist/sync-agent/syncAgent.d.ts.map +1 -1
- package/dist/sync-agent/syncAgent.js +4 -0
- package/dist/sync-agent/syncAgent.js.map +1 -1
- package/dist/sync-agent/timeline/models/timeline-types.d.ts +2 -1
- package/dist/sync-agent/timeline/models/timeline-types.d.ts.map +1 -1
- package/dist/sync-agent/timeline/models/timeline-types.js +109 -0
- package/dist/sync-agent/timeline/models/timeline-types.js.map +1 -1
- package/dist/sync-agent/timeline/timeline.d.ts +9 -26
- package/dist/sync-agent/timeline/timeline.d.ts.map +1 -1
- package/dist/sync-agent/timeline/timeline.js +21 -226
- package/dist/sync-agent/timeline/timeline.js.map +1 -1
- package/dist/syncedStream.d.ts +2 -1
- package/dist/syncedStream.d.ts.map +1 -1
- package/dist/syncedStream.js +11 -12
- package/dist/syncedStream.js.map +1 -1
- package/dist/syncedStreams.d.ts +1 -0
- package/dist/syncedStreams.d.ts.map +1 -1
- package/dist/syncedStreams.js.map +1 -1
- package/dist/syncedStreamsLoop.d.ts +1 -0
- package/dist/syncedStreamsLoop.d.ts.map +1 -1
- package/dist/syncedStreamsLoop.js +7 -2
- package/dist/syncedStreamsLoop.js.map +1 -1
- package/dist/tags.d.ts.map +1 -1
- package/dist/tags.js +15 -16
- package/dist/tags.js.map +1 -1
- package/dist/tests/bob_testUtils.d.ts.map +1 -1
- package/dist/tests/bob_testUtils.js +4 -1
- package/dist/tests/bob_testUtils.js.map +1 -1
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js +3 -3
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js.map +1 -1
- package/dist/tests/multi/sync-agent/timeline.test.js +12 -7
- package/dist/tests/multi/sync-agent/timeline.test.js.map +1 -1
- package/dist/tests/multi/transactions_SpaceReview.test.js +11 -17
- package/dist/tests/multi/transactions_SpaceReview.test.js.map +1 -1
- package/dist/tests/multi/transactions_Tip.test.js +16 -20
- package/dist/tests/multi/transactions_Tip.test.js.map +1 -1
- package/dist/tests/multi_ne/channels.test.js +6 -8
- package/dist/tests/multi_ne/channels.test.js.map +1 -1
- package/dist/tests/multi_ne/client.test.js +45 -62
- package/dist/tests/multi_ne/client.test.js.map +1 -1
- package/dist/tests/multi_ne/clientDecryptionExtensions.test.js +6 -11
- package/dist/tests/multi_ne/clientDecryptionExtensions.test.js.map +1 -1
- package/dist/tests/multi_ne/deviceKeyMessage.test.js +6 -4
- package/dist/tests/multi_ne/deviceKeyMessage.test.js.map +1 -1
- package/dist/tests/multi_ne/gdms.test.js +6 -1
- package/dist/tests/multi_ne/gdms.test.js.map +1 -1
- package/dist/tests/multi_ne/media.test.js +1 -1
- package/dist/tests/multi_ne/media.test.js.map +1 -1
- package/dist/tests/multi_ne/space.test.js +1 -1
- package/dist/tests/multi_ne/space.test.js.map +1 -1
- package/dist/tests/multi_ne/streamRpcClient.test.js +4 -1
- package/dist/tests/multi_ne/streamRpcClient.test.js.map +1 -1
- package/dist/tests/multi_ne/streamRpcClientSync.test.js +8 -2
- package/dist/tests/multi_ne/streamRpcClientSync.test.js.map +1 -1
- package/dist/tests/multi_ne/syncWithBlocks.test.js +4 -1
- package/dist/tests/multi_ne/syncWithBlocks.test.js.map +1 -1
- package/dist/tests/multi_ne/syncedStream.test.js +39 -7
- package/dist/tests/multi_ne/syncedStream.test.js.map +1 -1
- package/dist/tests/multi_ne/syncedStreams.test.js +9 -365
- package/dist/tests/multi_ne/syncedStreams.test.js.map +1 -1
- package/dist/tests/multi_ne/tags.test.js +114 -85
- package/dist/tests/multi_ne/tags.test.js.map +1 -1
- package/dist/tests/multi_ne/userSettings.test.js +15 -15
- package/dist/tests/multi_ne/userSettings.test.js.map +1 -1
- package/dist/tests/syncAgent_testUtils.d.ts.map +1 -1
- package/dist/tests/syncAgent_testUtils.js +4 -0
- package/dist/tests/syncAgent_testUtils.js.map +1 -1
- package/dist/tests/testDriver_testUtils.d.ts.map +1 -1
- package/dist/tests/testDriver_testUtils.js +4 -7
- package/dist/tests/testDriver_testUtils.js.map +1 -1
- package/dist/tests/testUtils.d.ts +1 -0
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +13 -4
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/unit/crypto.test.js +6 -0
- package/dist/tests/unit/crypto.test.js.map +1 -1
- package/dist/tests/unit/crypto_utils.test.js +1 -1
- package/dist/tests/unit/crypto_utils.test.js.map +1 -1
- package/dist/tests/unit/helpers/ConversationBuilder.d.ts +39 -0
- package/dist/tests/unit/helpers/ConversationBuilder.d.ts.map +1 -0
- package/dist/tests/unit/helpers/ConversationBuilder.js +171 -0
- package/dist/tests/unit/helpers/ConversationBuilder.js.map +1 -0
- package/dist/tests/unit/timelineStoreInterface.test.d.ts +5 -0
- package/dist/tests/unit/timelineStoreInterface.test.d.ts.map +1 -0
- package/dist/tests/unit/timelineStoreInterface.test.js +343 -0
- package/dist/tests/unit/timelineStoreInterface.test.js.map +1 -0
- package/dist/unauthenticatedClient.d.ts +2 -1
- package/dist/unauthenticatedClient.d.ts.map +1 -1
- package/dist/unauthenticatedClient.js +2 -2
- package/dist/unauthenticatedClient.js.map +1 -1
- package/package.json +11 -10
- package/dist/crypto_utils.d.ts +0 -15
- package/dist/crypto_utils.d.ts.map +0 -1
- package/dist/crypto_utils.js +0 -99
- package/dist/crypto_utils.js.map +0 -1
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.d.ts +0 -12
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.js +0 -20
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.js.map +0 -1
- package/dist/sync-agent/timeline/models/reactions.d.ts +0 -13
- package/dist/sync-agent/timeline/models/reactions.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/reactions.js +0 -67
- package/dist/sync-agent/timeline/models/reactions.js.map +0 -1
- package/dist/sync-agent/timeline/models/replacedEvents.d.ts +0 -18
- package/dist/sync-agent/timeline/models/replacedEvents.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/replacedEvents.js +0 -19
- package/dist/sync-agent/timeline/models/replacedEvents.js.map +0 -1
- package/dist/sync-agent/timeline/models/threadStats.d.ts +0 -14
- package/dist/sync-agent/timeline/models/threadStats.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/threadStats.js +0 -99
- package/dist/sync-agent/timeline/models/threadStats.js.map +0 -1
- package/dist/sync-agent/timeline/models/threads.d.ts +0 -14
- package/dist/sync-agent/timeline/models/threads.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/threads.js +0 -57
- package/dist/sync-agent/timeline/models/threads.js.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvent.d.ts +0 -12
- package/dist/sync-agent/timeline/models/timelineEvent.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvent.js.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvents.d.ts +0 -13
- package/dist/sync-agent/timeline/models/timelineEvents.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvents.js +0 -37
- package/dist/sync-agent/timeline/models/timelineEvents.js.map +0 -1
package/dist/stream.d.ts
CHANGED
|
@@ -6,16 +6,18 @@ import { LocalEventStatus, ParsedEvent, ParsedMiniblock, ParsedSnapshot } from '
|
|
|
6
6
|
import { StreamEvents } from './streamEvents';
|
|
7
7
|
import { DecryptedContent } from './encryptedContentTypes';
|
|
8
8
|
import { DecryptionSessionError } from '@towns-protocol/encryption';
|
|
9
|
+
import { StreamsView } from './streams-view/streamsView';
|
|
9
10
|
declare const Stream_base: new () => TypedEmitter<StreamEvents>;
|
|
10
11
|
export declare class Stream extends Stream_base {
|
|
11
12
|
readonly clientEmitter: TypedEmitter<StreamEvents>;
|
|
12
13
|
readonly logEmitFromStream: DLogger;
|
|
13
14
|
readonly userId: string;
|
|
14
15
|
readonly streamId: string;
|
|
16
|
+
readonly streamsView: StreamsView;
|
|
15
17
|
_view: StreamStateView;
|
|
16
18
|
get view(): StreamStateView;
|
|
17
19
|
private stopped;
|
|
18
|
-
constructor(userId: string, streamId: string, clientEmitter: TypedEmitter<StreamEvents>, logEmitFromStream: DLogger);
|
|
20
|
+
constructor(userId: string, streamId: string, streamsView: StreamsView, clientEmitter: TypedEmitter<StreamEvents>, logEmitFromStream: DLogger);
|
|
19
21
|
get syncCookie(): SyncCookie | undefined;
|
|
20
22
|
/**
|
|
21
23
|
* NOTE: Separating initial rollup from the constructor allows consumer to subscribe to events
|
|
@@ -23,7 +25,7 @@ export declare class Stream extends Stream_base {
|
|
|
23
25
|
*/
|
|
24
26
|
initialize(nextSyncCookie: SyncCookie, minipoolEvents: ParsedEvent[], snapshot: Snapshot, miniblocks: ParsedMiniblock[], prependedMiniblocks: ParsedMiniblock[], prevSnapshotMiniblockNum: bigint, cleartexts: Record<string, Uint8Array | string> | undefined): void;
|
|
25
27
|
stop(): void;
|
|
26
|
-
appendEvents(events: ParsedEvent[], nextSyncCookie: SyncCookie,
|
|
28
|
+
appendEvents(events: ParsedEvent[], nextSyncCookie: SyncCookie, _snapshot: ParsedSnapshot | undefined, cleartexts: Record<string, Uint8Array | string> | undefined): Promise<void>;
|
|
27
29
|
prependEvents(miniblocks: ParsedMiniblock[], cleartexts: Record<string, Uint8Array | string> | undefined, terminus: boolean): void;
|
|
28
30
|
appendLocalEvent(channelMessage: ChannelMessage, status: LocalEventStatus): string;
|
|
29
31
|
updateDecryptedContent(eventId: string, content: DecryptedContent): void;
|
package/dist/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE9C,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EACH,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,EAEjB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
|
package/dist/stream.js
CHANGED
|
@@ -6,18 +6,20 @@ export class Stream extends EventEmitter {
|
|
|
6
6
|
logEmitFromStream;
|
|
7
7
|
userId;
|
|
8
8
|
streamId;
|
|
9
|
+
streamsView;
|
|
9
10
|
_view;
|
|
10
11
|
get view() {
|
|
11
12
|
return this._view;
|
|
12
13
|
}
|
|
13
14
|
stopped = false;
|
|
14
|
-
constructor(userId, streamId, clientEmitter, logEmitFromStream) {
|
|
15
|
+
constructor(userId, streamId, streamsView, clientEmitter, logEmitFromStream) {
|
|
15
16
|
super();
|
|
16
17
|
this.clientEmitter = clientEmitter;
|
|
17
18
|
this.logEmitFromStream = logEmitFromStream;
|
|
18
19
|
this.userId = userId;
|
|
19
|
-
this._view = new StreamStateView(userId, streamId);
|
|
20
20
|
this.streamId = streamId;
|
|
21
|
+
this.streamsView = streamsView;
|
|
22
|
+
this._view = new StreamStateView(userId, streamId, streamsView);
|
|
21
23
|
}
|
|
22
24
|
get syncCookie() {
|
|
23
25
|
return this.view.syncCookie;
|
|
@@ -28,17 +30,18 @@ export class Stream extends EventEmitter {
|
|
|
28
30
|
*/
|
|
29
31
|
initialize(nextSyncCookie, minipoolEvents, snapshot, miniblocks, prependedMiniblocks, prevSnapshotMiniblockNum, cleartexts) {
|
|
30
32
|
// grab any local events from the previous view that haven't been processed
|
|
31
|
-
const localEvents = this._view.
|
|
33
|
+
const localEvents = Array.from(this._view.minipoolEvents.values())
|
|
32
34
|
.filter(isLocalEvent)
|
|
33
|
-
.filter((e) => e.hashStr.startsWith('~'))
|
|
34
|
-
|
|
35
|
+
.filter((e) => e.hashStr.startsWith('~'))
|
|
36
|
+
.sort((a, b) => Number(a.eventNum - b.eventNum));
|
|
37
|
+
this._view = new StreamStateView(this.userId, this.streamId, this.streamsView);
|
|
35
38
|
this._view.initialize(nextSyncCookie, minipoolEvents, snapshot, miniblocks, prependedMiniblocks, prevSnapshotMiniblockNum, cleartexts, localEvents, this);
|
|
36
39
|
}
|
|
37
40
|
stop() {
|
|
38
41
|
this.removeAllListeners();
|
|
39
42
|
this.stopped = true;
|
|
40
43
|
}
|
|
41
|
-
async appendEvents(events, nextSyncCookie,
|
|
44
|
+
async appendEvents(events, nextSyncCookie, _snapshot, cleartexts) {
|
|
42
45
|
this._view.appendEvents(events, nextSyncCookie, cleartexts, this);
|
|
43
46
|
}
|
|
44
47
|
prependEvents(miniblocks, cleartexts, terminus) {
|
package/dist/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAKH,YAAY,GACf,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAKH,YAAY,GACf,MAAM,SAAS,CAAA;AAMhB,MAAM,OAAO,MAAO,SAAS,YAAqD;IACrE,aAAa,CAA4B;IACzC,iBAAiB,CAAS;IAC1B,MAAM,CAAQ;IACd,QAAQ,CAAQ;IAChB,WAAW,CAAa;IACjC,KAAK,CAAiB;IACtB,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;IACO,OAAO,GAAG,KAAK,CAAA;IAEvB,YACI,MAAc,EACd,QAAgB,EAChB,WAAwB,EACxB,aAAyC,EACzC,iBAA0B;QAE1B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IACnE,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IAC/B,CAAC;IAED;;;OAGG;IACH,UAAU,CACN,cAA0B,EAC1B,cAA6B,EAC7B,QAAkB,EAClB,UAA6B,EAC7B,mBAAsC,EACtC,wBAAgC,EAChC,UAA2D;QAE3D,2EAA2E;QAC3E,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;aAC7D,MAAM,CAAC,YAAY,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9E,IAAI,CAAC,KAAK,CAAC,UAAU,CACjB,cAAc,EACd,cAAc,EACd,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,WAAW,EACX,IAAI,CACP,CAAA;IACL,CAAC;IAED,IAAI;QACA,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CACd,MAAqB,EACrB,cAA0B,EAC1B,SAAqC,EACrC,UAA2D;QAE3D,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IACrE,CAAC;IAED,aAAa,CACT,UAA6B,EAC7B,UAA2D,EAC3D,QAAiB;QAEjB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1E,CAAC;IAED,gBAAgB,CAAC,cAA8B,EAAE,MAAwB;QACrE,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACpE,CAAC;IAED,sBAAsB,CAAC,OAAe,EAAE,OAAyB;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACpE,CAAC;IAED,2BAA2B,CAAC,OAAe,EAAE,OAA+B;QACxE,OAAO,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACzE,CAAC;IAED,gBAAgB,CAAC,OAAe,EAAE,eAAuB,EAAE,MAAwB;QAC/E,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,CAA+B,KAAQ,EAAE,GAAG,IAAiC;QAC7E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;IACrC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,iBAAiB,CAAC,UAAwB,EAAE,QAAiB;QACtE,8CAA8C;QAC9C,MAAM,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAA;QACtC,0DAA0D;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAC/C,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CACvD,CAAA;IACL,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,OAAO,CAChB,KAAQ,EACR,SAAwB,EACxB,OAA8B,EAAE,SAAS,EAAE,KAAK,EAAE;QAElD,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,OAAM;QACV,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,4BAA4B;YAC5B,MAAM,OAAO,GAAG,GAAS,EAAE;gBACvB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;oBAC/D,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;oBACxB,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;oBACtC,YAAY,CAAC,OAAO,CAAC,CAAA;oBACrB,OAAO,EAAE,CAAA;gBACb,CAAC;YACL,CAAC,CAAA;YAED,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAA;YACtE,qBAAqB;YACrB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;gBAC/D,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;gBACxB,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;gBACtC,MAAM,CAAC,YAAY,CAAC,CAAA;YACxB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAElB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YACvB,IAAI,CAAC,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACN,CAAC;CACJ"}
|
package/dist/streamEvents.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { SnapshotCaseType, FullyReadMarker, UserInboxPayload_GroupEncryptionSessions, UserSettingsPayload_UserBlock, UserPayload_UserMembership, UserInboxPayload_Snapshot_DeviceSummary, BlockchainTransaction_Tip } from '@towns-protocol/proto';
|
|
2
|
-
import { ClientInitStatus, ConfirmedTimelineEvent,
|
|
2
|
+
import { ClientInitStatus, ConfirmedTimelineEvent, LocalTimelineEvent, RemoteTimelineEvent, StreamTimelineEvent } from './types';
|
|
3
3
|
import { EventSignatureBundle, KeySolicitationContent, UserDevice } from '@towns-protocol/encryption';
|
|
4
4
|
import { EncryptedContent } from './encryptedContentTypes';
|
|
5
5
|
import { SyncState } from './syncedStreamsLoop';
|
|
6
6
|
import { Pin } from './streamStateView_Members';
|
|
7
7
|
import { SpaceReviewEventObject } from '@towns-protocol/web3';
|
|
8
|
+
import { TimelineEvent } from './sync-agent/timeline/models/timeline-types';
|
|
8
9
|
export type StreamChange = {
|
|
9
10
|
prepended?: RemoteTimelineEvent[];
|
|
10
11
|
appended?: StreamTimelineEvent[];
|
|
@@ -58,10 +59,9 @@ export type StreamStateEvents = {
|
|
|
58
59
|
channelPinDecrypted: (channelId: string, pin: Pin, index: number) => void;
|
|
59
60
|
fullyReadMarkersUpdated: (channelId: string, fullyReadMarkers: Record<string, FullyReadMarker>) => void;
|
|
60
61
|
userBlockUpdated: (userBlock: UserSettingsPayload_UserBlock) => void;
|
|
61
|
-
eventDecrypted: (streamId: string, contentKind: SnapshotCaseType, event:
|
|
62
|
+
eventDecrypted: (streamId: string, contentKind: SnapshotCaseType, event: TimelineEvent) => void;
|
|
62
63
|
streamInitialized: (streamId: string, contentKind: SnapshotCaseType) => void;
|
|
63
64
|
streamUpToDate: (streamId: string) => void;
|
|
64
|
-
streamUpdated: (streamId: string, contentKind: SnapshotCaseType, change: StreamChange) => void;
|
|
65
65
|
streamLocalEventUpdated: (streamId: string, contentKind: SnapshotCaseType, localEventId: string, event: LocalTimelineEvent) => void;
|
|
66
66
|
streamLatestTimestampUpdated: (streamId: string) => void;
|
|
67
67
|
streamUsernameUpdated: (streamId: string, userId: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamEvents.d.ts","sourceRoot":"","sources":["../src/streamEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,wCAAwC,EACxC,6BAA6B,EAC7B,0BAA0B,EAC1B,uCAAuC,EACvC,yBAAyB,EAC5B,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"streamEvents.d.ts","sourceRoot":"","sources":["../src/streamEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChannelMessage, SnapshotCaseType, SyncCookie, Snapshot } from '@towns-protocol/proto';
|
|
2
2
|
import TypedEmitter from 'typed-emitter';
|
|
3
|
-
import { LocalEventStatus, LocalTimelineEvent, ParsedEvent, ParsedMiniblock, StreamTimelineEvent } from './types';
|
|
3
|
+
import { LocalEventStatus, LocalTimelineEvent, ParsedEvent, ParsedMiniblock, RemoteTimelineEvent, StreamTimelineEvent } from './types';
|
|
4
4
|
import { StreamStateView_Space } from './streamStateView_Space';
|
|
5
5
|
import { StreamStateView_Channel } from './streamStateView_Channel';
|
|
6
6
|
import { StreamStateView_User } from './streamStateView_User';
|
|
@@ -16,12 +16,14 @@ import { DecryptedContent } from './encryptedContentTypes';
|
|
|
16
16
|
import { StreamStateView_MemberMetadata } from './streamStateView_MemberMetadata';
|
|
17
17
|
import { StreamEvents, StreamEncryptionEvents, StreamStateEvents } from './streamEvents';
|
|
18
18
|
import { DecryptionSessionError } from '@towns-protocol/encryption';
|
|
19
|
+
import { StreamsView } from './streams-view/streamsView';
|
|
20
|
+
import { TimelineEvent } from './sync-agent/timeline/models/timeline-types';
|
|
19
21
|
export declare class StreamStateView {
|
|
20
22
|
readonly streamId: string;
|
|
21
23
|
readonly userId: string;
|
|
24
|
+
readonly streamsView: StreamsView;
|
|
22
25
|
readonly contentKind: SnapshotCaseType;
|
|
23
|
-
readonly
|
|
24
|
-
readonly events: Map<string, StreamTimelineEvent>;
|
|
26
|
+
readonly minipoolEvents: Map<string, StreamTimelineEvent>;
|
|
25
27
|
isInitialized: boolean;
|
|
26
28
|
prevMiniblockHash?: Uint8Array;
|
|
27
29
|
prevMiniblockNum?: bigint;
|
|
@@ -34,6 +36,7 @@ export declare class StreamStateView {
|
|
|
34
36
|
};
|
|
35
37
|
syncCookie?: SyncCookie;
|
|
36
38
|
membershipContent: StreamStateView_Members;
|
|
39
|
+
get timeline(): TimelineEvent[];
|
|
37
40
|
private readonly _spaceContent?;
|
|
38
41
|
get spaceContent(): StreamStateView_Space;
|
|
39
42
|
private readonly _channelContent?;
|
|
@@ -52,7 +55,7 @@ export declare class StreamStateView {
|
|
|
52
55
|
get userInboxContent(): StreamStateView_UserInbox;
|
|
53
56
|
private readonly _mediaContent?;
|
|
54
57
|
get mediaContent(): StreamStateView_Media;
|
|
55
|
-
constructor(userId: string, streamId: string);
|
|
58
|
+
constructor(userId: string, streamId: string, streamsView: StreamsView | undefined);
|
|
56
59
|
private applySnapshot;
|
|
57
60
|
private appendStreamAndCookie;
|
|
58
61
|
private processAppendedEvent;
|
|
@@ -60,10 +63,10 @@ export declare class StreamStateView {
|
|
|
60
63
|
private processPrependedEvent;
|
|
61
64
|
private updateMiniblockInfo;
|
|
62
65
|
updateDecryptedContent(eventId: string, content: DecryptedContent, emitter: TypedEmitter<StreamStateEvents>): void;
|
|
63
|
-
updateDecryptedContentError(eventId: string, content: DecryptionSessionError,
|
|
66
|
+
updateDecryptedContentError(eventId: string, content: DecryptionSessionError, _emitter: TypedEmitter<StreamStateEvents>): void;
|
|
64
67
|
initialize(nextSyncCookie: SyncCookie, minipoolEvents: ParsedEvent[], snapshot: Snapshot, miniblocks: ParsedMiniblock[], prependedMiniblocks: ParsedMiniblock[], prevSnapshotMiniblockNum: bigint, cleartexts: Record<string, Uint8Array | string> | undefined, localEvents: LocalTimelineEvent[], emitter: TypedEmitter<StreamEvents> | undefined): void;
|
|
65
68
|
appendEvents(events: ParsedEvent[], nextSyncCookie: SyncCookie, cleartexts: Record<string, Uint8Array | string> | undefined, emitter: TypedEmitter<StreamEvents>): void;
|
|
66
|
-
prependEvents(miniblocks: ParsedMiniblock[], cleartexts: Record<string, Uint8Array | string> | undefined, terminus: boolean, encryptionEmitter: TypedEmitter<StreamEncryptionEvents> | undefined, stateEmitter: TypedEmitter<StreamStateEvents> | undefined):
|
|
69
|
+
prependEvents(miniblocks: ParsedMiniblock[], cleartexts: Record<string, Uint8Array | string> | undefined, terminus: boolean, encryptionEmitter: TypedEmitter<StreamEncryptionEvents> | undefined, stateEmitter: TypedEmitter<StreamStateEvents> | undefined): RemoteTimelineEvent[];
|
|
67
70
|
appendLocalEvent(channelMessage: ChannelMessage, status: LocalEventStatus, emitter: TypedEmitter<StreamEvents> | undefined): string;
|
|
68
71
|
updateLocalEvent(localId: string, parsedEventHash: string, status: LocalEventStatus, emitter: TypedEmitter<StreamEvents>): void;
|
|
69
72
|
getMembers(): StreamStateView_Members;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamStateView.d.ts","sourceRoot":"","sources":["../src/streamStateView.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,cAAc,EAEd,gBAAgB,EAChB,UAAU,EACV,QAAQ,EAEX,MAAM,uBAAuB,CAAA;AAC9B,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,EAEH,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,eAAe,
|
|
1
|
+
{"version":3,"file":"streamStateView.d.ts","sourceRoot":"","sources":["../src/streamStateView.ts"],"names":[],"mappings":"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"}
|
package/dist/streamStateView.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { dlog, dlogError, bin_toHexString, check } from '@towns-protocol/dlog';
|
|
1
|
+
import { dlog, dlogError, bin_toHexString, check, throwWithCode } from '@towns-protocol/dlog';
|
|
2
2
|
import { isDefined, logNever } from './check';
|
|
3
3
|
import { Err, } from '@towns-protocol/proto';
|
|
4
|
-
import { isConfirmedEvent,
|
|
4
|
+
import { isConfirmedEvent, isLocalEvent, makeRemoteTimelineEvent, } from './types';
|
|
5
5
|
import { StreamStateView_Space } from './streamStateView_Space';
|
|
6
6
|
import { StreamStateView_Channel } from './streamStateView_Channel';
|
|
7
7
|
import { StreamStateView_User } from './streamStateView_User';
|
|
@@ -11,11 +11,11 @@ import { StreamStateView_Members } from './streamStateView_Members';
|
|
|
11
11
|
import { StreamStateView_Media } from './streamStateView_Media';
|
|
12
12
|
import { StreamStateView_GDMChannel } from './streamStateView_GDMChannel';
|
|
13
13
|
import { StreamStateView_DMChannel } from './streamStateView_DMChannel';
|
|
14
|
-
import { genLocalId, isChannelStreamId, isDMChannelStreamId, isGDMChannelStreamId, isMediaStreamId, isSpaceStreamId, isUserDeviceStreamId, isUserSettingsStreamId, isUserStreamId, isUserInboxStreamId, } from './id';
|
|
14
|
+
import { genLocalId, isChannelStreamId, isDMChannelStreamId, isGDMChannelStreamId, isMediaStreamId, isSpaceStreamId, isUserDeviceStreamId, isUserSettingsStreamId, isUserStreamId, isUserInboxStreamId, isMetadataStreamId, } from './id';
|
|
15
15
|
import { StreamStateView_UserInbox } from './streamStateView_UserInbox';
|
|
16
16
|
import { StreamStateView_UnknownContent } from './streamStateView_UnknownContent';
|
|
17
|
-
import isEqual from 'lodash/isEqual';
|
|
18
17
|
import { migrateSnapshot } from './migrations/migrateSnapshot';
|
|
18
|
+
import { StreamsView } from './streams-view/streamsView';
|
|
19
19
|
const log = dlog('csb:streams');
|
|
20
20
|
const logError = dlogError('csb:streams:error');
|
|
21
21
|
// it's very important that the Stream is the emitter for all events
|
|
@@ -23,9 +23,9 @@ const logError = dlogError('csb:streams:error');
|
|
|
23
23
|
export class StreamStateView {
|
|
24
24
|
streamId;
|
|
25
25
|
userId;
|
|
26
|
+
streamsView;
|
|
26
27
|
contentKind;
|
|
27
|
-
|
|
28
|
-
events = new Map();
|
|
28
|
+
minipoolEvents = new Map();
|
|
29
29
|
isInitialized = false;
|
|
30
30
|
prevMiniblockHash;
|
|
31
31
|
prevMiniblockNum;
|
|
@@ -35,6 +35,9 @@ export class StreamStateView {
|
|
|
35
35
|
syncCookie;
|
|
36
36
|
// membership content
|
|
37
37
|
membershipContent;
|
|
38
|
+
get timeline() {
|
|
39
|
+
return this.streamsView.timelinesView.getState().timelines[this.streamId];
|
|
40
|
+
}
|
|
38
41
|
// Space Content
|
|
39
42
|
_spaceContent;
|
|
40
43
|
get spaceContent() {
|
|
@@ -86,10 +89,11 @@ export class StreamStateView {
|
|
|
86
89
|
check(isDefined(this._mediaContent), `mediaContent not defined for ${this.contentKind}`);
|
|
87
90
|
return this._mediaContent;
|
|
88
91
|
}
|
|
89
|
-
constructor(userId, streamId) {
|
|
92
|
+
constructor(userId, streamId, streamsView) {
|
|
90
93
|
log('streamStateView::constructor', streamId);
|
|
91
94
|
this.userId = userId;
|
|
92
95
|
this.streamId = streamId;
|
|
96
|
+
this.streamsView = streamsView || new StreamsView('', undefined); // always have a streams view to ensure we can use the timeline
|
|
93
97
|
if (isSpaceStreamId(streamId)) {
|
|
94
98
|
this.contentKind = 'spaceContent';
|
|
95
99
|
this._spaceContent = new StreamStateView_Space(streamId);
|
|
@@ -126,6 +130,9 @@ export class StreamStateView {
|
|
|
126
130
|
this.contentKind = 'userInboxContent';
|
|
127
131
|
this._userInboxContent = new StreamStateView_UserInbox(streamId);
|
|
128
132
|
}
|
|
133
|
+
else if (isMetadataStreamId(streamId)) {
|
|
134
|
+
throwWithCode('Metadata streams are not supported in SDK', Err.UNIMPLEMENTED);
|
|
135
|
+
}
|
|
129
136
|
else {
|
|
130
137
|
throw new Error(`Stream doesn't have a content kind ${streamId}`);
|
|
131
138
|
}
|
|
@@ -162,6 +169,9 @@ export class StreamStateView {
|
|
|
162
169
|
case 'userInboxContent':
|
|
163
170
|
this.userInboxContent.applySnapshot(snapshot, snapshot.content.value, encryptionEmitter);
|
|
164
171
|
break;
|
|
172
|
+
case 'metadataContent':
|
|
173
|
+
throwWithCode('View for Metadata streams is not implemented in SDK', Err.UNIMPLEMENTED);
|
|
174
|
+
break;
|
|
165
175
|
case undefined:
|
|
166
176
|
check(false, `Snapshot has no content ${this.streamId}`, Err.STREAM_BAD_EVENT);
|
|
167
177
|
break;
|
|
@@ -175,7 +185,7 @@ export class StreamStateView {
|
|
|
175
185
|
const updated = [];
|
|
176
186
|
const confirmed = [];
|
|
177
187
|
for (const parsedEvent of minipoolEvents) {
|
|
178
|
-
const existingEvent = this.
|
|
188
|
+
const existingEvent = this.minipoolEvents.get(parsedEvent.hashStr);
|
|
179
189
|
if (existingEvent) {
|
|
180
190
|
existingEvent.remoteEvent = parsedEvent;
|
|
181
191
|
updated.push(existingEvent);
|
|
@@ -187,9 +197,6 @@ export class StreamStateView {
|
|
|
187
197
|
miniblockNum: undefined,
|
|
188
198
|
confirmedEventNum: undefined,
|
|
189
199
|
});
|
|
190
|
-
if (event.remoteEvent.event.payload.case !== 'miniblockHeader') {
|
|
191
|
-
this.timeline.push(event);
|
|
192
|
-
}
|
|
193
200
|
const newlyConfirmed = this.processAppendedEvent(event, cleartexts?.[event.hashStr], encryptionEmitter, stateEmitter);
|
|
194
201
|
appended.push(event);
|
|
195
202
|
if (newlyConfirmed) {
|
|
@@ -201,9 +208,9 @@ export class StreamStateView {
|
|
|
201
208
|
return { appended, updated, confirmed };
|
|
202
209
|
}
|
|
203
210
|
processAppendedEvent(timelineEvent, cleartext, encryptionEmitter, stateEmitter) {
|
|
204
|
-
check(!this.
|
|
211
|
+
check(!this.minipoolEvents.has(timelineEvent.hashStr));
|
|
205
212
|
if (timelineEvent.remoteEvent.event.payload.case !== 'miniblockHeader') {
|
|
206
|
-
this.
|
|
213
|
+
this.minipoolEvents.set(timelineEvent.hashStr, timelineEvent);
|
|
207
214
|
}
|
|
208
215
|
const event = timelineEvent.remoteEvent;
|
|
209
216
|
const payload = event.event.payload;
|
|
@@ -239,11 +246,12 @@ export class StreamStateView {
|
|
|
239
246
|
const confirmed = [];
|
|
240
247
|
for (let i = 0; i < eventHashes.length; i++) {
|
|
241
248
|
const eventId = bin_toHexString(eventHashes[i]);
|
|
242
|
-
const event = this.
|
|
249
|
+
const event = this.minipoolEvents.get(eventId);
|
|
243
250
|
if (!event) {
|
|
244
251
|
logError(`Mininblock event not found ${eventId}`); // aellis this is pretty serious
|
|
245
252
|
continue;
|
|
246
253
|
}
|
|
254
|
+
this.minipoolEvents.delete(eventId);
|
|
247
255
|
event.miniblockNum = header.miniblockNum;
|
|
248
256
|
event.confirmedEventNum = header.eventNumOffset + BigInt(i);
|
|
249
257
|
check(isConfirmedEvent(event), `Event is not confirmed ${eventId}`);
|
|
@@ -261,10 +269,6 @@ export class StreamStateView {
|
|
|
261
269
|
return confirmed;
|
|
262
270
|
}
|
|
263
271
|
processPrependedEvent(timelineEvent, cleartext, encryptionEmitter, stateEmitter) {
|
|
264
|
-
check(!this.events.has(timelineEvent.hashStr));
|
|
265
|
-
if (timelineEvent.remoteEvent.event.payload.case !== 'miniblockHeader') {
|
|
266
|
-
this.events.set(timelineEvent.hashStr, timelineEvent);
|
|
267
|
-
}
|
|
268
272
|
const event = timelineEvent.remoteEvent;
|
|
269
273
|
const payload = event.event.payload;
|
|
270
274
|
check(isDefined(payload), `Event has no payload ${event.hashStr}`, Err.STREAM_BAD_EVENT);
|
|
@@ -311,32 +315,18 @@ export class StreamStateView {
|
|
|
311
315
|
updateDecryptedContent(eventId, content, emitter) {
|
|
312
316
|
this.membershipContent.onDecryptedContent(eventId, content, emitter);
|
|
313
317
|
this.getContent().onDecryptedContent(eventId, content, emitter);
|
|
314
|
-
const timelineEvent = this.
|
|
318
|
+
const timelineEvent = this.streamsView.timelinesView.streamEventDecrypted(this.streamId, eventId, content);
|
|
319
|
+
// dispatching eventDecrypted makes it easier to test, fyi pins and usernames from snapshots don't have cooresponding timeline events
|
|
315
320
|
if (timelineEvent) {
|
|
316
|
-
if (timelineEvent.decryptedContent !== undefined) {
|
|
317
|
-
logError(`timeline event was decrypted twice? ${eventId}`);
|
|
318
|
-
}
|
|
319
|
-
timelineEvent.decryptedContent = content;
|
|
320
|
-
check(isDecryptedEvent(timelineEvent), `Event is not decrypted, programmer error ${eventId}`);
|
|
321
|
-
emitter.emit('streamUpdated', this.streamId, this.contentKind, {
|
|
322
|
-
updated: [timelineEvent],
|
|
323
|
-
});
|
|
324
|
-
// dispatching eventDecrypted makes it easier to test
|
|
325
321
|
emitter.emit('eventDecrypted', this.streamId, this.contentKind, timelineEvent);
|
|
326
322
|
}
|
|
327
323
|
}
|
|
328
324
|
// update stream with decryption status
|
|
329
|
-
updateDecryptedContentError(eventId, content,
|
|
330
|
-
|
|
331
|
-
if (timelineEvent && !isEqual(timelineEvent.decryptedContentError, content)) {
|
|
332
|
-
check(timelineEvent.decryptedContent === undefined, 'Event is already decrypted');
|
|
333
|
-
timelineEvent.decryptedContentError = content;
|
|
334
|
-
emitter.emit('streamUpdated', this.streamId, this.contentKind, {
|
|
335
|
-
updated: [timelineEvent],
|
|
336
|
-
});
|
|
337
|
-
}
|
|
325
|
+
updateDecryptedContentError(eventId, content, _emitter) {
|
|
326
|
+
this.streamsView.timelinesView.streamEventDecryptedContentError(this.streamId, eventId, content);
|
|
338
327
|
}
|
|
339
328
|
initialize(nextSyncCookie, minipoolEvents, snapshot, miniblocks, prependedMiniblocks, prevSnapshotMiniblockNum, cleartexts, localEvents, emitter) {
|
|
329
|
+
const timelineEvents = [];
|
|
340
330
|
check(miniblocks.length > 0, `Stream has no miniblocks ${this.streamId}`, Err.STREAM_EMPTY);
|
|
341
331
|
// parse the blocks
|
|
342
332
|
const miniblockHeaderEvent = miniblocks[0].events.at(-1);
|
|
@@ -366,13 +356,13 @@ export class StreamStateView {
|
|
|
366
356
|
// initialize our event hashes
|
|
367
357
|
check(block0Events.length > 0);
|
|
368
358
|
// prepend the snapshotted block in reverse order
|
|
369
|
-
|
|
359
|
+
timelineEvents.push(...block0Events);
|
|
370
360
|
for (let i = block0Events.length - 1; i >= 0; i--) {
|
|
371
361
|
const event = block0Events[i];
|
|
372
362
|
this.processPrependedEvent(event, cleartexts?.[event.hashStr], emitter, undefined);
|
|
373
363
|
}
|
|
374
364
|
// append the new block events
|
|
375
|
-
|
|
365
|
+
timelineEvents.push(...rest);
|
|
376
366
|
for (const event of rest) {
|
|
377
367
|
this.processAppendedEvent(event, cleartexts?.[event.hashStr], emitter, undefined);
|
|
378
368
|
}
|
|
@@ -383,28 +373,34 @@ export class StreamStateView {
|
|
|
383
373
|
this.prevMiniblockHash = lastBlock.hash;
|
|
384
374
|
this.prevMiniblockNum = lastBlock.header.miniblockNum;
|
|
385
375
|
// append the minipool events
|
|
386
|
-
this.appendStreamAndCookie(nextSyncCookie, minipoolEvents, cleartexts, emitter, undefined);
|
|
376
|
+
const { appended } = this.appendStreamAndCookie(nextSyncCookie, minipoolEvents, cleartexts, emitter, undefined);
|
|
387
377
|
this.prevSnapshotMiniblockNum = prevSnapshotMiniblockNum;
|
|
378
|
+
let prepended = [];
|
|
388
379
|
if (prependedMiniblocks.length > 0) {
|
|
389
|
-
this.prependEvents(prependedMiniblocks, cleartexts, prependedMiniblocks[0].header.miniblockNum === 0n, emitter, undefined);
|
|
380
|
+
prepended = this.prependEvents(prependedMiniblocks, cleartexts, prependedMiniblocks[0].header.miniblockNum === 0n, emitter, undefined);
|
|
390
381
|
}
|
|
391
382
|
for (const localEvent of localEvents) {
|
|
392
383
|
localEvent.eventNum = this.lastEventNum++;
|
|
393
|
-
|
|
394
|
-
this.timeline.push(localEvent);
|
|
384
|
+
timelineEvents.push(localEvent);
|
|
395
385
|
this.getContent().onAppendLocalEvent(localEvent, emitter);
|
|
396
386
|
}
|
|
397
387
|
// let everyone know
|
|
398
388
|
this.isInitialized = true;
|
|
389
|
+
this.streamsView.timelinesView.streamInitialized(this.streamId, [
|
|
390
|
+
...prepended,
|
|
391
|
+
...timelineEvents,
|
|
392
|
+
...appended,
|
|
393
|
+
]);
|
|
399
394
|
emitter?.emit('streamInitialized', this.streamId, this.contentKind);
|
|
400
395
|
}
|
|
401
396
|
appendEvents(events, nextSyncCookie, cleartexts, emitter) {
|
|
402
397
|
const { appended, updated, confirmed } = this.appendStreamAndCookie(nextSyncCookie, events, cleartexts, emitter, emitter);
|
|
403
|
-
|
|
398
|
+
const updatedData = {
|
|
404
399
|
appended: appended.length > 0 ? appended : undefined,
|
|
405
400
|
updated: updated.length > 0 ? updated : undefined,
|
|
406
401
|
confirmed: confirmed.length > 0 ? confirmed : undefined,
|
|
407
|
-
}
|
|
402
|
+
};
|
|
403
|
+
this.streamsView.timelinesView.streamUpdated(this.streamId, updatedData);
|
|
408
404
|
}
|
|
409
405
|
prependEvents(miniblocks, cleartexts, terminus, encryptionEmitter, stateEmitter) {
|
|
410
406
|
const prependedFull = miniblocks.flatMap((mb) => mb.events.map((parsedEvent, i) => makeRemoteTimelineEvent({
|
|
@@ -413,17 +409,9 @@ export class StreamStateView {
|
|
|
413
409
|
miniblockNum: mb.header.miniblockNum,
|
|
414
410
|
confirmedEventNum: mb.header.eventNumOffset + BigInt(i),
|
|
415
411
|
})));
|
|
416
|
-
|
|
417
|
-
//
|
|
418
|
-
|
|
419
|
-
if (prepended.length !== prependedFull.length) {
|
|
420
|
-
logError('StreamStateView::prependEvents: duplicate events found', {
|
|
421
|
-
dupes: prependedFull
|
|
422
|
-
.filter((e) => this.events.has(e.hashStr))
|
|
423
|
-
.map((e) => e.hashStr),
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
this.timeline.unshift(...prepended.filter((e) => e.remoteEvent.event.payload.case !== 'miniblockHeader'));
|
|
412
|
+
const prepended = prependedFull;
|
|
413
|
+
// aellis 5/2025 we used to filter out dupes here, but stopped doing it because
|
|
414
|
+
// we don't want to track all events... 🤞
|
|
427
415
|
// prepend the new block events in reverse order
|
|
428
416
|
for (let i = prepended.length - 1; i >= 0; i--) {
|
|
429
417
|
const event = prepended[i];
|
|
@@ -432,7 +420,10 @@ export class StreamStateView {
|
|
|
432
420
|
if (this.miniblockInfo && terminus) {
|
|
433
421
|
this.miniblockInfo.terminusReached = true;
|
|
434
422
|
}
|
|
435
|
-
|
|
423
|
+
if (this.isInitialized) {
|
|
424
|
+
this.streamsView.timelinesView.streamUpdated(this.streamId, { prepended });
|
|
425
|
+
}
|
|
426
|
+
return prepended;
|
|
436
427
|
}
|
|
437
428
|
appendLocalEvent(channelMessage, status, emitter) {
|
|
438
429
|
const localId = genLocalId();
|
|
@@ -444,23 +435,25 @@ export class StreamStateView {
|
|
|
444
435
|
localEvent: { localId, channelMessage, status },
|
|
445
436
|
createdAtEpochMs: BigInt(Date.now()),
|
|
446
437
|
};
|
|
447
|
-
this.
|
|
448
|
-
this.timeline.push(timelineEvent);
|
|
438
|
+
this.minipoolEvents.set(localId, timelineEvent);
|
|
449
439
|
this.getContent().onAppendLocalEvent(timelineEvent, emitter);
|
|
450
|
-
|
|
440
|
+
this.streamsView.timelinesView.streamUpdated(this.streamId, {
|
|
451
441
|
appended: [timelineEvent],
|
|
452
442
|
});
|
|
453
443
|
return localId;
|
|
454
444
|
}
|
|
455
445
|
updateLocalEvent(localId, parsedEventHash, status, emitter) {
|
|
456
446
|
log('updateLocalEvent', { localId, parsedEventHash, status });
|
|
457
|
-
|
|
447
|
+
// we update local events multiple times, so we need to check both the localId and the parsedEventHash
|
|
448
|
+
const timelineEvent = this.minipoolEvents.get(localId) || this.minipoolEvents.get(parsedEventHash);
|
|
458
449
|
check(isDefined(timelineEvent), `Local event not found ${localId}`);
|
|
459
450
|
check(isLocalEvent(timelineEvent), `Event is not local ${localId}`);
|
|
460
451
|
const previousId = timelineEvent.hashStr;
|
|
461
452
|
timelineEvent.hashStr = parsedEventHash;
|
|
462
453
|
timelineEvent.localEvent.status = status;
|
|
463
|
-
this.
|
|
454
|
+
this.minipoolEvents.delete(localId);
|
|
455
|
+
this.minipoolEvents.set(parsedEventHash, timelineEvent);
|
|
456
|
+
this.streamsView.timelinesView.streamLocalEventUpdated(this.streamId, previousId, timelineEvent);
|
|
464
457
|
emitter?.emit('streamLocalEventUpdated', this.streamId, this.contentKind, previousId, timelineEvent);
|
|
465
458
|
}
|
|
466
459
|
getMembers() {
|
|
@@ -489,6 +482,9 @@ export class StreamStateView {
|
|
|
489
482
|
return this.userInboxContent;
|
|
490
483
|
case 'mediaContent':
|
|
491
484
|
return this.mediaContent;
|
|
485
|
+
case 'metadataContent':
|
|
486
|
+
throwWithCode('Metadata streams are not supported in SDK', Err.UNIMPLEMENTED);
|
|
487
|
+
break;
|
|
492
488
|
case undefined:
|
|
493
489
|
throw new Error('Stream has no content');
|
|
494
490
|
default:
|