@towns-labs/sdk 2.0.11 → 2.0.13
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 +13 -31
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +113 -328
- package/dist/client.js.map +1 -1
- package/dist/clientDecryptionExtensions.d.ts.map +1 -1
- package/dist/clientDecryptionExtensions.js +10 -28
- package/dist/clientDecryptionExtensions.js.map +1 -1
- package/dist/createApp.d.ts +1 -1
- package/dist/createApp.d.ts.map +1 -1
- package/dist/createApp.js +6 -2
- package/dist/createApp.js.map +1 -1
- package/dist/id.d.ts +1 -17
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +1 -53
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +0 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -22
- package/dist/index.js.map +1 -1
- package/dist/migrations/snapshotMigration0001.d.ts.map +1 -1
- package/dist/migrations/snapshotMigration0001.js +0 -4
- package/dist/migrations/snapshotMigration0001.js.map +1 -1
- package/dist/migrations/snapshotMigration0002.d.ts.map +1 -1
- package/dist/migrations/snapshotMigration0002.js +1 -19
- package/dist/migrations/snapshotMigration0002.js.map +1 -1
- package/dist/migrations/snapshotMigration0004.d.ts.map +1 -1
- package/dist/migrations/snapshotMigration0004.js +1 -27
- package/dist/migrations/snapshotMigration0004.js.map +1 -1
- package/dist/migrations/snapshotMigration0005.d.ts.map +1 -1
- package/dist/migrations/snapshotMigration0005.js +1 -26
- package/dist/migrations/snapshotMigration0005.js.map +1 -1
- package/dist/notificationsClient.d.ts +1 -5
- package/dist/notificationsClient.d.ts.map +1 -1
- package/dist/notificationsClient.js +2 -103
- package/dist/notificationsClient.js.map +1 -1
- package/dist/persistenceStore.d.ts.map +1 -1
- package/dist/persistenceStore.js +6 -18
- package/dist/persistenceStore.js.map +1 -1
- package/dist/streamEvents.d.ts +0 -6
- package/dist/streamEvents.d.ts.map +1 -1
- package/dist/streamStateView.d.ts +0 -9
- package/dist/streamStateView.d.ts.map +1 -1
- package/dist/streamStateView.js +3 -64
- package/dist/streamStateView.js.map +1 -1
- package/dist/streamStateView_MemberMetadata.d.ts +3 -36
- package/dist/streamStateView_MemberMetadata.d.ts.map +1 -1
- package/dist/streamStateView_MemberMetadata.js +3 -83
- package/dist/streamStateView_MemberMetadata.js.map +1 -1
- package/dist/streamStateView_Members.d.ts +1 -5
- package/dist/streamStateView_Members.d.ts.map +1 -1
- package/dist/streamStateView_Members.js +4 -91
- package/dist/streamStateView_Members.js.map +1 -1
- package/dist/streamStateView_User.d.ts.map +1 -1
- package/dist/streamStateView_User.js +1 -0
- package/dist/streamStateView_User.js.map +1 -1
- package/dist/streamStateView_UserInbox.d.ts.map +1 -1
- package/dist/streamStateView_UserInbox.js +1 -0
- package/dist/streamStateView_UserInbox.js.map +1 -1
- package/dist/streamStateView_UserMetadata.d.ts.map +1 -1
- package/dist/streamStateView_UserMetadata.js +1 -0
- package/dist/streamStateView_UserMetadata.js.map +1 -1
- package/dist/streamStateView_UserSettings.d.ts.map +1 -1
- package/dist/streamStateView_UserSettings.js +9 -1
- package/dist/streamStateView_UserSettings.js.map +1 -1
- package/dist/streamUtils.d.ts.map +1 -1
- package/dist/streamUtils.js +0 -8
- package/dist/streamUtils.js.map +1 -1
- package/dist/sync/SyncedStreamsControllerLite.d.ts.map +1 -1
- package/dist/sync/SyncedStreamsControllerLite.js +7 -11
- package/dist/sync/SyncedStreamsControllerLite.js.map +1 -1
- package/dist/sync-agent/db.d.ts +1 -6
- package/dist/sync-agent/db.d.ts.map +1 -1
- package/dist/sync-agent/db.js +0 -10
- package/dist/sync-agent/db.js.map +1 -1
- package/dist/sync-agent/gdms/gdms.d.ts +5 -6
- package/dist/sync-agent/gdms/gdms.d.ts.map +1 -1
- package/dist/sync-agent/gdms/gdms.js +12 -27
- package/dist/sync-agent/gdms/gdms.js.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.d.ts +10 -8
- package/dist/sync-agent/gdms/models/gdm.d.ts.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.js +29 -34
- package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
- package/dist/sync-agent/members/members.d.ts +6 -18
- package/dist/sync-agent/members/members.d.ts.map +1 -1
- package/dist/sync-agent/members/members.js +25 -124
- package/dist/sync-agent/members/members.js.map +1 -1
- package/dist/sync-agent/members/models/member.d.ts +3 -45
- package/dist/sync-agent/members/models/member.d.ts.map +1 -1
- package/dist/sync-agent/members/models/member.js +15 -114
- package/dist/sync-agent/members/models/member.js.map +1 -1
- package/dist/sync-agent/members/models/myself.d.ts +1 -11
- package/dist/sync-agent/members/models/myself.d.ts.map +1 -1
- package/dist/sync-agent/members/models/myself.js +1 -84
- package/dist/sync-agent/members/models/myself.js.map +1 -1
- package/dist/sync-agent/river-connection/riverConnection.d.ts +6 -17
- package/dist/sync-agent/river-connection/riverConnection.d.ts.map +1 -1
- package/dist/sync-agent/river-connection/riverConnection.js +30 -37
- package/dist/sync-agent/river-connection/riverConnection.js.map +1 -1
- package/dist/sync-agent/syncAgent.d.ts +11 -22
- package/dist/sync-agent/syncAgent.d.ts.map +1 -1
- package/dist/sync-agent/syncAgent.js +3 -20
- package/dist/sync-agent/syncAgent.js.map +1 -1
- package/dist/sync-agent/user/models/userInbox.d.ts +4 -17
- package/dist/sync-agent/user/models/userInbox.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userInbox.js +14 -61
- package/dist/sync-agent/user/models/userInbox.js.map +1 -1
- package/dist/sync-agent/user/models/userMemberships.d.ts +6 -22
- package/dist/sync-agent/user/models/userMemberships.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userMemberships.js +16 -68
- package/dist/sync-agent/user/models/userMemberships.js.map +1 -1
- package/dist/sync-agent/user/models/userMetadata.d.ts +4 -17
- package/dist/sync-agent/user/models/userMetadata.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userMetadata.js +14 -61
- package/dist/sync-agent/user/models/userMetadata.js.map +1 -1
- package/dist/sync-agent/user/models/userSettings.d.ts +5 -8
- package/dist/sync-agent/user/models/userSettings.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userSettings.js +15 -42
- package/dist/sync-agent/user/models/userSettings.js.map +1 -1
- package/dist/sync-agent/user/user.d.ts +2 -6
- package/dist/sync-agent/user/user.d.ts.map +1 -1
- package/dist/sync-agent/user/user.js +9 -20
- package/dist/sync-agent/user/user.js.map +1 -1
- package/dist/syncedStreamsExtension.d.ts.map +1 -1
- package/dist/syncedStreamsExtension.js +10 -22
- package/dist/syncedStreamsExtension.js.map +1 -1
- package/dist/syncedStreamsLoop.d.ts.map +1 -1
- package/dist/syncedStreamsLoop.js +4 -18
- package/dist/syncedStreamsLoop.js.map +1 -1
- package/dist/tests/bob_testUtils.d.ts.map +1 -1
- package/dist/tests/bob_testUtils.js +35 -69
- package/dist/tests/bob_testUtils.js.map +1 -1
- package/dist/tests/multi_ne/aliceAndFriends10for10.test.js +1 -1
- package/dist/tests/multi_ne/aliceAndFriends10for10.test.js.map +1 -1
- package/dist/tests/multi_ne/aliceAndFriendslongAndRandom.test.js +1 -1
- package/dist/tests/multi_ne/aliceAndFriendslongAndRandom.test.js.map +1 -1
- package/dist/tests/multi_ne/bobFlushes.test.js.map +1 -1
- package/dist/tests/multi_ne/channels.test.js +6 -9
- package/dist/tests/multi_ne/channels.test.js.map +1 -1
- package/dist/tests/multi_ne/client.test.js +24 -98
- package/dist/tests/multi_ne/client.test.js.map +1 -1
- package/dist/tests/multi_ne/clientCrypto.test.js +3 -3
- package/dist/tests/multi_ne/clientCrypto.test.js.map +1 -1
- package/dist/tests/multi_ne/clientDecryptionExtensions.test.js +12 -47
- package/dist/tests/multi_ne/clientDecryptionExtensions.test.js.map +1 -1
- package/dist/tests/multi_ne/ephemeralEvents.test.js +1 -1
- package/dist/tests/multi_ne/ephemeralEvents.test.js.map +1 -1
- package/dist/tests/multi_ne/id.test.js +6 -20
- package/dist/tests/multi_ne/id.test.js.map +1 -1
- package/dist/tests/multi_ne/media.test.js +20 -61
- package/dist/tests/multi_ne/media.test.js.map +1 -1
- package/dist/tests/multi_ne/memberMetadata.test.d.ts +0 -3
- package/dist/tests/multi_ne/memberMetadata.test.d.ts.map +1 -1
- package/dist/tests/multi_ne/memberMetadata.test.js +14 -582
- package/dist/tests/multi_ne/memberMetadata.test.js.map +1 -1
- package/dist/tests/multi_ne/outboundGroupSession.test.js +15 -13
- package/dist/tests/multi_ne/outboundGroupSession.test.js.map +1 -1
- package/dist/tests/multi_ne/restart.test.js +11 -34
- package/dist/tests/multi_ne/restart.test.js.map +1 -1
- package/dist/tests/multi_ne/sign.test.js +2 -2
- package/dist/tests/multi_ne/sign.test.js.map +1 -1
- package/dist/tests/multi_ne/streamMembershipHardening.test.js +0 -3
- package/dist/tests/multi_ne/streamMembershipHardening.test.js.map +1 -1
- package/dist/tests/multi_ne/streamRpcClient.test.js +58 -349
- package/dist/tests/multi_ne/streamRpcClient.test.js.map +1 -1
- package/dist/tests/multi_ne/streamRpcClientSync.test.js +63 -124
- package/dist/tests/multi_ne/streamRpcClientSync.test.js.map +1 -1
- package/dist/tests/multi_ne/streamStateView_User.test.js +23 -20
- package/dist/tests/multi_ne/streamStateView_User.test.js.map +1 -1
- package/dist/tests/{multi/spaceDapp.test.d.ts → multi_ne/sync-agent/gdms.test.d.ts} +1 -1
- package/dist/tests/multi_ne/sync-agent/gdms.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/gdms.test.js +34 -0
- package/dist/tests/multi_ne/sync-agent/gdms.test.js.map +1 -0
- package/dist/tests/{multi/legacySpace.test.d.ts → multi_ne/sync-agent/member.test.d.ts} +1 -1
- package/dist/tests/multi_ne/sync-agent/member.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/member.test.js +31 -0
- package/dist/tests/multi_ne/sync-agent/member.test.js.map +1 -0
- package/dist/tests/{multi/disableSpace.test.d.ts → multi_ne/sync-agent/members.test.d.ts} +1 -1
- package/dist/tests/multi_ne/sync-agent/members.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/members.test.js +40 -0
- package/dist/tests/multi_ne/sync-agent/members.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.js +39 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.js +27 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.js +66 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.js +117 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.js +155 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/user.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/user.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/user.test.js +53 -0
- package/dist/tests/multi_ne/sync-agent/user.test.js.map +1 -0
- package/dist/tests/multi_ne/syncWithBlocks.test.d.ts +3 -0
- package/dist/tests/multi_ne/syncWithBlocks.test.d.ts.map +1 -1
- package/dist/tests/multi_ne/syncWithBlocks.test.js +47 -77
- package/dist/tests/multi_ne/syncWithBlocks.test.js.map +1 -1
- package/dist/tests/multi_ne/syncedStream.test.js +1 -1
- package/dist/tests/multi_ne/syncedStream.test.js.map +1 -1
- package/dist/tests/multi_ne/syncedStreams.test.js +1 -1
- package/dist/tests/multi_ne/syncedStreams.test.js.map +1 -1
- package/dist/tests/multi_ne/userInboxMessage.test.js +4 -4
- package/dist/tests/multi_ne/userInboxMessage.test.js.map +1 -1
- package/dist/tests/multi_ne/userSettings.test.js +3 -16
- package/dist/tests/multi_ne/userSettings.test.js.map +1 -1
- package/dist/tests/multi_ne/workflows.test.js +22 -50
- package/dist/tests/multi_ne/workflows.test.js.map +1 -1
- package/dist/tests/testDriver_testUtils.d.ts.map +1 -1
- package/dist/tests/testDriver_testUtils.js +6 -22
- package/dist/tests/testDriver_testUtils.js.map +1 -1
- package/dist/tests/testUtils.d.ts +3 -104
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +6 -625
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/unit/snapshotMigration0001.test.js +4 -20
- package/dist/tests/unit/snapshotMigration0001.test.js.map +1 -1
- package/dist/tests/unit/snapshotMigration0004.test.js +5 -43
- package/dist/tests/unit/snapshotMigration0004.test.js.map +1 -1
- package/dist/tests/unit/snapshotMigration0005.test.js +5 -43
- package/dist/tests/unit/snapshotMigration0005.test.js.map +1 -1
- package/dist/tests/unit/streamUtils.test.js +21 -22
- package/dist/tests/unit/streamUtils.test.js.map +1 -1
- package/dist/tests/unit/tags.test.js +5 -7
- package/dist/tests/unit/tags.test.js.map +1 -1
- package/dist/types.d.ts +1 -21
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -231
- package/dist/types.js.map +1 -1
- package/dist/views/models/timelineEvent.d.ts.map +1 -1
- package/dist/views/models/timelineEvent.js +132 -157
- package/dist/views/models/timelineEvent.js.map +1 -1
- package/dist/views/models/timelineTypes.d.ts +51 -30
- package/dist/views/models/timelineTypes.d.ts.map +1 -1
- package/dist/views/models/timelineTypes.js +3 -4
- package/dist/views/models/timelineTypes.js.map +1 -1
- package/dist/views/streams/timelines.d.ts +1 -1
- package/dist/views/streams/timelines.d.ts.map +1 -1
- package/dist/views/streams/timelines.js +3 -3
- package/dist/views/streams/timelines.js.map +1 -1
- package/dist/views/streams/userInboxStreams.d.ts +3 -0
- package/dist/views/streams/userInboxStreams.d.ts.map +1 -1
- package/dist/views/streams/userInboxStreams.js +15 -4
- package/dist/views/streams/userInboxStreams.js.map +1 -1
- package/dist/views/streams/userMetadataStreams.d.ts +3 -0
- package/dist/views/streams/userMetadataStreams.d.ts.map +1 -1
- package/dist/views/streams/userMetadataStreams.js +15 -4
- package/dist/views/streams/userMetadataStreams.js.map +1 -1
- package/dist/views/streams/userSettingsStreams.d.ts +3 -0
- package/dist/views/streams/userSettingsStreams.d.ts.map +1 -1
- package/dist/views/streams/userSettingsStreams.js +17 -6
- package/dist/views/streams/userSettingsStreams.js.map +1 -1
- package/dist/views/streams/userStreamsView.d.ts +3 -0
- package/dist/views/streams/userStreamsView.d.ts.map +1 -1
- package/dist/views/streams/userStreamsView.js +21 -10
- package/dist/views/streams/userStreamsView.js.map +1 -1
- package/dist/views/streamsView.d.ts +0 -6
- package/dist/views/streamsView.d.ts.map +1 -1
- package/dist/views/streamsView.js +0 -11
- package/dist/views/streamsView.js.map +1 -1
- package/dist/views/transforms/dmsAndGdmsTransform.d.ts +0 -2
- package/dist/views/transforms/dmsAndGdmsTransform.d.ts.map +1 -1
- package/dist/views/transforms/dmsAndGdmsTransform.js +1 -26
- package/dist/views/transforms/dmsAndGdmsTransform.js.map +1 -1
- package/dist/views/transforms/dmsAndGdmsUnreadIdsTransform.d.ts +1 -2
- package/dist/views/transforms/dmsAndGdmsUnreadIdsTransform.d.ts.map +1 -1
- package/dist/views/transforms/dmsAndGdmsUnreadIdsTransform.js +2 -5
- package/dist/views/transforms/dmsAndGdmsUnreadIdsTransform.js.map +1 -1
- package/dist/views/transforms/spaceIdsTransform.d.ts +1 -1
- package/dist/views/transforms/spaceIdsTransform.d.ts.map +1 -1
- package/dist/views/transforms/spaceIdsTransform.js +3 -10
- package/dist/views/transforms/spaceIdsTransform.js.map +1 -1
- package/dist/views/transforms/spaceMentionsTransform.d.ts.map +1 -1
- package/dist/views/transforms/spaceMentionsTransform.js +13 -14
- package/dist/views/transforms/spaceMentionsTransform.js.map +1 -1
- package/dist/views/transforms/spaceUnreadsTransform.d.ts.map +1 -1
- package/dist/views/transforms/spaceUnreadsTransform.js +21 -22
- package/dist/views/transforms/spaceUnreadsTransform.js.map +1 -1
- package/dist/views/transforms/unreadMarkersTransform.js +2 -4
- package/dist/views/transforms/unreadMarkersTransform.js.map +1 -1
- package/package.json +10 -9
- package/dist/memberMetadata_DisplayNames.d.ts +0 -26
- package/dist/memberMetadata_DisplayNames.d.ts.map +0 -1
- package/dist/memberMetadata_DisplayNames.js +0 -95
- package/dist/memberMetadata_DisplayNames.js.map +0 -1
- package/dist/memberMetadata_EnsAddresses.d.ts +0 -25
- package/dist/memberMetadata_EnsAddresses.d.ts.map +0 -1
- package/dist/memberMetadata_EnsAddresses.js +0 -86
- package/dist/memberMetadata_EnsAddresses.js.map +0 -1
- package/dist/memberMetadata_Nft.d.ts +0 -31
- package/dist/memberMetadata_Nft.d.ts.map +0 -1
- package/dist/memberMetadata_Nft.js +0 -95
- package/dist/memberMetadata_Nft.js.map +0 -1
- package/dist/memberMetadata_Usernames.d.ts +0 -35
- package/dist/memberMetadata_Usernames.d.ts.map +0 -1
- package/dist/memberMetadata_Usernames.js +0 -162
- package/dist/memberMetadata_Usernames.js.map +0 -1
- package/dist/streamStateView_Channel.d.ts +0 -16
- package/dist/streamStateView_Channel.d.ts.map +0 -1
- package/dist/streamStateView_Channel.js +0 -76
- package/dist/streamStateView_Channel.js.map +0 -1
- package/dist/streamStateView_DMChannel.d.ts +0 -25
- package/dist/streamStateView_DMChannel.d.ts.map +0 -1
- package/dist/streamStateView_DMChannel.js +0 -114
- package/dist/streamStateView_DMChannel.js.map +0 -1
- package/dist/streamStateView_Space.d.ts +0 -31
- package/dist/streamStateView_Space.d.ts.map +0 -1
- package/dist/streamStateView_Space.js +0 -193
- package/dist/streamStateView_Space.js.map +0 -1
- package/dist/sync-agent/dms/dms.d.ts +0 -24
- package/dist/sync-agent/dms/dms.d.ts.map +0 -1
- package/dist/sync-agent/dms/dms.js +0 -60
- package/dist/sync-agent/dms/dms.js.map +0 -1
- package/dist/sync-agent/dms/models/dm.d.ts +0 -74
- package/dist/sync-agent/dms/models/dm.d.ts.map +0 -1
- package/dist/sync-agent/dms/models/dm.js +0 -149
- package/dist/sync-agent/dms/models/dm.js.map +0 -1
- package/dist/sync-agent/river-connection/models/transactionalClient.d.ts +0 -11
- package/dist/sync-agent/river-connection/models/transactionalClient.d.ts.map +0 -1
- package/dist/sync-agent/river-connection/models/transactionalClient.js +0 -14
- package/dist/sync-agent/river-connection/models/transactionalClient.js.map +0 -1
- package/dist/sync-agent/spaces/models/channel.d.ts +0 -121
- package/dist/sync-agent/spaces/models/channel.d.ts.map +0 -1
- package/dist/sync-agent/spaces/models/channel.js +0 -182
- package/dist/sync-agent/spaces/models/channel.js.map +0 -1
- package/dist/sync-agent/spaces/models/space.d.ts +0 -57
- package/dist/sync-agent/spaces/models/space.d.ts.map +0 -1
- package/dist/sync-agent/spaces/models/space.js +0 -125
- package/dist/sync-agent/spaces/models/space.js.map +0 -1
- package/dist/sync-agent/spaces/spaces.d.ts +0 -28
- package/dist/sync-agent/spaces/spaces.d.ts.map +0 -1
- package/dist/sync-agent/spaces/spaces.js +0 -71
- package/dist/sync-agent/spaces/spaces.js.map +0 -1
- package/dist/tests/multi/channelSpaceSettings.test.d.ts +0 -5
- package/dist/tests/multi/channelSpaceSettings.test.d.ts.map +0 -1
- package/dist/tests/multi/channelSpaceSettings.test.js +0 -204
- package/dist/tests/multi/channelSpaceSettings.test.js.map +0 -1
- package/dist/tests/multi/disableChannel.test.d.ts +0 -5
- package/dist/tests/multi/disableChannel.test.d.ts.map +0 -1
- package/dist/tests/multi/disableChannel.test.js +0 -30
- package/dist/tests/multi/disableChannel.test.js.map +0 -1
- package/dist/tests/multi/disableSpace.test.d.ts.map +0 -1
- package/dist/tests/multi/disableSpace.test.js +0 -37
- package/dist/tests/multi/disableSpace.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelEntitlementPermissions.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelEntitlementPermissions.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelEntitlementPermissions.test.js +0 -129
- package/dist/tests/multi/entitlements/channelEntitlementPermissions.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelWithThreeNestedEntitlement.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelWithThreeNestedEntitlement.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelWithThreeNestedEntitlement.test.js +0 -44
- package/dist/tests/multi/entitlements/channelWithThreeNestedEntitlement.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithComplexEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithComplexEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithComplexEntitlements.test.js +0 -125
- package/dist/tests/multi/entitlements/channelsWithComplexEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithEntitlementLoss.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithEntitlementLoss.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithEntitlementLoss.test.js +0 -72
- package/dist/tests/multi/entitlements/channelsWithEntitlementLoss.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js +0 -57
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithErc20Entitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithErc20Entitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithErc20Entitlements.test.js +0 -86
- package/dist/tests/multi/entitlements/channelsWithErc20Entitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithErc721Entitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithErc721Entitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithErc721Entitlements.test.js +0 -69
- package/dist/tests/multi/entitlements/channelsWithErc721Entitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithEthBalanceEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithEthBalanceEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithEthBalanceEntitlements.test.js +0 -145
- package/dist/tests/multi/entitlements/channelsWithEthBalanceEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithUserEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/channelsWithUserEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/channelsWithUserEntitlements.test.js +0 -53
- package/dist/tests/multi/entitlements/channelsWithUserEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/membershipRenewals.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/membershipRenewals.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/membershipRenewals.test.js +0 -150
- package/dist/tests/multi/entitlements/membershipRenewals.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithComplexEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithComplexEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithComplexEntitlements.test.js +0 -131
- package/dist/tests/multi/entitlements/spaceWithComplexEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithEntitlements.test.js +0 -109
- package/dist/tests/multi/entitlements/spaceWithEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithErc20Entitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithErc20Entitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithErc20Entitlements.test.js +0 -103
- package/dist/tests/multi/entitlements/spaceWithErc20Entitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithErc721Entitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithErc721Entitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithErc721Entitlements.test.js +0 -84
- package/dist/tests/multi/entitlements/spaceWithErc721Entitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithEthBalanceEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithEthBalanceEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithEthBalanceEntitlements.test.js +0 -168
- package/dist/tests/multi/entitlements/spaceWithEthBalanceEntitlements.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithThreeNestedEntitlement.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithThreeNestedEntitlement.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithThreeNestedEntitlement.test.js +0 -45
- package/dist/tests/multi/entitlements/spaceWithThreeNestedEntitlement.test.js.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithUserEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/entitlements/spaceWithUserEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/entitlements/spaceWithUserEntitlements.test.js +0 -79
- package/dist/tests/multi/entitlements/spaceWithUserEntitlements.test.js.map +0 -1
- package/dist/tests/multi/legacySpace.test.d.ts.map +0 -1
- package/dist/tests/multi/legacySpace.test.js +0 -48
- package/dist/tests/multi/legacySpace.test.js.map +0 -1
- package/dist/tests/multi/mediaWithEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/mediaWithEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/mediaWithEntitlements.test.js +0 -152
- package/dist/tests/multi/mediaWithEntitlements.test.js.map +0 -1
- package/dist/tests/multi/membershipManagement.test.d.ts +0 -5
- package/dist/tests/multi/membershipManagement.test.d.ts.map +0 -1
- package/dist/tests/multi/membershipManagement.test.js +0 -76
- package/dist/tests/multi/membershipManagement.test.js.map +0 -1
- package/dist/tests/multi/riverAirdropDapp.test.d.ts +0 -5
- package/dist/tests/multi/riverAirdropDapp.test.d.ts.map +0 -1
- package/dist/tests/multi/riverAirdropDapp.test.js +0 -43
- package/dist/tests/multi/riverAirdropDapp.test.js.map +0 -1
- package/dist/tests/multi/spaceDapp.test.d.ts.map +0 -1
- package/dist/tests/multi/spaceDapp.test.js +0 -61
- package/dist/tests/multi/spaceDapp.test.js.map +0 -1
- package/dist/tests/multi/spaceWithVariousPriceConfigurations.test.d.ts +0 -2
- package/dist/tests/multi/spaceWithVariousPriceConfigurations.test.d.ts.map +0 -1
- package/dist/tests/multi/spaceWithVariousPriceConfigurations.test.js +0 -63
- package/dist/tests/multi/spaceWithVariousPriceConfigurations.test.js.map +0 -1
- package/dist/tests/multi/withEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/withEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/withEntitlements.test.js +0 -125
- package/dist/tests/multi/withEntitlements.test.js.map +0 -1
- package/dist/tests/multi_ne/dms.test.d.ts +0 -5
- package/dist/tests/multi_ne/dms.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/dms.test.js +0 -131
- package/dist/tests/multi_ne/dms.test.js.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_DisplayNames.test.d.ts +0 -5
- package/dist/tests/multi_ne/memberMetadata_DisplayNames.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_DisplayNames.test.js +0 -54
- package/dist/tests/multi_ne/memberMetadata_DisplayNames.test.js.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_EnsAddresses.test.d.ts +0 -5
- package/dist/tests/multi_ne/memberMetadata_EnsAddresses.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_EnsAddresses.test.js +0 -37
- package/dist/tests/multi_ne/memberMetadata_EnsAddresses.test.js.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_Nft.test.d.ts +0 -5
- package/dist/tests/multi_ne/memberMetadata_Nft.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_Nft.test.js +0 -49
- package/dist/tests/multi_ne/memberMetadata_Nft.test.js.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_Usernames.test.d.ts +0 -5
- package/dist/tests/multi_ne/memberMetadata_Usernames.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/memberMetadata_Usernames.test.js +0 -126
- package/dist/tests/multi_ne/memberMetadata_Usernames.test.js.map +0 -1
- package/dist/tests/multi_ne/space.test.d.ts +0 -5
- package/dist/tests/multi_ne/space.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/space.test.js +0 -284
- package/dist/tests/multi_ne/space.test.js.map +0 -1
- package/dist/tests/multi_v2/entitlements/channelsWithCrossChainEntitlements.test.d.ts +0 -6
- package/dist/tests/multi_v2/entitlements/channelsWithCrossChainEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi_v2/entitlements/channelsWithCrossChainEntitlements.test.js +0 -78
- package/dist/tests/multi_v2/entitlements/channelsWithCrossChainEntitlements.test.js.map +0 -1
- package/dist/tests/multi_v2/entitlements/channelsWithErc1155Entitlement.test.d.ts +0 -6
- package/dist/tests/multi_v2/entitlements/channelsWithErc1155Entitlement.test.d.ts.map +0 -1
- package/dist/tests/multi_v2/entitlements/channelsWithErc1155Entitlement.test.js +0 -89
- package/dist/tests/multi_v2/entitlements/channelsWithErc1155Entitlement.test.js.map +0 -1
- package/dist/tests/multi_v2/entitlements/spaceWithCrossChainEntitlements.test.d.ts +0 -6
- package/dist/tests/multi_v2/entitlements/spaceWithCrossChainEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi_v2/entitlements/spaceWithCrossChainEntitlements.test.js +0 -88
- package/dist/tests/multi_v2/entitlements/spaceWithCrossChainEntitlements.test.js.map +0 -1
- package/dist/tests/multi_v2/entitlements/spaceWithErc1155Entitlements.test.d.ts +0 -6
- package/dist/tests/multi_v2/entitlements/spaceWithErc1155Entitlements.test.d.ts.map +0 -1
- package/dist/tests/multi_v2/entitlements/spaceWithErc1155Entitlements.test.js +0 -105
- package/dist/tests/multi_v2/entitlements/spaceWithErc1155Entitlements.test.js.map +0 -1
- package/dist/tests/multi_v2/updateRole.test.d.ts +0 -5
- package/dist/tests/multi_v2/updateRole.test.d.ts.map +0 -1
- package/dist/tests/multi_v2/updateRole.test.js +0 -25
- package/dist/tests/multi_v2/updateRole.test.js.map +0 -1
- package/dist/tests/unit/snapshotMigration0002.test.d.ts +0 -2
- package/dist/tests/unit/snapshotMigration0002.test.d.ts.map +0 -1
- package/dist/tests/unit/snapshotMigration0002.test.js +0 -31
- package/dist/tests/unit/snapshotMigration0002.test.js.map +0 -1
- package/dist/views/streams/channelStreams.d.ts +0 -8
- package/dist/views/streams/channelStreams.d.ts.map +0 -1
- package/dist/views/streams/channelStreams.js +0 -9
- package/dist/views/streams/channelStreams.js.map +0 -1
- package/dist/views/streams/dmStreams.d.ts +0 -13
- package/dist/views/streams/dmStreams.d.ts.map +0 -1
- package/dist/views/streams/dmStreams.js +0 -33
- package/dist/views/streams/dmStreams.js.map +0 -1
- package/dist/views/streams/spaceStreams.d.ts +0 -17
- package/dist/views/streams/spaceStreams.d.ts.map +0 -1
- package/dist/views/streams/spaceStreams.js +0 -52
- package/dist/views/streams/spaceStreams.js.map +0 -1
package/dist/client.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { create, toBinary, toJsonString } from '@bufbuild/protobuf';
|
|
2
2
|
import { SpaceAddressFromSpaceId, SpaceReviewAction, } from '@towns-labs/web3';
|
|
3
|
-
import { MembershipOp,
|
|
4
|
-
import { bin_fromHexString, bin_toHexString, shortenHexString, check, dlog, dlogError,
|
|
5
|
-
import { AES_GCM_DERIVED_ALGORITHM, EncryptionAlgorithmId, GroupEncryptionAlgorithmId, GroupEncryptionCrypto, } from '@towns-labs/encryption';
|
|
3
|
+
import { MembershipOp, Err, BlockchainTransactionReceipt_LogSchema, BlockchainTransactionReceiptSchema, ChannelPropertiesSchema, FullyReadMarkersSchema, ChunkedMediaSchema, EncryptedDataSchema, UserBioSchema, ChannelMessageSchema, SolanaBlockchainTransactionReceiptSchema, SessionKeysSchema, EnvelopeSchema, MessageInteractionType, InteractionRequestPayloadSchema, InteractionResponsePayloadSchema, EncryptedDataVersion, } from '@towns-labs/proto';
|
|
4
|
+
import { bin_fromHexString, bin_toHexString, shortenHexString, check, dlog, dlogError, bin_toBase64, } from '@towns-labs/utils';
|
|
5
|
+
import { AES_GCM_DERIVED_ALGORITHM, EncryptionAlgorithmId, GroupEncryptionAlgorithmId, GroupEncryptionCrypto, parseGroupEncryptionAlgorithmId, } from '@towns-labs/encryption';
|
|
6
6
|
import { makeSessionKeys, } from './decryptionExtensions';
|
|
7
7
|
import { ClientDecryptionExtensions } from './clientDecryptionExtensions';
|
|
8
8
|
import { getMaxTimeoutMs, getMiniblocks } from './makeStreamRpcClient';
|
|
9
9
|
import { errorContains, errorContainsMessage, getRpcErrorProperty } from './rpcInterceptors';
|
|
10
10
|
import { assert, isDefined, logNever } from './check';
|
|
11
11
|
import EventEmitter from 'events';
|
|
12
|
-
import {
|
|
12
|
+
import { isGDMChannelStreamId, makeUniqueGDMChannelStreamId, makeUniqueMediaStreamId, makeUserMetadataStreamId, makeUserSettingsStreamId, makeUserStreamId, makeUserInboxStreamId, userIdFromAddress, addressFromUserId, streamIdAsBytes, streamIdAsString, isUserId, } from './id';
|
|
13
13
|
import { makeEvent, unpackStream, unpackStreamEx, waitForStreamEx, } from './sign';
|
|
14
14
|
import { StreamStateView } from './streamStateView';
|
|
15
|
-
import { make_UserMetadataPayload_Inception,
|
|
15
|
+
import { make_UserMetadataPayload_Inception, make_MemberPayload_Membership2, make_UserPayload_Inception, make_UserSettingsPayload_FullyReadMarkers, make_UserSettingsPayload_UserBlock, make_UserSettingsPayload_Inception, make_MediaPayload_Inception, make_MediaPayload_Chunk, make_GDMChannelPayload_Inception, make_GDMChannelPayload_Message, make_UserInboxPayload_Ack, make_UserInboxPayload_Inception, make_UserMetadataPayload_EncryptionDevice, make_UserInboxPayload_GroupEncryptionSessions, make_GDMChannelPayload_ChannelProperties, make_UserPayload_UserMembershipAction, make_UserPayload_UserMembership, getRefEventIdFromChannelMessage, make_payload_Redaction, make_MemberPayload_Pin, make_MemberPayload_Unpin, make_UserMetadataPayload_ProfileImage, make_UserMetadataPayload_Bio, make_UserPayload_BlockchainTransaction, make_MemberPayload_EncryptionAlgorithm, isSolanaTransactionReceipt, make_payload_InteractionRequest, make_payload_InteractionResponse, } from './types';
|
|
16
16
|
import { applyExclusionFilterToMiniblocks } from './streamUtils';
|
|
17
17
|
import debug from 'debug';
|
|
18
|
-
import { ethereumAddressAsBytes, getTime, isEthereumAddress
|
|
18
|
+
import { ethereumAddressAsBytes, getTime, isEthereumAddress } from './utils';
|
|
19
19
|
import { isEncryptedContentKind, toDecryptedContent } from './encryptedContentTypes';
|
|
20
20
|
import { PersistenceStore, StubPersistenceStore, } from './persistenceStore';
|
|
21
21
|
import { SyncedStreams } from './syncedStreams';
|
|
@@ -76,8 +76,6 @@ export class Client extends EventEmitter {
|
|
|
76
76
|
syncedStreamsExtensions;
|
|
77
77
|
persistenceStore;
|
|
78
78
|
defaultGroupEncryptionAlgorithm;
|
|
79
|
-
pendingUsernames = new Map();
|
|
80
|
-
pendingUsernameTimeouts = new Map();
|
|
81
79
|
constructor(signerContext, appAddress, rpcClient, cryptoStore, opts) {
|
|
82
80
|
super();
|
|
83
81
|
this.opts = opts;
|
|
@@ -93,7 +91,7 @@ export class Client extends EventEmitter {
|
|
|
93
91
|
this.userId = userIdFromAddress(signerContext.creatorAddress);
|
|
94
92
|
this.appAddress = appAddress;
|
|
95
93
|
this.streamsView = new StreamsView(this.userId, {
|
|
96
|
-
|
|
94
|
+
isGDMMessageEventBlocked: (event) => {
|
|
97
95
|
if (!this?.userSettingsStreamId) {
|
|
98
96
|
return false;
|
|
99
97
|
}
|
|
@@ -183,8 +181,7 @@ export class Client extends EventEmitter {
|
|
|
183
181
|
this.on('streamUpToDate', (s) => void this.onStreamUpToDate(s));
|
|
184
182
|
const streamIds = Object.entries(stream.view.userContent.streamMemberships).reduce((acc, [streamId, payload]) => {
|
|
185
183
|
if (payload?.op === MembershipOp.SO_JOIN ||
|
|
186
|
-
(payload?.op === MembershipOp.SO_INVITE &&
|
|
187
|
-
(isDMChannelStreamId(streamId) || isGDMChannelStreamId(streamId)))) {
|
|
184
|
+
(payload?.op === MembershipOp.SO_INVITE && isGDMChannelStreamId(streamId))) {
|
|
188
185
|
acc.push(streamId);
|
|
189
186
|
}
|
|
190
187
|
return acc;
|
|
@@ -199,27 +196,16 @@ export class Client extends EventEmitter {
|
|
|
199
196
|
const appOwnerAddress = opts?.appOwnerAddress
|
|
200
197
|
? ethereumAddressAsBytes(opts.appOwnerAddress)
|
|
201
198
|
: undefined;
|
|
202
|
-
if (opts?.installedAppAddress && !isEthereumAddress(opts.installedAppAddress)) {
|
|
203
|
-
throw Error('installedAppAddress must be an ethereum address');
|
|
204
|
-
}
|
|
205
|
-
const spaceId = opts?.spaceId ? streamIdAsBytes(opts?.spaceId) : undefined;
|
|
206
|
-
const installedAppAddress = opts?.installedAppAddress
|
|
207
|
-
? ethereumAddressAsBytes(opts.installedAppAddress)
|
|
208
|
-
: undefined;
|
|
209
|
-
const initMetadata = {
|
|
210
|
-
spaceId,
|
|
211
|
-
installedAppAddress,
|
|
212
|
-
};
|
|
213
199
|
const initializeUserStartTime = performance.now();
|
|
214
200
|
this.logCall('initializeUser', this.userId);
|
|
215
201
|
assert(this.userStreamId === undefined, 'already initialized');
|
|
216
202
|
const initCrypto = await getTime(() => this.initCrypto(opts?.encryptionDeviceInit));
|
|
217
203
|
check(isDefined(this.decryptionExtensions), 'decryptionExtensions must be defined');
|
|
218
204
|
const [initUserStream, initUserInboxStream, initUserMetadataStream, initUserSettingsStream,] = await Promise.all([
|
|
219
|
-
getTime(() => this.initUserStream(
|
|
220
|
-
getTime(() => this.initUserInboxStream(
|
|
221
|
-
getTime(() => this.initUserMetadataStream(
|
|
222
|
-
getTime(() => this.initUserSettingsStream(
|
|
205
|
+
getTime(() => this.initUserStream({ appOwnerAddress })),
|
|
206
|
+
getTime(() => this.initUserInboxStream({ appOwnerAddress })),
|
|
207
|
+
getTime(() => this.initUserMetadataStream({ appOwnerAddress })),
|
|
208
|
+
getTime(() => this.initUserSettingsStream({ appOwnerAddress })),
|
|
223
209
|
]);
|
|
224
210
|
this.initUserJoinedStreams();
|
|
225
211
|
if (!opts?.skipSync) {
|
|
@@ -243,27 +229,27 @@ export class Client extends EventEmitter {
|
|
|
243
229
|
onNetworkStatusChanged(isOnline) {
|
|
244
230
|
this.streams.onNetworkStatusChanged(isOnline);
|
|
245
231
|
}
|
|
246
|
-
async initUserStream(
|
|
232
|
+
async initUserStream(args) {
|
|
247
233
|
this.userStreamId = makeUserStreamId(this.userId);
|
|
248
234
|
const userStream = this.createSyncedStream(this.userStreamId);
|
|
249
235
|
if (!(await userStream.initializeFromPersistence())) {
|
|
250
236
|
const response = (await this.getUserStream(this.userStreamId)) ??
|
|
251
|
-
(await this.createUserStream(this.userStreamId,
|
|
237
|
+
(await this.createUserStream(this.userStreamId, args));
|
|
252
238
|
await userStream.initializeFromResponse(response);
|
|
253
239
|
}
|
|
254
240
|
check(userStream.view.userContent.appAddress === this.appAddress, 'appAddress mismatch after initializing user stream');
|
|
255
241
|
}
|
|
256
|
-
async initUserInboxStream(
|
|
242
|
+
async initUserInboxStream(args) {
|
|
257
243
|
this.userInboxStreamId = makeUserInboxStreamId(this.userId);
|
|
258
244
|
const userInboxStream = this.createSyncedStream(this.userInboxStreamId);
|
|
259
245
|
if (!(await userInboxStream.initializeFromPersistence())) {
|
|
260
246
|
const response = (await this.getUserStream(this.userInboxStreamId)) ??
|
|
261
|
-
(await this.createUserInboxStream(this.userInboxStreamId,
|
|
247
|
+
(await this.createUserInboxStream(this.userInboxStreamId, args));
|
|
262
248
|
await userInboxStream.initializeFromResponse(response);
|
|
263
249
|
}
|
|
264
250
|
check(userInboxStream.view.userInboxContent.appAddress === this.appAddress, 'appAddress mismatch after initializing user inbox stream');
|
|
265
251
|
}
|
|
266
|
-
async initUserMetadataStream(
|
|
252
|
+
async initUserMetadataStream(args) {
|
|
267
253
|
this.userMetadataStreamId = makeUserMetadataStreamId(this.userId);
|
|
268
254
|
const userMetadataStream = this.createSyncedStream(this.userMetadataStreamId);
|
|
269
255
|
let initUserMetadataStreamInitFromPersistenceTime = 0;
|
|
@@ -285,7 +271,7 @@ export class Client extends EventEmitter {
|
|
|
285
271
|
else {
|
|
286
272
|
const createUserMetadataStreamResponse = await getTime(() => {
|
|
287
273
|
check(!!this.userMetadataStreamId, 'userMetadataStreamId must be set');
|
|
288
|
-
return this.createUserMetadataStream(this.userMetadataStreamId,
|
|
274
|
+
return this.createUserMetadataStream(this.userMetadataStreamId, args);
|
|
289
275
|
});
|
|
290
276
|
initUserMetadataStreamCreateUserMetadataStreamTime =
|
|
291
277
|
createUserMetadataStreamResponse.time;
|
|
@@ -313,12 +299,12 @@ export class Client extends EventEmitter {
|
|
|
313
299
|
};
|
|
314
300
|
return times;
|
|
315
301
|
}
|
|
316
|
-
async initUserSettingsStream(
|
|
302
|
+
async initUserSettingsStream(args) {
|
|
317
303
|
this.userSettingsStreamId = makeUserSettingsStreamId(this.userId);
|
|
318
304
|
const userSettingsStream = this.createSyncedStream(this.userSettingsStreamId);
|
|
319
305
|
if (!(await userSettingsStream.initializeFromPersistence())) {
|
|
320
306
|
const response = (await this.getUserStream(this.userSettingsStreamId)) ??
|
|
321
|
-
(await this.createUserSettingsStream(this.userSettingsStreamId,
|
|
307
|
+
(await this.createUserSettingsStream(this.userSettingsStreamId, args));
|
|
322
308
|
await userSettingsStream.initializeFromResponse(response);
|
|
323
309
|
}
|
|
324
310
|
check(userSettingsStream.view.userSettingsContent.appAddress === this.appAddress, 'appAddress mismatch after initializing user settings stream');
|
|
@@ -335,7 +321,8 @@ export class Client extends EventEmitter {
|
|
|
335
321
|
return undefined;
|
|
336
322
|
}
|
|
337
323
|
}
|
|
338
|
-
async createUserStream(userStreamId,
|
|
324
|
+
async createUserStream(userStreamId, args) {
|
|
325
|
+
const { appOwnerAddress } = args;
|
|
339
326
|
check(isDefined(this.appAddress) == isDefined(appOwnerAddress), 'appAddress and appOwnerAddress must both be set or both be undefined');
|
|
340
327
|
const userEvents = [
|
|
341
328
|
await makeEvent(this.signerContext, make_UserPayload_Inception({
|
|
@@ -344,15 +331,15 @@ export class Client extends EventEmitter {
|
|
|
344
331
|
appOwnerAddress,
|
|
345
332
|
})),
|
|
346
333
|
];
|
|
347
|
-
const encoded = metadata ? stripUndefinedMetadata(metadata) : metadata;
|
|
348
334
|
const response = await this.rpcClient.createStream({
|
|
349
335
|
events: userEvents,
|
|
350
336
|
streamId: streamIdAsBytes(userStreamId),
|
|
351
|
-
metadata:
|
|
337
|
+
metadata: undefined,
|
|
352
338
|
});
|
|
353
339
|
return unpackStream(response.stream, this.opts?.unpackEnvelopeOpts);
|
|
354
340
|
}
|
|
355
|
-
async createUserMetadataStream(userMetadataStreamId,
|
|
341
|
+
async createUserMetadataStream(userMetadataStreamId, args) {
|
|
342
|
+
const { appOwnerAddress } = args;
|
|
356
343
|
check(isDefined(this.appAddress) == isDefined(appOwnerAddress), 'appAddress and appOwnerAddress must both be set or both be undefined');
|
|
357
344
|
const userDeviceKeyEvents = [
|
|
358
345
|
await makeEvent(this.signerContext, make_UserMetadataPayload_Inception({
|
|
@@ -361,15 +348,15 @@ export class Client extends EventEmitter {
|
|
|
361
348
|
appOwnerAddress,
|
|
362
349
|
})),
|
|
363
350
|
];
|
|
364
|
-
const encoded = metadata ? stripUndefinedMetadata(metadata) : metadata;
|
|
365
351
|
const response = await this.rpcClient.createStream({
|
|
366
352
|
events: userDeviceKeyEvents,
|
|
367
353
|
streamId: streamIdAsBytes(userMetadataStreamId),
|
|
368
|
-
metadata:
|
|
354
|
+
metadata: undefined,
|
|
369
355
|
});
|
|
370
356
|
return unpackStream(response.stream, this.opts?.unpackEnvelopeOpts);
|
|
371
357
|
}
|
|
372
|
-
async createUserInboxStream(userInboxStreamId,
|
|
358
|
+
async createUserInboxStream(userInboxStreamId, args) {
|
|
359
|
+
const { appOwnerAddress } = args;
|
|
373
360
|
check(isDefined(this.appAddress) == isDefined(appOwnerAddress), 'appAddress and appOwnerAddress must both be set or both be undefined');
|
|
374
361
|
const userInboxEvents = [
|
|
375
362
|
await makeEvent(this.signerContext, make_UserInboxPayload_Inception({
|
|
@@ -378,15 +365,15 @@ export class Client extends EventEmitter {
|
|
|
378
365
|
appOwnerAddress,
|
|
379
366
|
})),
|
|
380
367
|
];
|
|
381
|
-
const encoded = metadata ? stripUndefinedMetadata(metadata) : metadata;
|
|
382
368
|
const response = await this.rpcClient.createStream({
|
|
383
369
|
events: userInboxEvents,
|
|
384
370
|
streamId: streamIdAsBytes(userInboxStreamId),
|
|
385
|
-
metadata:
|
|
371
|
+
metadata: undefined,
|
|
386
372
|
});
|
|
387
373
|
return unpackStream(response.stream, this.opts?.unpackEnvelopeOpts);
|
|
388
374
|
}
|
|
389
|
-
async createUserSettingsStream(inUserSettingsStreamId,
|
|
375
|
+
async createUserSettingsStream(inUserSettingsStreamId, args) {
|
|
376
|
+
const { appOwnerAddress } = args;
|
|
390
377
|
check(isDefined(this.appAddress) == isDefined(appOwnerAddress), 'appAddress and appOwnerAddress must both be set or both be undefined');
|
|
391
378
|
const userSettingsStreamId = streamIdAsBytes(inUserSettingsStreamId);
|
|
392
379
|
const userSettingsEvents = [
|
|
@@ -396,11 +383,10 @@ export class Client extends EventEmitter {
|
|
|
396
383
|
appOwnerAddress,
|
|
397
384
|
})),
|
|
398
385
|
];
|
|
399
|
-
const encoded = metadata ? stripUndefinedMetadata(metadata) : metadata;
|
|
400
386
|
const response = await this.rpcClient.createStream({
|
|
401
387
|
events: userSettingsEvents,
|
|
402
388
|
streamId: userSettingsStreamId,
|
|
403
|
-
metadata:
|
|
389
|
+
metadata: undefined,
|
|
404
390
|
});
|
|
405
391
|
return unpackStream(response.stream, this.opts?.unpackEnvelopeOpts);
|
|
406
392
|
}
|
|
@@ -429,83 +415,20 @@ export class Client extends EventEmitter {
|
|
|
429
415
|
}
|
|
430
416
|
return { streamId: streamId };
|
|
431
417
|
}
|
|
432
|
-
// createSpace
|
|
433
|
-
// param spaceAddress: address of the space contract, or address made with makeSpaceStreamId
|
|
434
418
|
async createSpace(spaceAddressOrId) {
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
: makeSpaceStreamId(spaceAddressOrId);
|
|
438
|
-
const spaceId = streamIdAsBytes(oSpaceId);
|
|
439
|
-
this.logCall('createSpace', spaceId);
|
|
440
|
-
assert(this.userStreamId !== undefined, 'streamId must be set');
|
|
441
|
-
assert(isSpaceStreamId(spaceId), 'spaceId must be a valid streamId');
|
|
442
|
-
// create utf8 encoder
|
|
443
|
-
const inceptionEvent = await makeEvent(this.signerContext, make_SpacePayload_Inception({
|
|
444
|
-
streamId: spaceId,
|
|
445
|
-
}));
|
|
446
|
-
const joinEvent = await makeEvent(this.signerContext, make_MemberPayload_Membership2({
|
|
447
|
-
userId: this.userId,
|
|
448
|
-
op: MembershipOp.SO_JOIN,
|
|
449
|
-
initiatorId: this.userId,
|
|
450
|
-
}));
|
|
451
|
-
return this.createStreamAndSync({
|
|
452
|
-
events: [inceptionEvent, joinEvent],
|
|
453
|
-
streamId: spaceId,
|
|
454
|
-
metadata: {},
|
|
455
|
-
});
|
|
419
|
+
this.logCall('createSpace', spaceAddressOrId);
|
|
420
|
+
throw new Error('Space streams are not supported');
|
|
456
421
|
}
|
|
457
422
|
async createChannel(spaceId, _channelName, _channelTopic, inChannelId, streamSettings, channelSettings) {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
const derivedSpaceId = spaceIdFromChannelId(channelIdStr);
|
|
463
|
-
assert(derivedSpaceId === spaceIdstr, 'derivedSpaceId must be the same as spaceId');
|
|
464
|
-
assert(this.userStreamId !== undefined, 'userStreamId must be set');
|
|
465
|
-
assert(isSpaceStreamId(spaceId), 'spaceId must be a valid streamId');
|
|
466
|
-
assert(isChannelStreamId(channelId), 'channelId must be a valid streamId');
|
|
467
|
-
const inceptionEvent = await makeEvent(this.signerContext, make_ChannelPayload_Inception({
|
|
468
|
-
streamId: channelId,
|
|
469
|
-
settings: streamSettings,
|
|
470
|
-
channelSettings: channelSettings,
|
|
471
|
-
}));
|
|
472
|
-
const joinEvent = await makeEvent(this.signerContext, make_MemberPayload_Membership2({
|
|
473
|
-
userId: this.userId,
|
|
474
|
-
op: MembershipOp.SO_JOIN,
|
|
475
|
-
initiatorId: this.userId,
|
|
476
|
-
}));
|
|
477
|
-
return this.createStreamAndSync({
|
|
478
|
-
events: [inceptionEvent, joinEvent],
|
|
479
|
-
streamId: channelId,
|
|
480
|
-
metadata: {},
|
|
481
|
-
});
|
|
423
|
+
this.logCall('createChannel', streamIdAsString(inChannelId), streamIdAsString(spaceId));
|
|
424
|
+
void streamSettings;
|
|
425
|
+
void channelSettings;
|
|
426
|
+
throw new Error('Channel streams are not supported');
|
|
482
427
|
}
|
|
483
428
|
async createDMChannel(userId, appAddress, streamSettings) {
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
streamId: channelId,
|
|
488
|
-
firstPartyAddress: this.signerContext.creatorAddress,
|
|
489
|
-
secondPartyAddress: addressFromUserId(userId),
|
|
490
|
-
secondPartyAppAddress: appAddress ? bin_fromHexString(appAddress) : undefined,
|
|
491
|
-
settings: streamSettings,
|
|
492
|
-
}));
|
|
493
|
-
const joinEvent = await makeEvent(this.signerContext, make_MemberPayload_Membership2({
|
|
494
|
-
userId: this.userId,
|
|
495
|
-
op: MembershipOp.SO_JOIN,
|
|
496
|
-
initiatorId: this.userId,
|
|
497
|
-
}));
|
|
498
|
-
const inviteEvent = await makeEvent(this.signerContext, make_MemberPayload_Membership2({
|
|
499
|
-
userId: userId,
|
|
500
|
-
op: MembershipOp.SO_JOIN,
|
|
501
|
-
initiatorId: this.userId,
|
|
502
|
-
appAddress,
|
|
503
|
-
}));
|
|
504
|
-
return this.createStreamAndSync({
|
|
505
|
-
events: [inceptionEvent, joinEvent, inviteEvent],
|
|
506
|
-
streamId: channelId,
|
|
507
|
-
metadata: {},
|
|
508
|
-
});
|
|
429
|
+
this.logCall('createDMChannel', userId, appAddress);
|
|
430
|
+
void streamSettings;
|
|
431
|
+
throw new Error('DM streams are not supported');
|
|
509
432
|
}
|
|
510
433
|
async createGDMChannel(users, channelProperties, streamSettings) {
|
|
511
434
|
const channelIdStr = makeUniqueGDMChannelStreamId();
|
|
@@ -545,12 +468,10 @@ export class Client extends EventEmitter {
|
|
|
545
468
|
throw Error('channelId, spaceId or userId must be set');
|
|
546
469
|
}
|
|
547
470
|
if (spaceId) {
|
|
548
|
-
|
|
471
|
+
throw Error('spaceId is not supported for media streams');
|
|
549
472
|
}
|
|
550
473
|
if (channelId) {
|
|
551
|
-
assert(
|
|
552
|
-
isDMChannelStreamId(channelId) ||
|
|
553
|
-
isGDMChannelStreamId(channelId), 'channelId must be a valid streamId');
|
|
474
|
+
assert(isGDMChannelStreamId(channelId), 'channelId must be a valid GDM streamId');
|
|
554
475
|
}
|
|
555
476
|
if (userId) {
|
|
556
477
|
assert(isUserId(userId), 'userId must be a valid userId');
|
|
@@ -562,7 +483,7 @@ export class Client extends EventEmitter {
|
|
|
562
483
|
events.push(await makeEvent(this.signerContext, make_MediaPayload_Inception({
|
|
563
484
|
streamId: streamIdAsBytes(streamId),
|
|
564
485
|
channelId: channelId ? streamIdAsBytes(channelId) : undefined,
|
|
565
|
-
spaceId:
|
|
486
|
+
spaceId: undefined,
|
|
566
487
|
userId: userId ? addressFromUserId(userId) : undefined,
|
|
567
488
|
chunkCount,
|
|
568
489
|
settings: streamSettings,
|
|
@@ -585,33 +506,15 @@ export class Client extends EventEmitter {
|
|
|
585
506
|
}
|
|
586
507
|
async updateChannel(spaceId, channelId, unused1, unused2) {
|
|
587
508
|
this.logCall('updateChannel', channelId, spaceId, unused1, unused2);
|
|
588
|
-
|
|
589
|
-
assert(isChannelStreamId(channelId), 'channelId must be a valid streamId');
|
|
590
|
-
return this.makeEventAndAddToStream(spaceId, // we send events to the stream of the space where updated channel belongs to
|
|
591
|
-
make_SpacePayload_ChannelUpdate({
|
|
592
|
-
op: ChannelOp.CO_UPDATED,
|
|
593
|
-
channelId: streamIdAsBytes(channelId),
|
|
594
|
-
}), { method: 'updateChannel' });
|
|
509
|
+
throw new Error('Channel streams are not supported');
|
|
595
510
|
}
|
|
596
511
|
async updateChannelAutojoin(spaceId, channelId, autojoin) {
|
|
597
512
|
this.logCall('updateChannelAutojoin', channelId, spaceId, autojoin);
|
|
598
|
-
|
|
599
|
-
assert(isChannelStreamId(channelId), 'channelId must be a valid streamId');
|
|
600
|
-
return this.makeEventAndAddToStream(spaceId, // we send events to the stream of the space where updated channel belongs to
|
|
601
|
-
make_SpacePayload_UpdateChannelAutojoin({
|
|
602
|
-
channelId: streamIdAsBytes(channelId),
|
|
603
|
-
autojoin: autojoin,
|
|
604
|
-
}), { method: 'updateChannelAutojoin' });
|
|
513
|
+
throw new Error('Channel streams are not supported');
|
|
605
514
|
}
|
|
606
515
|
async updateChannelHideUserJoinLeaveEvents(spaceId, channelId, hideUserJoinLeaveEvents) {
|
|
607
516
|
this.logCall('updateChannelHideUserJoinLeaveEvents', channelId, spaceId, hideUserJoinLeaveEvents);
|
|
608
|
-
|
|
609
|
-
assert(isChannelStreamId(channelId), 'channelId must be a valid streamId');
|
|
610
|
-
return this.makeEventAndAddToStream(spaceId, // we send events to the stream of the space where updated channel belongs to
|
|
611
|
-
make_SpacePayload_UpdateChannelHideUserJoinLeaveEvents({
|
|
612
|
-
channelId: streamIdAsBytes(channelId),
|
|
613
|
-
hideUserJoinLeaveEvents,
|
|
614
|
-
}), { method: 'updateChannelHideUserJoinLeaveEvents' });
|
|
517
|
+
throw new Error('Channel streams are not supported');
|
|
615
518
|
}
|
|
616
519
|
async updateGDMChannelProperties(streamId, channelName, channelTopic) {
|
|
617
520
|
this.logCall('updateGDMChannelProperties', streamId, channelName, channelTopic);
|
|
@@ -628,10 +531,7 @@ export class Client extends EventEmitter {
|
|
|
628
531
|
});
|
|
629
532
|
}
|
|
630
533
|
async setStreamEncryptionAlgorithm(streamId, encryptionAlgorithm) {
|
|
631
|
-
assert(
|
|
632
|
-
isSpaceStreamId(streamId) ||
|
|
633
|
-
isDMChannelStreamId(streamId) ||
|
|
634
|
-
isGDMChannelStreamId(streamId), 'channelId must be a valid streamId');
|
|
534
|
+
assert(isGDMChannelStreamId(streamId), 'streamId must be a valid GDM streamId');
|
|
635
535
|
const stream = this.stream(streamId);
|
|
636
536
|
check(isDefined(stream), 'stream not found');
|
|
637
537
|
check(stream.view.membershipContent.encryptionAlgorithm != encryptionAlgorithm, `encryptionAlgorithm is already set to ${encryptionAlgorithm}`);
|
|
@@ -657,15 +557,11 @@ export class Client extends EventEmitter {
|
|
|
657
557
|
if (!isDefined(this.userSettingsStreamId)) {
|
|
658
558
|
throw Error('userSettingsStreamId is not defined');
|
|
659
559
|
}
|
|
660
|
-
const dmStreamId = makeDMStreamId(this.userId, userId);
|
|
661
560
|
const lastBlock = this.stream(this.userSettingsStreamId)?.view.userSettingsContent.getLastBlock(userId);
|
|
662
561
|
if (lastBlock?.isBlocked === isBlocked) {
|
|
663
562
|
throw Error(`updateUserBlock isBlocked<${isBlocked}> must be different from existing value`);
|
|
664
563
|
}
|
|
665
|
-
|
|
666
|
-
if (lastBlock && lastBlock.eventNum >= eventNum) {
|
|
667
|
-
eventNum = lastBlock.eventNum + 1n;
|
|
668
|
-
}
|
|
564
|
+
const eventNum = (lastBlock?.eventNum ?? 0n) + 1n;
|
|
669
565
|
return this.makeEventAndAddToStream(this.userSettingsStreamId, make_UserSettingsPayload_UserBlock({
|
|
670
566
|
userId: addressFromUserId(userId),
|
|
671
567
|
isBlocked: isBlocked,
|
|
@@ -674,20 +570,7 @@ export class Client extends EventEmitter {
|
|
|
674
570
|
}
|
|
675
571
|
async setSpaceImage(spaceStreamId, chunkedMediaInfo) {
|
|
676
572
|
this.logCall('setSpaceImage', spaceStreamId, chunkedMediaInfo.streamId, chunkedMediaInfo.info);
|
|
677
|
-
|
|
678
|
-
const spaceAddress = contractAddressFromSpaceId(spaceStreamId);
|
|
679
|
-
const context = spaceAddress.toLowerCase();
|
|
680
|
-
// encrypt the chunked media
|
|
681
|
-
// use the lowercased spaceId as the key phrase
|
|
682
|
-
const { key, iv } = await deriveKeyAndIV(context);
|
|
683
|
-
const { ciphertext } = await encryptAESGCM(toBinary(ChunkedMediaSchema, create(ChunkedMediaSchema, chunkedMediaInfo)), key, iv);
|
|
684
|
-
const encryptedData = create(EncryptedDataSchema, {
|
|
685
|
-
ciphertext: uint8ArrayToBase64(ciphertext),
|
|
686
|
-
algorithm: AES_GCM_DERIVED_ALGORITHM,
|
|
687
|
-
}); // aellis this should probably include `satisfies PlainMessage<EncryptedData>`
|
|
688
|
-
// add the event to the stream
|
|
689
|
-
const event = make_SpacePayload_SpaceImage(encryptedData);
|
|
690
|
-
return this.makeEventAndAddToStream(spaceStreamId, event, { method: 'setSpaceImage' });
|
|
573
|
+
throw new Error('Space streams are not supported');
|
|
691
574
|
}
|
|
692
575
|
async setUserProfileImage(chunkedMediaInfo, userId) {
|
|
693
576
|
this.logCall('setUserProfileImage', userId, chunkedMediaInfo.streamId, chunkedMediaInfo.info);
|
|
@@ -739,79 +622,6 @@ export class Client extends EventEmitter {
|
|
|
739
622
|
const streamId = makeUserMetadataStreamId(userId);
|
|
740
623
|
return this.stream(streamId)?.view.userMetadataContent.getBio();
|
|
741
624
|
}
|
|
742
|
-
async setDisplayName(streamId, displayName) {
|
|
743
|
-
check(isDefined(this.cryptoBackend));
|
|
744
|
-
const encryptedData = await this.cryptoBackend.encryptGroupEvent(streamId, new TextEncoder().encode(displayName), this.defaultGroupEncryptionAlgorithm);
|
|
745
|
-
await this.makeEventAndAddToStream(streamId, make_MemberPayload_DisplayName(encryptedData), { method: 'displayName' });
|
|
746
|
-
}
|
|
747
|
-
async setUsername(streamId, username, force = false, options) {
|
|
748
|
-
check(isDefined(this.cryptoBackend));
|
|
749
|
-
check(username.length > 0, 'username cannot be empty');
|
|
750
|
-
const stream = this.stream(streamId);
|
|
751
|
-
check(isDefined(stream), 'stream not found');
|
|
752
|
-
// Clear any existing timeout first
|
|
753
|
-
const existingTimeout = this.pendingUsernameTimeouts.get(streamId);
|
|
754
|
-
if (existingTimeout) {
|
|
755
|
-
clearTimeout(existingTimeout);
|
|
756
|
-
this.pendingUsernameTimeouts.delete(streamId);
|
|
757
|
-
}
|
|
758
|
-
stream.view.getMemberMetadata().usernames.setLocalUsername(this.userId, username, this);
|
|
759
|
-
// be very careful about setting a username for a large group, we don't want to inject
|
|
760
|
-
// more sessions than needed into the group. unless a session has been received in 60 seconds,
|
|
761
|
-
// we will force set the username.
|
|
762
|
-
const memberCount = stream.view.membershipContent.joined.size;
|
|
763
|
-
const hasHybridSession = (await this.cryptoBackend?.hasHybridSession?.(streamId)) ?? false;
|
|
764
|
-
const largeGroupThreshold = options?.largeGroupThreshold ?? 100;
|
|
765
|
-
const delayMs = options?.delayMs ?? 60000;
|
|
766
|
-
if (memberCount > largeGroupThreshold && !hasHybridSession && !force) {
|
|
767
|
-
this.pendingUsernames.set(streamId, username);
|
|
768
|
-
const timeout = setTimeout(() => {
|
|
769
|
-
void this.setUsername(streamId, username, true, options);
|
|
770
|
-
}, delayMs);
|
|
771
|
-
this.pendingUsernameTimeouts.set(streamId, timeout);
|
|
772
|
-
return;
|
|
773
|
-
}
|
|
774
|
-
// Clean up pending state
|
|
775
|
-
this.pendingUsernames.delete(streamId);
|
|
776
|
-
this.pendingUsernameTimeouts.delete(streamId);
|
|
777
|
-
try {
|
|
778
|
-
const encryptedData = await this.cryptoBackend.encryptGroupEvent(streamId, new TextEncoder().encode(username), this.defaultGroupEncryptionAlgorithm);
|
|
779
|
-
encryptedData.checksum = usernameChecksum(username, streamId);
|
|
780
|
-
await this.makeEventAndAddToStream(streamId, make_MemberPayload_Username(encryptedData), { method: 'username' });
|
|
781
|
-
}
|
|
782
|
-
catch (err) {
|
|
783
|
-
stream.view.getMemberMetadata().usernames.resetLocalUsername(this.userId);
|
|
784
|
-
// Clean up pending state on error
|
|
785
|
-
this.pendingUsernames.delete(streamId);
|
|
786
|
-
this.pendingUsernameTimeouts.delete(streamId);
|
|
787
|
-
throw err;
|
|
788
|
-
}
|
|
789
|
-
}
|
|
790
|
-
async setPendingUsernames() {
|
|
791
|
-
await Promise.all(Array.from(this.pendingUsernames.entries()).map(([streamId, pendingUsername]) => {
|
|
792
|
-
this.pendingUsernames.delete(streamId);
|
|
793
|
-
return this.setUsername(streamId, pendingUsername);
|
|
794
|
-
}));
|
|
795
|
-
}
|
|
796
|
-
async setEnsAddress(streamId, walletAddress) {
|
|
797
|
-
check(isDefined(this.cryptoBackend));
|
|
798
|
-
const bytes = typeof walletAddress === 'string' ? addressFromUserId(walletAddress) : walletAddress;
|
|
799
|
-
await this.makeEventAndAddToStream(streamId, make_MemberPayload_EnsAddress(bytes), {
|
|
800
|
-
method: 'ensAddress',
|
|
801
|
-
});
|
|
802
|
-
}
|
|
803
|
-
async setNft(streamId, tokenId, chainId, contractAddress) {
|
|
804
|
-
const payload = tokenId.length > 0
|
|
805
|
-
? create(MemberPayload_NftSchema, {
|
|
806
|
-
chainId: chainId,
|
|
807
|
-
contractAddress: bin_fromHexString(contractAddress),
|
|
808
|
-
tokenId: bin_fromString(tokenId),
|
|
809
|
-
})
|
|
810
|
-
: create(MemberPayload_NftSchema);
|
|
811
|
-
await this.makeEventAndAddToStream(streamId, make_MemberPayload_Nft(payload), {
|
|
812
|
-
method: 'nft',
|
|
813
|
-
});
|
|
814
|
-
}
|
|
815
625
|
async getPersistedEvent(streamId, eventId) {
|
|
816
626
|
const timelineEvent = this.streamsView.timelinesView.value.timelines[streamId]?.find((e) => e.eventId === eventId);
|
|
817
627
|
if (!timelineEvent) {
|
|
@@ -865,11 +675,6 @@ export class Client extends EventEmitter {
|
|
|
865
675
|
});
|
|
866
676
|
return result;
|
|
867
677
|
}
|
|
868
|
-
isUsernameAvailable(streamId, username) {
|
|
869
|
-
const stream = this.streams.get(streamId);
|
|
870
|
-
check(isDefined(stream), 'stream not found');
|
|
871
|
-
return (stream.view.getMemberMetadata().usernames.cleartextUsernameAvailable(username) ?? false);
|
|
872
|
-
}
|
|
873
678
|
async waitForStream(inStreamId, opts) {
|
|
874
679
|
this.logCall('waitForStream', inStreamId);
|
|
875
680
|
const timeoutMs = opts?.timeoutMs ?? getMaxTimeoutMs(this.rpcClient.opts);
|
|
@@ -1054,7 +859,7 @@ export class Client extends EventEmitter {
|
|
|
1054
859
|
};
|
|
1055
860
|
onInvitedToStream = async (streamId) => {
|
|
1056
861
|
this.logEvent('onInvitedToStream', streamId);
|
|
1057
|
-
if (
|
|
862
|
+
if (isGDMChannelStreamId(streamId)) {
|
|
1058
863
|
await this.initStream(streamId);
|
|
1059
864
|
}
|
|
1060
865
|
};
|
|
@@ -1062,39 +867,7 @@ export class Client extends EventEmitter {
|
|
|
1062
867
|
this.logEvent('onLeftStream', streamId);
|
|
1063
868
|
return await this.streams.removeStreamFromSync(streamId);
|
|
1064
869
|
};
|
|
1065
|
-
onStreamUpToDate = (
|
|
1066
|
-
// we're migrating away from the old megolm based encryption to the new `grpaes` encryption,
|
|
1067
|
-
// this is to avoid too many active crypto sessions active in the same stream
|
|
1068
|
-
// this function will:
|
|
1069
|
-
// - check if the user's username is encrypted with the old algorithm
|
|
1070
|
-
// - check if the user has a hybrid session ready to go (hasHybridSession)
|
|
1071
|
-
// - re-encrypt the username with the new algorithm
|
|
1072
|
-
const updateUsernameEncryptionIfNeeded = async () => {
|
|
1073
|
-
if (!isSpaceStreamId(streamId)) {
|
|
1074
|
-
return;
|
|
1075
|
-
}
|
|
1076
|
-
const hasHybridSession = (await this.cryptoBackend?.hasHybridSession(streamId)) ?? false;
|
|
1077
|
-
if (!hasHybridSession) {
|
|
1078
|
-
return;
|
|
1079
|
-
}
|
|
1080
|
-
const stream = this.stream(streamId);
|
|
1081
|
-
if (!stream) {
|
|
1082
|
-
return;
|
|
1083
|
-
}
|
|
1084
|
-
const currentUsernameEncryptedData = stream.view.membershipContent.memberMetadata.usernames.currentUsernameEncryptedData;
|
|
1085
|
-
if (!currentUsernameEncryptedData ||
|
|
1086
|
-
currentUsernameEncryptedData.algorithm ===
|
|
1087
|
-
GroupEncryptionAlgorithmId.HybridGroupEncryption) {
|
|
1088
|
-
return;
|
|
1089
|
-
}
|
|
1090
|
-
const currentUsername = stream.view.membershipContent.memberMetadata.usernames.info(this.userId);
|
|
1091
|
-
if (!currentUsername || currentUsername.username.length === 0) {
|
|
1092
|
-
return;
|
|
1093
|
-
}
|
|
1094
|
-
await this.setUsername(streamId, currentUsername.username);
|
|
1095
|
-
};
|
|
1096
|
-
void updateUsernameEncryptionIfNeeded();
|
|
1097
|
-
};
|
|
870
|
+
onStreamUpToDate = (_streamId) => { };
|
|
1098
871
|
startSync() {
|
|
1099
872
|
this.syncedStreamsExtensions.setStartSyncRequested(true);
|
|
1100
873
|
}
|
|
@@ -1157,23 +930,7 @@ export class Client extends EventEmitter {
|
|
|
1157
930
|
throw new Error('failed to encrypt message');
|
|
1158
931
|
}
|
|
1159
932
|
message.refEventId = getRefEventIdFromChannelMessage(payload);
|
|
1160
|
-
if (
|
|
1161
|
-
return this.makeEventAndAddToStream(streamId, make_ChannelPayload_Message(message), {
|
|
1162
|
-
method: 'sendMessage',
|
|
1163
|
-
localId,
|
|
1164
|
-
cleartext,
|
|
1165
|
-
tags,
|
|
1166
|
-
});
|
|
1167
|
-
}
|
|
1168
|
-
else if (isDMChannelStreamId(streamId)) {
|
|
1169
|
-
return this.makeEventAndAddToStream(streamId, make_DMChannelPayload_Message(message), {
|
|
1170
|
-
method: 'sendMessageDM',
|
|
1171
|
-
localId,
|
|
1172
|
-
cleartext,
|
|
1173
|
-
tags,
|
|
1174
|
-
});
|
|
1175
|
-
}
|
|
1176
|
-
else if (isGDMChannelStreamId(streamId)) {
|
|
933
|
+
if (isGDMChannelStreamId(streamId)) {
|
|
1177
934
|
return this.makeEventAndAddToStream(streamId, make_GDMChannelPayload_Message(message), {
|
|
1178
935
|
method: 'sendMessageGDM',
|
|
1179
936
|
localId,
|
|
@@ -1181,9 +938,7 @@ export class Client extends EventEmitter {
|
|
|
1181
938
|
tags,
|
|
1182
939
|
});
|
|
1183
940
|
}
|
|
1184
|
-
|
|
1185
|
-
throw new Error(`invalid streamId: ${streamId}`);
|
|
1186
|
-
}
|
|
941
|
+
throw new Error(`invalid streamId: ${streamId}`);
|
|
1187
942
|
}
|
|
1188
943
|
async sendChannelMessage_Text(streamId, payload, opts) {
|
|
1189
944
|
const { content, ...options } = payload;
|
|
@@ -1230,6 +985,21 @@ export class Client extends EventEmitter {
|
|
|
1230
985
|
},
|
|
1231
986
|
}, opts);
|
|
1232
987
|
}
|
|
988
|
+
async sendChannelMessage_ConversationSeedResponse(streamId, payload, opts) {
|
|
989
|
+
const { content, ...options } = payload;
|
|
990
|
+
return this.sendChannelMessage(streamId, {
|
|
991
|
+
payload: {
|
|
992
|
+
case: 'post',
|
|
993
|
+
value: {
|
|
994
|
+
...options,
|
|
995
|
+
content: {
|
|
996
|
+
case: 'conversationSeedResponse',
|
|
997
|
+
value: content,
|
|
998
|
+
},
|
|
999
|
+
},
|
|
1000
|
+
},
|
|
1001
|
+
}, opts);
|
|
1002
|
+
}
|
|
1233
1003
|
async sendMediaPayload(creationCookie, last, data, chunkIndex, iv) {
|
|
1234
1004
|
const payload = make_MediaPayload_Chunk({
|
|
1235
1005
|
data: data,
|
|
@@ -1480,16 +1250,6 @@ export class Client extends EventEmitter {
|
|
|
1480
1250
|
async leaveStream(streamId) {
|
|
1481
1251
|
this.logCall('leaveStream', streamId);
|
|
1482
1252
|
check(isDefined(this.userStreamId));
|
|
1483
|
-
if (isSpaceStreamId(streamId)) {
|
|
1484
|
-
const channelIds = Object.keys(this.stream(streamId)?.view.spaceContent.spaceChannelsMetadata ?? {});
|
|
1485
|
-
const userStream = this.stream(this.userStreamId);
|
|
1486
|
-
for (const channelId of channelIds) {
|
|
1487
|
-
if (userStream?.view.userContent.streamMemberships[channelId]?.op ===
|
|
1488
|
-
MembershipOp.SO_JOIN) {
|
|
1489
|
-
await this.leaveStream(channelId);
|
|
1490
|
-
}
|
|
1491
|
-
}
|
|
1492
|
-
}
|
|
1493
1253
|
return this.makeEventAndAddToStream(this.userStreamId, make_UserPayload_UserMembership({
|
|
1494
1254
|
op: MembershipOp.SO_LEAVE,
|
|
1495
1255
|
streamId: streamIdAsBytes(streamId),
|
|
@@ -1498,25 +1258,6 @@ export class Client extends EventEmitter {
|
|
|
1498
1258
|
async removeUser(streamId, userId) {
|
|
1499
1259
|
check(isDefined(this.userStreamId));
|
|
1500
1260
|
this.logCall('removeUser', streamId, userId);
|
|
1501
|
-
if (isSpaceStreamId(streamId)) {
|
|
1502
|
-
const channelIds = Object.keys(this.stream(streamId)?.view.spaceContent.spaceChannelsMetadata ?? {});
|
|
1503
|
-
const userStreamId = makeUserStreamId(userId);
|
|
1504
|
-
const userStream = await this.getStream(userStreamId);
|
|
1505
|
-
for (const channelId of channelIds) {
|
|
1506
|
-
if (userStream.userContent.streamMemberships[channelId]?.op === MembershipOp.SO_JOIN) {
|
|
1507
|
-
try {
|
|
1508
|
-
await this.removeUser(channelId, userId);
|
|
1509
|
-
}
|
|
1510
|
-
catch (error) {
|
|
1511
|
-
this.logError('Failed to remove user from channel', {
|
|
1512
|
-
channelId,
|
|
1513
|
-
userId,
|
|
1514
|
-
error,
|
|
1515
|
-
});
|
|
1516
|
-
}
|
|
1517
|
-
}
|
|
1518
|
-
}
|
|
1519
|
-
}
|
|
1520
1261
|
return this.makeEventAndAddToStream(this.userStreamId, make_UserPayload_UserMembershipAction({
|
|
1521
1262
|
op: MembershipOp.SO_LEAVE,
|
|
1522
1263
|
userId: addressFromUserId(userId),
|
|
@@ -1976,6 +1717,50 @@ export class Client extends EventEmitter {
|
|
|
1976
1717
|
check(isDefined(this.cryptoBackend), 'crypto backend not initialized');
|
|
1977
1718
|
return this.cryptoBackend.ensureOutboundSession(streamId, this.defaultGroupEncryptionAlgorithm, opts);
|
|
1978
1719
|
}
|
|
1720
|
+
async exportInviteEncryptionData(inStreamId) {
|
|
1721
|
+
const streamId = streamIdAsString(inStreamId);
|
|
1722
|
+
await this.ensureOutboundSession(streamId);
|
|
1723
|
+
check(isDefined(this.cryptoBackend), 'crypto backend not initialized');
|
|
1724
|
+
const sessionIds = await this.cryptoBackend.getGroupSessionIds(streamId);
|
|
1725
|
+
const sessions = [];
|
|
1726
|
+
for (const sessionId of sessionIds) {
|
|
1727
|
+
const session = await this.cryptoBackend.exportGroupSession(streamId, sessionId);
|
|
1728
|
+
if (session) {
|
|
1729
|
+
sessions.push(session);
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
check(sessions.length > 0, 'no group sessions found for stream');
|
|
1733
|
+
check(new Set(sessions.map((session) => session.algorithm)).size === 1, 'group sessions must all use the same algorithm');
|
|
1734
|
+
return {
|
|
1735
|
+
streamId: streamIdAsBytes(streamId),
|
|
1736
|
+
algorithm: sessions[0].algorithm,
|
|
1737
|
+
sessions: sessions.map((session) => ({
|
|
1738
|
+
sessionId: session.sessionId,
|
|
1739
|
+
sessionKey: session.sessionKey,
|
|
1740
|
+
})),
|
|
1741
|
+
};
|
|
1742
|
+
}
|
|
1743
|
+
async importInviteEncryptionData(inStreamId, inviteEncryptionData) {
|
|
1744
|
+
const streamId = streamIdAsString(inStreamId);
|
|
1745
|
+
check(isDefined(this.cryptoBackend), 'crypto backend not initialized');
|
|
1746
|
+
check(isDefined(inviteEncryptionData), 'invite encryption data is required');
|
|
1747
|
+
const inviteStreamId = streamIdAsString(inviteEncryptionData.streamId);
|
|
1748
|
+
check(inviteStreamId === streamId, 'invite encryption stream id must match target stream');
|
|
1749
|
+
check(inviteEncryptionData.sessions.length > 0, 'invite encryption data must contain at least one session');
|
|
1750
|
+
const parsedAlgorithm = parseGroupEncryptionAlgorithmId(inviteEncryptionData.algorithm);
|
|
1751
|
+
check(parsedAlgorithm.kind === 'matched', `unsupported invite encryption algorithm: ${inviteEncryptionData.algorithm}`);
|
|
1752
|
+
const sessions = inviteEncryptionData.sessions.map((session, index) => {
|
|
1753
|
+
check(session.sessionId !== '', `invite encryption session ${index} is missing sessionId`);
|
|
1754
|
+
check(session.sessionKey !== '', `invite encryption session ${index} is missing sessionKey`);
|
|
1755
|
+
return {
|
|
1756
|
+
streamId,
|
|
1757
|
+
sessionId: session.sessionId,
|
|
1758
|
+
sessionKey: session.sessionKey,
|
|
1759
|
+
algorithm: parsedAlgorithm.value,
|
|
1760
|
+
};
|
|
1761
|
+
});
|
|
1762
|
+
await this.cryptoBackend.importSessionKeys(streamId, sessions);
|
|
1763
|
+
}
|
|
1979
1764
|
/**
|
|
1980
1765
|
* decrypts and updates the decrypted event
|
|
1981
1766
|
*/
|