@towns-protocol/sdk 0.0.225 → 0.0.227
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.
|
@@ -4,12 +4,15 @@
|
|
|
4
4
|
import { createTownWithRequirements, expectUserCanJoin, expectUserCanJoinChannel, getXchainConfigForTesting, linkWallets, waitFor, } from '../../testUtils';
|
|
5
5
|
import { NoopRuleData } from '@towns-protocol/web3';
|
|
6
6
|
import { makeUserStreamId } from '../../../id';
|
|
7
|
-
import { MembershipOp } from '@towns-protocol/proto';
|
|
7
|
+
import { MembershipOp, MembershipReason } from '@towns-protocol/proto';
|
|
8
8
|
import { ethers } from 'ethers';
|
|
9
|
-
const SHORT_MEMBERSHIP_DURATION =
|
|
10
|
-
const WAIT_TIME = SHORT_MEMBERSHIP_DURATION * 1_000 +
|
|
9
|
+
const SHORT_MEMBERSHIP_DURATION = 20; // seconds
|
|
10
|
+
const WAIT_TIME = SHORT_MEMBERSHIP_DURATION * 1_000 + 500;
|
|
11
|
+
// this test is long because it has to wait for the membership to expire in real time
|
|
12
|
+
// but the membership duration has to be long enough such that other actions/assertions can be made
|
|
13
|
+
// it tests both node entitlement checks for expired memberships, as well as client entitlement checks via space dapp
|
|
11
14
|
describe('membershipRenewals', () => {
|
|
12
|
-
test('expired membership is not allowed to join', async () => {
|
|
15
|
+
test.concurrent('expired membership is not allowed to join', async () => {
|
|
13
16
|
const { spaceId, channelId, alice, bob, aliceSpaceDapp, aliceProvider, alicesWallet } = await createTownWithRequirements({
|
|
14
17
|
everyone: true,
|
|
15
18
|
users: [],
|
|
@@ -20,18 +23,18 @@ describe('membershipRenewals', () => {
|
|
|
20
23
|
// wait for membership to expire
|
|
21
24
|
await new Promise((resolve) => setTimeout(resolve, WAIT_TIME));
|
|
22
25
|
await alice.leaveStream(spaceId);
|
|
23
|
-
|
|
26
|
+
const aliceWallets = await aliceSpaceDapp.getLinkedWallets(alicesWallet.address);
|
|
27
|
+
const membershipStatus = await aliceSpaceDapp.getMembershipStatus(spaceId, aliceWallets);
|
|
28
|
+
expect(membershipStatus.isMember).toBe(true);
|
|
29
|
+
expect(membershipStatus.isExpired).toBe(true);
|
|
24
30
|
const entitledWallet = await aliceSpaceDapp.getEntitledWalletForJoiningSpace(spaceId, alicesWallet.address, getXchainConfigForTesting());
|
|
25
|
-
expect(entitledWallet).
|
|
26
|
-
// same here
|
|
27
|
-
const hasMembership = await aliceSpaceDapp.hasSpaceMembership(spaceId, entitledWallet);
|
|
28
|
-
expect(hasMembership).toBe(true);
|
|
31
|
+
expect(entitledWallet).toBeUndefined();
|
|
29
32
|
await expect(alice.joinStream(spaceId)).rejects.toThrow(/7:PERMISSION_DENIED/);
|
|
30
33
|
// Clean up
|
|
31
34
|
await alice.stopSync();
|
|
32
35
|
await bob.stopSync();
|
|
33
36
|
});
|
|
34
|
-
test('user with expired membership is bounced from a channel after scrub is triggered', async () => {
|
|
37
|
+
test.concurrent('user with expired membership is bounced from a channel after scrub is triggered', async () => {
|
|
35
38
|
const { spaceId, channelId, alice, carol, aliceSpaceDapp, aliceProvider, alicesWallet, carolSpaceDapp, carolProvider, carolsWallet, } = await createTownWithRequirements({
|
|
36
39
|
everyone: true,
|
|
37
40
|
users: [],
|
|
@@ -47,15 +50,17 @@ describe('membershipRenewals', () => {
|
|
|
47
50
|
// should be booted from the stream since her membership has expired
|
|
48
51
|
await expect(carol.joinStream(channelId)).resolves.not.toThrow();
|
|
49
52
|
const userStreamView = (await alice.waitForStream(makeUserStreamId(alice.userId))).view;
|
|
53
|
+
const membership = userStreamView.userContent.getMembership(channelId);
|
|
50
54
|
// Wait for alice's user stream to have the leave event
|
|
51
55
|
await waitFor(async () => {
|
|
52
|
-
|
|
56
|
+
expect(membership?.op).toBe(MembershipOp.SO_LEAVE);
|
|
57
|
+
expect(membership?.reason).toBe(MembershipReason.MR_EXPIRED);
|
|
53
58
|
});
|
|
54
59
|
// Clean up
|
|
55
60
|
await alice.stopSync();
|
|
56
61
|
await carol.stopSync();
|
|
57
62
|
});
|
|
58
|
-
test('user with unexpired membership is not bounced from a channel after scrub is triggered', async () => {
|
|
63
|
+
test.concurrent('user with unexpired membership is not bounced from a channel after scrub is triggered', async () => {
|
|
59
64
|
const { spaceId, channelId, alice, carol, aliceSpaceDapp, aliceProvider, alicesWallet, carolSpaceDapp, carolProvider, carolsWallet, } = await createTownWithRequirements({
|
|
60
65
|
everyone: true,
|
|
61
66
|
users: [],
|
|
@@ -80,18 +85,66 @@ describe('membershipRenewals', () => {
|
|
|
80
85
|
expect(timeUntilExpiration).toBeLessThan(0);
|
|
81
86
|
// now mint a membership for the eoa wallet, which is linked to alice - mint only, not joining stream
|
|
82
87
|
await aliceSpaceDapp.joinSpace(spaceId, eoaWallet.address, aliceProvider.wallet);
|
|
88
|
+
const aliceWallets = await aliceSpaceDapp.getLinkedWallets(alicesWallet.address);
|
|
89
|
+
const membershipStatus = await aliceSpaceDapp.getMembershipStatus(spaceId, aliceWallets);
|
|
90
|
+
expect(membershipStatus.isMember).toBe(true);
|
|
91
|
+
expect(membershipStatus.isExpired).toBe(false);
|
|
92
|
+
const entitledWallet = await aliceSpaceDapp.getEntitledWalletForJoiningSpace(spaceId, alicesWallet.address, getXchainConfigForTesting());
|
|
93
|
+
expect(entitledWallet).toBeDefined();
|
|
83
94
|
await expectUserCanJoin(spaceId, channelId, 'carol', carol, carolSpaceDapp, carolsWallet.address, carolProvider.wallet);
|
|
84
95
|
// When carol's join event is added to the stream, it should trigger a scrub, and Alice
|
|
85
96
|
// should not be booted from the stream since her she has an additional token that is not expired
|
|
86
97
|
await expect(carol.joinStream(channelId)).resolves.not.toThrow();
|
|
87
98
|
const userStreamView = (await alice.waitForStream(makeUserStreamId(alice.userId))).view;
|
|
88
|
-
//
|
|
89
|
-
await
|
|
90
|
-
|
|
91
|
-
|
|
99
|
+
// Wait for alice's user stream to have the join event
|
|
100
|
+
await waitFor(async () => {
|
|
101
|
+
return expect(userStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(true);
|
|
102
|
+
});
|
|
92
103
|
// Clean up
|
|
93
104
|
await alice.stopSync();
|
|
94
105
|
await carol.stopSync();
|
|
95
106
|
});
|
|
107
|
+
test.concurrent('(BASE only) user can renew membership', async () => {
|
|
108
|
+
const _MEMBERSHIP_DURATION = 10;
|
|
109
|
+
const { spaceId, aliceSpaceDapp, aliceProvider, alicesWallet } = await createTownWithRequirements({
|
|
110
|
+
everyone: true,
|
|
111
|
+
users: [],
|
|
112
|
+
ruleData: NoopRuleData,
|
|
113
|
+
duration: _MEMBERSHIP_DURATION,
|
|
114
|
+
});
|
|
115
|
+
// Check that the local evaluation of the user's entitlements for joining the space
|
|
116
|
+
// passes.
|
|
117
|
+
const entitledWallet = await aliceSpaceDapp.getEntitledWalletForJoiningSpace(spaceId, alicesWallet.address, getXchainConfigForTesting());
|
|
118
|
+
expect(entitledWallet).toBeDefined();
|
|
119
|
+
const { issued } = await aliceSpaceDapp.joinSpace(spaceId, alicesWallet.address, aliceProvider.wallet);
|
|
120
|
+
expect(issued).toBe(true);
|
|
121
|
+
// wait for membership to expire
|
|
122
|
+
await new Promise((resolve) => setTimeout(resolve, _MEMBERSHIP_DURATION * 1_000 + 500));
|
|
123
|
+
const aliceWallets = await aliceSpaceDapp.getLinkedWallets(alicesWallet.address);
|
|
124
|
+
const membershipStatus = await aliceSpaceDapp.getMembershipStatus(spaceId, aliceWallets);
|
|
125
|
+
expect(membershipStatus.isMember).toBe(true);
|
|
126
|
+
expect(membershipStatus.isExpired).toBe(true);
|
|
127
|
+
const entitledWalletAfterExpiry = await aliceSpaceDapp.getEntitledWalletForJoiningSpace(spaceId, alicesWallet.address, getXchainConfigForTesting());
|
|
128
|
+
expect(entitledWalletAfterExpiry).toBeUndefined();
|
|
129
|
+
const space = aliceSpaceDapp.getSpace(spaceId);
|
|
130
|
+
const tokenId = membershipStatus.tokenId;
|
|
131
|
+
expect(tokenId).toBeDefined();
|
|
132
|
+
if (!tokenId || !space) {
|
|
133
|
+
throw new Error('TokenId or space not found');
|
|
134
|
+
}
|
|
135
|
+
const tx = await space.renewMembership({
|
|
136
|
+
tokenId,
|
|
137
|
+
signer: aliceProvider.wallet,
|
|
138
|
+
});
|
|
139
|
+
const receipt = await tx.wait();
|
|
140
|
+
expect(receipt.status).toBe(1);
|
|
141
|
+
const membershipStatusAfterRenewal = await space.getMembershipStatus(aliceWallets);
|
|
142
|
+
expect(membershipStatusAfterRenewal.isMember).toBe(true);
|
|
143
|
+
expect(membershipStatusAfterRenewal.isExpired).toBe(false);
|
|
144
|
+
// wait for caches to be invalidated
|
|
145
|
+
await new Promise((resolve) => setTimeout(resolve, 5_000));
|
|
146
|
+
const entitledWalletAfterRenewal = await aliceSpaceDapp.getEntitledWalletForJoiningSpace(spaceId, alicesWallet.address, getXchainConfigForTesting());
|
|
147
|
+
expect(entitledWalletAfterRenewal).toBeDefined();
|
|
148
|
+
});
|
|
96
149
|
});
|
|
97
150
|
//# sourceMappingURL=membershipRenewals.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membershipRenewals.test.js","sourceRoot":"","sources":["../../../../src/tests/multi/entitlements/membershipRenewals.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,WAAW,EACX,OAAO,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"membershipRenewals.test.js","sourceRoot":"","sources":["../../../../src/tests/multi/entitlements/membershipRenewals.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* @group main
|
|
3
3
|
*/
|
|
4
4
|
import { assert } from '../../check';
|
|
5
|
-
import { makeTestClient } from '../testUtils';
|
|
5
|
+
import { makeTestClient, makeUniqueSpaceStreamId } from '../testUtils';
|
|
6
6
|
import { SessionKeysSchema } from '@towns-protocol/proto';
|
|
7
|
-
import { dlog } from '@towns-protocol/dlog';
|
|
8
7
|
import { create, fromJsonString, toJsonString } from '@bufbuild/protobuf';
|
|
8
|
+
import { dlog } from '@towns-protocol/dlog';
|
|
9
|
+
import { GroupEncryptionAlgorithmId } from '@towns-protocol/encryption';
|
|
9
10
|
const log = dlog('test:clientCrypto');
|
|
10
11
|
describe('clientCrypto', () => {
|
|
11
12
|
let bobsClient;
|
|
@@ -60,5 +61,18 @@ describe('clientCrypto', () => {
|
|
|
60
61
|
expect(keys2.keys[0]).toEqual(message);
|
|
61
62
|
}
|
|
62
63
|
});
|
|
64
|
+
test('client can check if a hybrid session exists', async () => {
|
|
65
|
+
await expect(bobsClient.initializeUser()).resolves.not.toThrow();
|
|
66
|
+
if (!bobsClient.cryptoBackend) {
|
|
67
|
+
throw new Error('bob.cryptoBackend is undefined');
|
|
68
|
+
}
|
|
69
|
+
const streamId = makeUniqueSpaceStreamId();
|
|
70
|
+
await bobsClient.createSpace(streamId);
|
|
71
|
+
let hasSession = await bobsClient.cryptoBackend.hasHybridSession(streamId);
|
|
72
|
+
expect(hasSession).toBe(false);
|
|
73
|
+
await bobsClient.cryptoBackend.ensureOutboundSession(streamId, GroupEncryptionAlgorithmId.HybridGroupEncryption, { awaitInitialShareSession: false });
|
|
74
|
+
hasSession = await bobsClient.cryptoBackend.hasHybridSession(streamId);
|
|
75
|
+
expect(hasSession).toBe(true);
|
|
76
|
+
});
|
|
63
77
|
});
|
|
64
78
|
//# sourceMappingURL=clientCrypto.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientCrypto.test.js","sourceRoot":"","sources":["../../../src/tests/multi_ne/clientCrypto.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"clientCrypto.test.js","sourceRoot":"","sources":["../../../src/tests/multi_ne/clientCrypto.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@towns-protocol/sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.227",
|
|
4
4
|
"packageManager": "yarn@3.8.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"@ethereumjs/util": "^8.0.1",
|
|
33
33
|
"@noble/curves": "^1.9.1",
|
|
34
34
|
"@noble/hashes": "^1.8.0",
|
|
35
|
-
"@towns-protocol/dlog": "^0.0.
|
|
36
|
-
"@towns-protocol/encryption": "^0.0.
|
|
37
|
-
"@towns-protocol/generated": "^0.0.
|
|
38
|
-
"@towns-protocol/proto": "^0.0.
|
|
39
|
-
"@towns-protocol/web3": "^0.0.
|
|
35
|
+
"@towns-protocol/dlog": "^0.0.227",
|
|
36
|
+
"@towns-protocol/encryption": "^0.0.227",
|
|
37
|
+
"@towns-protocol/generated": "^0.0.227",
|
|
38
|
+
"@towns-protocol/proto": "^0.0.227",
|
|
39
|
+
"@towns-protocol/web3": "^0.0.227",
|
|
40
40
|
"browser-or-node": "^3.0.0",
|
|
41
41
|
"debug": "^4.3.4",
|
|
42
42
|
"dexie": "^4.0.7",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"files": [
|
|
72
72
|
"/dist"
|
|
73
73
|
],
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "6aece8b3fcbc2bc02068b298251e4a1656926d58"
|
|
75
75
|
}
|