@towns-protocol/sdk
Version:
For more details, visit the following resources:
113 lines • 5.18 kB
JavaScript
import { makeUserSettingsStreamId, streamIdAsString, streamIdToBytes, userIdFromAddress, } from '../../id';
import { makeEvent } from '../../sign';
import { make_UserSettingsPayload_FullyReadMarkers, make_UserSettingsPayload_Inception, } from '../../types';
import { makeRandomUserContext, makeTestRpcClient, waitFor } from '../testUtils';
describe('streamRpcClientGetSince', () => {
let bobsContext;
let client;
let bobsUserId;
let bobsSettingsStreamId;
let cookie;
let settingsStream;
beforeAll(async () => {
bobsContext = await makeRandomUserContext();
client = await makeTestRpcClient();
bobsUserId = userIdFromAddress(bobsContext.creatorAddress);
bobsSettingsStreamId = streamIdToBytes(makeUserSettingsStreamId(bobsUserId));
const settingsStreamResp = await client.createStream({
events: [
await makeEvent(bobsContext, make_UserSettingsPayload_Inception({
streamId: bobsSettingsStreamId,
})),
],
streamId: bobsSettingsStreamId,
});
if (!settingsStreamResp.stream) {
throw new Error('No stream');
}
settingsStream = settingsStreamResp.stream;
if (!settingsStream.nextSyncCookie) {
throw new Error('No sync cookie');
}
cookie = settingsStream.nextSyncCookie;
});
test('should get the stream since the given sync cookie with no changes', async () => {
// fetch the stream since the given cookie
const streamSince = await client.getStream({
streamId: bobsSettingsStreamId,
syncCookie: cookie,
});
expect(streamSince.stream?.events.length).toBe(0);
expect(streamSince.stream?.miniblocks.length).toBe(0);
expect(streamSince.stream?.nextSyncCookie).toEqual(cookie);
});
test('should get the stream since the given sync cookie with a change', async () => {
for (let i = 0; i < 2; i++) {
await client.addEvent({
streamId: bobsSettingsStreamId,
event: await makeEvent(bobsContext, make_UserSettingsPayload_FullyReadMarkers({
streamId: bobsSettingsStreamId,
content: {
data: `foo ${i}`,
},
}), settingsStream.miniblocks.at(-1)?.header?.hash),
});
}
await waitFor(async () => {
// fetch the stream since the given cookie
const streamSince = await client.getStream({
streamId: bobsSettingsStreamId,
syncCookie: cookie,
});
// this tricky... we should get 2 events but sometimes they will be in a block
expect(streamSince.stream?.events.length).toBe(2);
expect(streamSince.stream?.miniblocks.length).toBe(0);
expect(streamSince.stream?.syncReset).toBe(false);
});
});
test('make block with 2 events', async () => {
await client.info({
debug: ['make_miniblock', streamIdAsString(bobsSettingsStreamId), 'true'],
});
await waitFor(async () => {
// eventually the block should get made and we should have miniblocks instead of events in the pool
const streamSince = await client.getStream({
streamId: bobsSettingsStreamId,
syncCookie: cookie,
});
expect(streamSince.stream?.events.length).toBeGreaterThanOrEqual(3); // all events since last cookie
expect(streamSince.stream?.miniblocks.length).toBe(0);
expect(streamSince.stream?.syncReset).toBe(false);
});
});
test('make a new snapshot', async () => {
// this test expects RecencyConstraintsGen to be 5
for (let i = 0; i < 6; i++) {
const resp = await client.getLastMiniblockHash({ streamId: bobsSettingsStreamId });
await client.addEvent({
streamId: bobsSettingsStreamId,
event: await makeEvent(bobsContext, make_UserSettingsPayload_FullyReadMarkers({
streamId: bobsSettingsStreamId,
content: {
data: `foo2 ${i}`,
},
}), resp.hash),
});
await client.info({
debug: ['make_miniblock', streamIdAsString(bobsSettingsStreamId), 'true'],
});
}
// eventually the stream will have a snapshot and the blocks will fall out of the stream view in the node
// so we will have an old sync cookie and get a sync reset
await waitFor(async () => {
const streamSince = await client.getStream({
streamId: bobsSettingsStreamId,
syncCookie: cookie,
});
expect(streamSince.stream?.events.length).toBe(0);
expect(streamSince.stream?.miniblocks.length).toBeGreaterThan(0);
expect(streamSince.stream?.syncReset).toBe(true);
}, { timeoutMS: 15000 });
});
});
//# sourceMappingURL=streamRpcClientGetSince.test.js.map