@pairlobby/server-core 0.31.0 → 0.33.0
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/README.md +1 -1
- package/dist/admission.d.ts +11 -0
- package/dist/admission.d.ts.map +1 -1
- package/dist/admission.js +18 -12
- package/dist/admission.js.map +1 -1
- package/dist/auto-close-store.d.ts +10 -8
- package/dist/auto-close-store.d.ts.map +1 -1
- package/dist/auto-close-store.js +35 -22
- package/dist/auto-close-store.js.map +1 -1
- package/dist/changes.d.ts +25 -11
- package/dist/changes.d.ts.map +1 -1
- package/dist/changes.js +81 -22
- package/dist/changes.js.map +1 -1
- package/dist/commit.d.ts +12 -0
- package/dist/commit.d.ts.map +1 -0
- package/dist/commit.js +33 -0
- package/dist/commit.js.map +1 -0
- package/dist/export.d.ts +12 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +72 -0
- package/dist/export.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/paging.d.ts +12 -0
- package/dist/paging.d.ts.map +1 -0
- package/dist/paging.js +32 -0
- package/dist/paging.js.map +1 -0
- package/dist/ports.d.ts +12 -5
- package/dist/ports.d.ts.map +1 -1
- package/dist/ports.js +12 -9
- package/dist/ports.js.map +1 -1
- package/dist/relay.d.ts +14 -4
- package/dist/relay.d.ts.map +1 -1
- package/dist/relay.js +79 -39
- package/dist/relay.js.map +1 -1
- package/dist/service.d.ts +53 -3
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +459 -207
- package/dist/service.js.map +1 -1
- package/dist/settings.d.ts +33 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +66 -0
- package/dist/settings.js.map +1 -0
- package/dist/store.d.ts +32 -13
- package/dist/store.d.ts.map +1 -1
- package/dist/turns.d.ts +1 -0
- package/dist/turns.d.ts.map +1 -1
- package/dist/turns.js +150 -117
- package/dist/turns.js.map +1 -1
- package/package.json +4 -3
- package/dist/request-backfill.d.ts +0 -3
- package/dist/request-backfill.d.ts.map +0 -1
- package/dist/request-backfill.js +0 -34
- package/dist/request-backfill.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# @pairlobby/server-core
|
|
2
2
|
|
|
3
|
-
Part of [PairLobby](https://github.com/PairLobby/app), built from `packages/server-core` at version 0.
|
|
3
|
+
Part of [PairLobby](https://github.com/PairLobby/app), built from `packages/server-core` at version 0.33.0. See that repository for documentation.
|
|
4
4
|
|
|
5
5
|
Licensed under the [Elastic License 2.0](LICENSE): you may use, copy, modify and distribute it, but may not offer it to others as a hosted or managed service.
|
package/dist/admission.d.ts
CHANGED
|
@@ -65,6 +65,17 @@ export type AdmissionOptions = {
|
|
|
65
65
|
/** Callers the limits do not apply to, such as this device on a relay that is not behind a proxy. */
|
|
66
66
|
exempt?: (request: Request, context: RequestContext) => boolean;
|
|
67
67
|
};
|
|
68
|
+
export type BucketState = {
|
|
69
|
+
tokens: number;
|
|
70
|
+
updatedAt: number;
|
|
71
|
+
};
|
|
72
|
+
export type BucketDecision = {
|
|
73
|
+
state: BucketState;
|
|
74
|
+
fullAt: number;
|
|
75
|
+
decision: RateDecision;
|
|
76
|
+
};
|
|
77
|
+
/** The same pure token-bucket decision for memory and durable stores. Persist state atomically before returning decision. */
|
|
78
|
+
export declare function takeTokens(previous: BucketState | undefined, cost: number, { perMinute, burst }: RateLimit, at: number): BucketDecision;
|
|
68
79
|
type MemoryRateLimiterOptions = {
|
|
69
80
|
now?: () => number;
|
|
70
81
|
maxKeys?: number;
|
package/dist/admission.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAE/C,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAE/D,eAAO,MAAM,qBAAqB,kFAAkF,CAAC;AAErH,gGAAgG;AAChG,eAAO,MAAM,kBAAkB,8CAA8C,CAAC;AAE9E,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,6CAA6C,CAAC;AAE9E,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE1D,wEAAwE;AACxE,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAK3E,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG;IAAC,EAAE,EAAE,IAAI,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAC,CAAC;AAE1E,2HAA2H;AAC3H,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5E;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,6CAA6C;IAC7C,yBAAyB,EAAE,MAAM,CAAC;IAClC,iGAAiG;IACjG,yBAAyB,EAAE,MAAM,CAAC;IAClC,+EAA+E;IAC/E,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sHAAsH;IACtH,+BAA+B,EAAE,MAAM,CAAC;IACxC,oDAAoD;IACpD,2BAA2B,EAAE,MAAM,CAAC;IACpC,8CAA8C;IAC9C,yBAAyB,EAAE,MAAM,CAAC;IAClC,wEAAwE;IACxE,wBAAwB,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,eAA+O,CAAC;AAEvR,MAAM,MAAM,gBAAgB,GAAG;IAC3B,gHAAgH;IAChH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iJAAiJ;IACjJ,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,mIAAmI;IACnI,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gKAAgK;IAChK,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,MAAM,GAAG,SAAS,CAAC;IAClF,qGAAqG;IACrG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;CACnE,CAAC;
|
|
1
|
+
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"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"}
|
package/dist/admission.js
CHANGED
|
@@ -10,29 +10,35 @@ export const TEAM_TOKEN_REFUSED = 'this is not the team token for this relay';
|
|
|
10
10
|
/** The same, on a relay where people log in with their own tokens. */
|
|
11
11
|
export const LOGIN_TOKEN_REFUSED = 'this token does not log in to this relay';
|
|
12
12
|
export const DEFAULT_ADMISSION_LIMITS = { createPerMinutePerAddress: 10, redeemPerMinutePerAddress: 20, redeemPerMinuteGlobal: 300, accountCheckPerMinutePerAddress: 30, directoryPerMinutePerMember: 60, contactPerMinutePerMember: 10, contactPerHourPerListing: 30 };
|
|
13
|
+
/** The same pure token-bucket decision for memory and durable stores. Persist state atomically before returning decision. */
|
|
14
|
+
export function takeTokens(previous, cost, { perMinute, burst = perMinute }, at) {
|
|
15
|
+
const perMs = perMinute / 60_000;
|
|
16
|
+
at = Math.max(at, previous?.updatedAt ?? at);
|
|
17
|
+
const tokens = previous ? Math.min(burst, previous.tokens + Math.max(0, at - previous.updatedAt) * perMs) : burst;
|
|
18
|
+
const ok = tokens >= cost;
|
|
19
|
+
const state = { tokens: ok ? tokens - cost : tokens, updatedAt: at };
|
|
20
|
+
return { state, fullAt: at + Math.ceil((burst - state.tokens) / perMs), decision: ok ? { ok: true } : { ok: false, retryAfterMs: Math.ceil((cost - tokens) / perMs) } };
|
|
21
|
+
}
|
|
13
22
|
/** Token buckets in memory: each key refills at its per-minute rate and holds at most its burst, one minute's worth unless said. */
|
|
14
23
|
export function memoryRateLimiter({ now = Date.now, maxKeys = 10_000 } = {}) {
|
|
15
24
|
const buckets = new Map();
|
|
16
25
|
return {
|
|
17
26
|
async take(key, cost, { perMinute, burst = perMinute }) {
|
|
18
27
|
const at = now();
|
|
19
|
-
|
|
20
|
-
const previous = buckets.get(key);
|
|
21
|
-
const tokens = previous ? Math.min(burst, previous.tokens + (at - previous.updatedAt) * perMs) : burst;
|
|
22
|
-
if (tokens < cost) {
|
|
23
|
-
buckets.set(key, { tokens, updatedAt: at });
|
|
24
|
-
return { ok: false, retryAfterMs: Math.ceil((cost - tokens) / perMs) };
|
|
25
|
-
}
|
|
26
|
-
buckets.set(key, { tokens: tokens - cost, updatedAt: at });
|
|
27
|
-
if (buckets.size > maxKeys) {
|
|
28
|
-
// A full bucket says nothing a fresh one would not, so forgetting it is free.
|
|
28
|
+
if (!buckets.has(key) && buckets.size >= maxKeys) {
|
|
29
29
|
for (const [name, bucket] of buckets) {
|
|
30
|
-
if (bucket.
|
|
30
|
+
if (bucket.fullAt <= at) {
|
|
31
31
|
buckets.delete(name);
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
+
if (buckets.size >= maxKeys) {
|
|
35
|
+
const next = Math.min(...[...buckets.values()].map((bucket) => bucket.fullAt));
|
|
36
|
+
return { ok: false, retryAfterMs: Math.max(1, next - at) };
|
|
37
|
+
}
|
|
34
38
|
}
|
|
35
|
-
|
|
39
|
+
const { state, fullAt, decision } = takeTokens(buckets.get(key)?.state, cost, { perMinute, burst }, at);
|
|
40
|
+
buckets.set(key, { state, fullAt });
|
|
41
|
+
return decision;
|
|
36
42
|
}
|
|
37
43
|
};
|
|
38
44
|
}
|
package/dist/admission.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admission.js","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,mFAAmF;AACnF,8DAA8D;AAE9D,OAAO,EAAC,aAAa,EAAE,YAAY,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAIhF,sGAAsG;AACtG,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAE/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,+EAA+E,CAAC;AAErH,gGAAgG;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAAG,2CAA2C,CAAC;AAE9E,sEAAsE;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,0CAA0C,CAAC;AAsC9E,MAAM,CAAC,MAAM,wBAAwB,GAAoB,EAAC,yBAAyB,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE,+BAA+B,EAAE,EAAE,EAAE,2BAA2B,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE,EAAE,wBAAwB,EAAE,EAAE,EAAC,CAAC;AA2BvR,
|
|
1
|
+
{"version":3,"file":"admission.js","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { HandoverRecord, InviteRecord, MessageRequest, ParticipantRecord, RequestPage, RoomEvent, RoomRecord } from '@pairlobby/protocol';
|
|
2
2
|
import type { Mutation, RoomView } from '@pairlobby/room-core';
|
|
3
|
-
import type { EventPage, FileStore, IdempotencyRecord, RoomStore } from './store.js';
|
|
3
|
+
import type { EventPage, FileStore, IdempotencyRecord, RoomHead, RoomLoadOptions, RoomStore } from './store.js';
|
|
4
4
|
type Clock = () => number;
|
|
5
5
|
type IdempotencyKey = Parameters<RoomStore['apply']>[1];
|
|
6
6
|
export declare class AutoCloseStore implements RoomStore {
|
|
@@ -10,26 +10,28 @@ export declare class AutoCloseStore implements RoomStore {
|
|
|
10
10
|
get files(): FileStore | undefined;
|
|
11
11
|
get unreceivedRequests(): RoomStore['unreceivedRequests'];
|
|
12
12
|
createRoom(room: RoomRecord, participant: ParticipantRecord, event: RoomEvent): Promise<void>;
|
|
13
|
-
|
|
13
|
+
roomHead(roomId: string): Promise<RoomHead | null>;
|
|
14
|
+
loadRoom(roomId: string, options?: RoomLoadOptions): Promise<RoomView | null>;
|
|
14
15
|
apply(mutation: Mutation, idempotency: IdempotencyKey): Promise<void>;
|
|
15
16
|
updateTurns(room: RoomRecord, requests: MessageRequest[], expectedRevision: number): Promise<void>;
|
|
16
|
-
readEvents(roomId: string, after: number, limit: number): Promise<EventPage>;
|
|
17
|
+
readEvents(roomId: string, after: number, limit: number, through?: number): Promise<EventPage>;
|
|
17
18
|
eventBySeq(roomId: string, seq: number): Promise<RoomEvent | null>;
|
|
18
19
|
eventById(roomId: string, eventId: string): Promise<RoomEvent | null>;
|
|
19
20
|
idempotencyRecord(roomId: string, key: string): Promise<IdempotencyRecord | null>;
|
|
20
|
-
putInvite(invite: InviteRecord): Promise<void>;
|
|
21
|
+
putInvite(invite: InviteRecord, expectedStateRevision?: number): Promise<void>;
|
|
21
22
|
inviteByDigest(digest: string): Promise<InviteRecord | null>;
|
|
22
|
-
reserveInvite(digest: string, attemptId: string, credentialHash: string, expectedOccupantId: string | null): Promise<InviteRecord | null>;
|
|
23
|
-
completeInvite(digest: string, participantId: string): Promise<void>;
|
|
23
|
+
reserveInvite(digest: string, attemptId: string, credentialHash: string, expectedOccupantId: string | null, expectedStateRevision?: number): Promise<InviteRecord | null>;
|
|
24
|
+
completeInvite(digest: string, participantId: string, attemptId?: string): Promise<void>;
|
|
24
25
|
participantByCredential(roomId: string, credentialHash: string): Promise<ParticipantRecord | null>;
|
|
25
26
|
handovers(roomId: string): Promise<HandoverRecord[]>;
|
|
26
27
|
messageRequest(roomId: string, eventId: string): Promise<MessageRequest | null>;
|
|
27
28
|
groupRequests(roomId: string, conversationId: string): Promise<MessageRequest[]>;
|
|
28
29
|
messageRequests(roomId: string, after: number, limit: number, recipientId?: string): Promise<RequestPage>;
|
|
29
|
-
|
|
30
|
+
pendingRequestCount(roomId: string): Promise<number>;
|
|
31
|
+
setLifecycle(roomId: string, lifecycle: RoomRecord['lifecycle'], expectedStateRevision?: number): Promise<void>;
|
|
30
32
|
deleteRoom(roomId: string): Promise<void>;
|
|
31
33
|
dueAutoCloses(now: number, limit: number): Promise<string[]>;
|
|
32
|
-
nextAutoCloseAt(): Promise<number | null>;
|
|
34
|
+
nextAutoCloseAt(now?: number): Promise<number | null>;
|
|
33
35
|
}
|
|
34
36
|
export {};
|
|
35
37
|
//# sourceMappingURL=auto-close-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-close-store.d.ts","sourceRoot":"","sources":["../src/auto-close-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAE7I,OAAO,KAAK,EAAC,QAAQ,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAC,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-close-store.d.ts","sourceRoot":"","sources":["../src/auto-close-store.ts"],"names":[],"mappings":"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"}
|
package/dist/auto-close-store.js
CHANGED
|
@@ -28,8 +28,16 @@ export class AutoCloseStore {
|
|
|
28
28
|
async createRoom(room, participant, event) {
|
|
29
29
|
await this.store.createRoom(refreshAutoClose(room, [participant], event, this.now()), participant, event);
|
|
30
30
|
}
|
|
31
|
-
async
|
|
32
|
-
|
|
31
|
+
async roomHead(roomId) {
|
|
32
|
+
const head = await this.store.roomHead(roomId);
|
|
33
|
+
if (head && autoCloseDue({ ...head, participants: [], handovers: [], controls: [] }, this.now())) {
|
|
34
|
+
const closed = await this.loadRoom(roomId, { handovers: false });
|
|
35
|
+
return closed ? { room: closed.room, earliestSeq: closed.earliestSeq } : null;
|
|
36
|
+
}
|
|
37
|
+
return head;
|
|
38
|
+
}
|
|
39
|
+
async loadRoom(roomId, options) {
|
|
40
|
+
let view = await this.store.loadRoom(roomId, options);
|
|
33
41
|
for (let attempt = 0; view && attempt < CLOSE_ATTEMPTS; attempt++) {
|
|
34
42
|
const reason = autoCloseDue(view, this.now());
|
|
35
43
|
if (!reason) {
|
|
@@ -40,27 +48,29 @@ export class AutoCloseStore {
|
|
|
40
48
|
}
|
|
41
49
|
catch (error) {
|
|
42
50
|
// Another write won the race; reload and decide again from what it left.
|
|
43
|
-
if (!(error instanceof ProtocolError)) {
|
|
51
|
+
if (!(error instanceof ProtocolError) || !['turn_conflict', 'server_unavailable'].includes(error.code)) {
|
|
44
52
|
throw error;
|
|
45
53
|
}
|
|
46
54
|
}
|
|
47
|
-
view = await this.store.loadRoom(roomId);
|
|
55
|
+
view = await this.store.loadRoom(roomId, options);
|
|
56
|
+
}
|
|
57
|
+
if (view && autoCloseDue(view, this.now())) {
|
|
58
|
+
throw new ProtocolError('server_unavailable', 'the room deadline could not be enforced; retry');
|
|
48
59
|
}
|
|
49
60
|
return view;
|
|
50
61
|
}
|
|
51
62
|
async apply(mutation, idempotency) {
|
|
52
|
-
const
|
|
53
|
-
const
|
|
63
|
+
const needsMembers = mutation.upsertParticipants.length > 0 || mutation.room.activeAgentsAndGuests === undefined;
|
|
64
|
+
const current = needsMembers ? await this.store.loadRoom(mutation.room.roomId, { handovers: false }) : null;
|
|
65
|
+
const members = needsMembers ? membersAfter(current?.participants ?? [], mutation.upsertParticipants) : undefined;
|
|
54
66
|
await this.store.apply({ ...mutation, room: refreshAutoClose(mutation.room, members, mutation.appendEvent, this.now()) }, idempotency);
|
|
55
67
|
}
|
|
56
68
|
async updateTurns(room, requests, expectedRevision) {
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
const kept = current ? { lastMessageAt: current.lastMessageAt ?? null, autoCloseArmed: current.autoCloseArmed ?? false, autoCloseAt: current.autoCloseAt ?? null } : {};
|
|
60
|
-
await this.store.updateTurns({ ...room, ...kept }, requests, expectedRevision);
|
|
69
|
+
// The complete state revision fences stale deadlines as well as stale turns.
|
|
70
|
+
await this.store.updateTurns(room, requests, expectedRevision);
|
|
61
71
|
}
|
|
62
|
-
readEvents(roomId, after, limit) {
|
|
63
|
-
return this.store.readEvents(roomId, after, limit);
|
|
72
|
+
readEvents(roomId, after, limit, through) {
|
|
73
|
+
return this.store.readEvents(roomId, after, limit, through);
|
|
64
74
|
}
|
|
65
75
|
eventBySeq(roomId, seq) {
|
|
66
76
|
return this.store.eventBySeq(roomId, seq);
|
|
@@ -71,17 +81,17 @@ export class AutoCloseStore {
|
|
|
71
81
|
idempotencyRecord(roomId, key) {
|
|
72
82
|
return this.store.idempotencyRecord(roomId, key);
|
|
73
83
|
}
|
|
74
|
-
putInvite(invite) {
|
|
75
|
-
return this.store.putInvite(invite);
|
|
84
|
+
putInvite(invite, expectedStateRevision) {
|
|
85
|
+
return this.store.putInvite(invite, expectedStateRevision);
|
|
76
86
|
}
|
|
77
87
|
inviteByDigest(digest) {
|
|
78
88
|
return this.store.inviteByDigest(digest);
|
|
79
89
|
}
|
|
80
|
-
reserveInvite(digest, attemptId, credentialHash, expectedOccupantId) {
|
|
81
|
-
return this.store.reserveInvite(digest, attemptId, credentialHash, expectedOccupantId);
|
|
90
|
+
reserveInvite(digest, attemptId, credentialHash, expectedOccupantId, expectedStateRevision) {
|
|
91
|
+
return this.store.reserveInvite(digest, attemptId, credentialHash, expectedOccupantId, expectedStateRevision);
|
|
82
92
|
}
|
|
83
|
-
completeInvite(digest, participantId) {
|
|
84
|
-
return this.store.completeInvite(digest, participantId);
|
|
93
|
+
completeInvite(digest, participantId, attemptId) {
|
|
94
|
+
return this.store.completeInvite(digest, participantId, attemptId);
|
|
85
95
|
}
|
|
86
96
|
participantByCredential(roomId, credentialHash) {
|
|
87
97
|
return this.store.participantByCredential(roomId, credentialHash);
|
|
@@ -98,8 +108,11 @@ export class AutoCloseStore {
|
|
|
98
108
|
messageRequests(roomId, after, limit, recipientId) {
|
|
99
109
|
return this.store.messageRequests(roomId, after, limit, recipientId);
|
|
100
110
|
}
|
|
101
|
-
|
|
102
|
-
return this.store.
|
|
111
|
+
pendingRequestCount(roomId) {
|
|
112
|
+
return this.store.pendingRequestCount(roomId);
|
|
113
|
+
}
|
|
114
|
+
setLifecycle(roomId, lifecycle, expectedStateRevision) {
|
|
115
|
+
return this.store.setLifecycle(roomId, lifecycle, expectedStateRevision);
|
|
103
116
|
}
|
|
104
117
|
deleteRoom(roomId) {
|
|
105
118
|
return this.store.deleteRoom(roomId);
|
|
@@ -107,8 +120,8 @@ export class AutoCloseStore {
|
|
|
107
120
|
dueAutoCloses(now, limit) {
|
|
108
121
|
return this.store.dueAutoCloses(now, limit);
|
|
109
122
|
}
|
|
110
|
-
nextAutoCloseAt() {
|
|
111
|
-
return this.store.nextAutoCloseAt();
|
|
123
|
+
nextAutoCloseAt(now) {
|
|
124
|
+
return this.store.nextAutoCloseAt(now);
|
|
112
125
|
}
|
|
113
126
|
}
|
|
114
127
|
//# sourceMappingURL=auto-close-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-close-store.js","sourceRoot":"","sources":["../src/auto-close-store.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,iFAAiF;AACjF,gFAAgF;AAChF,0DAA0D;AAE1D,OAAO,EAAC,aAAa,EAAE,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AASnF,yEAAyE;AACzE,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,SAAS,YAAY,CAAC,OAA4B,EAAE,OAA4B;IAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/F,KAAK,MAAM,WAAW,IAAI,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,cAAc;IACM;IAAmC;IAAhE,YAA6B,KAAgB,EAAmB,GAAU;QAA7C,UAAK,GAAL,KAAK,CAAW;QAAmB,QAAG,GAAH,GAAG,CAAO;IAAG,CAAC;IAE9E,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAgB,EAAE,WAA8B,EAAE,KAAgB;QAC/E,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QACzB,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-close-store.js","sourceRoot":"","sources":["../src/auto-close-store.ts"],"names":[],"mappings":"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"}
|
package/dist/changes.d.ts
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
import type { HandoverRecord, InviteRecord, MessageRequest, ParticipantRecord, RequestPage, RoomEvent, RoomRecord } from '@pairlobby/protocol';
|
|
2
2
|
import type { Mutation, RoomView } from '@pairlobby/room-core';
|
|
3
|
-
import type { EventPage, FileStore, IdempotencyRecord, RoomStore } from './store.js';
|
|
3
|
+
import type { EventPage, FileStore, IdempotencyRecord, RoomHead, RoomLoadOptions, RoomStore } from './store.js';
|
|
4
4
|
type IdempotencyKey = Parameters<RoomStore['apply']>[1];
|
|
5
5
|
/** A registered wait: `changed` settles true on a change, false at the deadline or on `cancel`. */
|
|
6
6
|
export type ChangeWait = {
|
|
7
7
|
changed: Promise<boolean>;
|
|
8
8
|
cancel: () => void;
|
|
9
9
|
};
|
|
10
|
+
export type CommittedChange = {
|
|
11
|
+
roomId: string;
|
|
12
|
+
stateRevision: number;
|
|
13
|
+
event?: RoomEvent;
|
|
14
|
+
};
|
|
15
|
+
/** A platform may await broker subscription before the first read. Publications happen only after a successful commit. */
|
|
16
|
+
export interface RoomChangeNotifier {
|
|
17
|
+
wait(roomId: string, ms: number, signal?: AbortSignal): ChangeWait | null | Promise<ChangeWait | null>;
|
|
18
|
+
changed(roomId: string): void | Promise<void>;
|
|
19
|
+
}
|
|
10
20
|
export type ChangeNotifierOptions = {
|
|
11
21
|
/** Waits held at once across the relay; past it, reads answer at once, as if polling. */
|
|
12
22
|
maxWaiters?: number;
|
|
13
23
|
};
|
|
14
|
-
export declare class ChangeNotifier {
|
|
24
|
+
export declare class ChangeNotifier implements RoomChangeNotifier {
|
|
15
25
|
private readonly waiters;
|
|
16
26
|
private readonly maxWaiters;
|
|
17
27
|
private held;
|
|
@@ -24,7 +34,7 @@ export declare class ChangeNotifier {
|
|
|
24
34
|
* write between the read and the wait still wakes it. Null when the relay already holds
|
|
25
35
|
* as many waits as it allows, or is shutting down.
|
|
26
36
|
*/
|
|
27
|
-
wait(roomId: string, ms: number): ChangeWait | null;
|
|
37
|
+
wait(roomId: string, ms: number, signal?: AbortSignal): ChangeWait | null;
|
|
28
38
|
changed(roomId: string): void;
|
|
29
39
|
/** Releases every wait, as unchanged, and refuses new ones: for shutting down. */
|
|
30
40
|
close(): void;
|
|
@@ -33,30 +43,34 @@ export declare class ChangeNotifier {
|
|
|
33
43
|
export declare class NotifyingStore implements RoomStore {
|
|
34
44
|
private readonly store;
|
|
35
45
|
private readonly notifier;
|
|
36
|
-
|
|
46
|
+
private readonly fileWrappers;
|
|
47
|
+
constructor(store: RoomStore, notifier: RoomChangeNotifier);
|
|
48
|
+
private publish;
|
|
37
49
|
get files(): FileStore | undefined;
|
|
38
50
|
get unreceivedRequests(): RoomStore['unreceivedRequests'];
|
|
39
51
|
createRoom(room: RoomRecord, participant: ParticipantRecord, event: RoomEvent): Promise<void>;
|
|
40
|
-
loadRoom(roomId: string): Promise<RoomView | null>;
|
|
52
|
+
loadRoom(roomId: string, options?: RoomLoadOptions): Promise<RoomView | null>;
|
|
53
|
+
roomHead(roomId: string): Promise<RoomHead | null>;
|
|
41
54
|
apply(mutation: Mutation, idempotency: IdempotencyKey): Promise<void>;
|
|
42
|
-
readEvents(roomId: string, after: number, limit: number): Promise<EventPage>;
|
|
55
|
+
readEvents(roomId: string, after: number, limit: number, through?: number): Promise<EventPage>;
|
|
43
56
|
eventBySeq(roomId: string, seq: number): Promise<RoomEvent | null>;
|
|
44
57
|
eventById(roomId: string, eventId: string): Promise<RoomEvent | null>;
|
|
45
58
|
idempotencyRecord(roomId: string, key: string): Promise<IdempotencyRecord | null>;
|
|
46
|
-
putInvite(invite: InviteRecord): Promise<void>;
|
|
59
|
+
putInvite(invite: InviteRecord, expectedStateRevision?: number): Promise<void>;
|
|
47
60
|
inviteByDigest(digest: string): Promise<InviteRecord | null>;
|
|
48
|
-
reserveInvite(digest: string, attemptId: string, credentialHash: string, expectedOccupantId: string | null): Promise<InviteRecord | null>;
|
|
49
|
-
completeInvite(digest: string, participantId: string): Promise<void>;
|
|
61
|
+
reserveInvite(digest: string, attemptId: string, credentialHash: string, expectedOccupantId: string | null, expectedStateRevision?: number): Promise<InviteRecord | null>;
|
|
62
|
+
completeInvite(digest: string, participantId: string, attemptId?: string): Promise<void>;
|
|
50
63
|
participantByCredential(roomId: string, credentialHash: string): Promise<ParticipantRecord | null>;
|
|
51
64
|
handovers(roomId: string): Promise<HandoverRecord[]>;
|
|
52
65
|
messageRequest(roomId: string, eventId: string): Promise<MessageRequest | null>;
|
|
53
66
|
groupRequests(roomId: string, conversationId: string): Promise<MessageRequest[]>;
|
|
54
67
|
updateTurns(room: RoomRecord, requests: MessageRequest[], expectedRevision: number): Promise<void>;
|
|
55
68
|
messageRequests(roomId: string, after: number, limit: number, recipientId?: string): Promise<RequestPage>;
|
|
56
|
-
|
|
69
|
+
pendingRequestCount(roomId: string): Promise<number>;
|
|
70
|
+
setLifecycle(roomId: string, lifecycle: RoomRecord['lifecycle'], expectedStateRevision?: number): Promise<void>;
|
|
57
71
|
deleteRoom(roomId: string): Promise<void>;
|
|
58
72
|
dueAutoCloses(now: number, limit: number): Promise<string[]>;
|
|
59
|
-
nextAutoCloseAt(): Promise<number | null>;
|
|
73
|
+
nextAutoCloseAt(now?: number): Promise<number | null>;
|
|
60
74
|
}
|
|
61
75
|
export {};
|
|
62
76
|
//# sourceMappingURL=changes.d.ts.map
|
package/dist/changes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAC7I,OAAO,KAAK,EAAC,QAAQ,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAC,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
|
package/dist/changes.js
CHANGED
|
@@ -18,11 +18,12 @@ export class ChangeNotifier {
|
|
|
18
18
|
* write between the read and the wait still wakes it. Null when the relay already holds
|
|
19
19
|
* as many waits as it allows, or is shutting down.
|
|
20
20
|
*/
|
|
21
|
-
wait(roomId, ms) {
|
|
22
|
-
if (this.closed || this.held >= this.maxWaiters) {
|
|
21
|
+
wait(roomId, ms, signal) {
|
|
22
|
+
if (this.closed || this.held >= this.maxWaiters || signal?.aborted) {
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
25
|
let settle = () => { };
|
|
26
|
+
const abort = () => settle(false);
|
|
26
27
|
const changed = new Promise((resolve) => {
|
|
27
28
|
let done = false;
|
|
28
29
|
const timer = setTimeout(() => settle(false), ms);
|
|
@@ -32,6 +33,7 @@ export class ChangeNotifier {
|
|
|
32
33
|
}
|
|
33
34
|
done = true;
|
|
34
35
|
clearTimeout(timer);
|
|
36
|
+
signal?.removeEventListener('abort', abort);
|
|
35
37
|
this.held--;
|
|
36
38
|
const room = this.waiters.get(roomId);
|
|
37
39
|
room?.delete(settle);
|
|
@@ -45,6 +47,10 @@ export class ChangeNotifier {
|
|
|
45
47
|
const room = this.waiters.get(roomId) ?? new Set();
|
|
46
48
|
room.add(settle);
|
|
47
49
|
this.waiters.set(roomId, room);
|
|
50
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
51
|
+
if (signal?.aborted) {
|
|
52
|
+
abort();
|
|
53
|
+
}
|
|
48
54
|
return { changed, cancel: () => settle(false) };
|
|
49
55
|
}
|
|
50
56
|
changed(roomId) {
|
|
@@ -66,29 +72,70 @@ export class ChangeNotifier {
|
|
|
66
72
|
export class NotifyingStore {
|
|
67
73
|
store;
|
|
68
74
|
notifier;
|
|
75
|
+
fileWrappers = new WeakMap();
|
|
69
76
|
constructor(store, notifier) {
|
|
70
77
|
this.store = store;
|
|
71
78
|
this.notifier = notifier;
|
|
72
79
|
}
|
|
80
|
+
async publish(roomId) {
|
|
81
|
+
try {
|
|
82
|
+
await this.notifier.changed(roomId);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// The state already committed. A timed read or reconnect recovers a missed hint.
|
|
86
|
+
console.error('pairlobby change notification failed');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
73
89
|
get files() {
|
|
74
|
-
|
|
90
|
+
const files = this.store.files;
|
|
91
|
+
if (!files) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
let wrapped = this.fileWrappers.get(files);
|
|
95
|
+
if (!wrapped) {
|
|
96
|
+
const publish = (roomId) => this.publish(roomId);
|
|
97
|
+
wrapped = new Proxy(files, {
|
|
98
|
+
get(target, property) {
|
|
99
|
+
const value = Reflect.get(target, property);
|
|
100
|
+
if (typeof value !== 'function') {
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
if (!['putFile', 'createUpload', 'completeUpload', 'cancelUpload', 'deleteUnattachedFiles'].includes(String(property))) {
|
|
104
|
+
return value.bind(target);
|
|
105
|
+
}
|
|
106
|
+
return async (...args) => {
|
|
107
|
+
const result = await Reflect.apply(value, target, args);
|
|
108
|
+
if (result !== false) {
|
|
109
|
+
const first = args[0];
|
|
110
|
+
await publish(typeof first === 'string' ? first : first.roomId);
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
this.fileWrappers.set(files, wrapped);
|
|
117
|
+
}
|
|
118
|
+
return wrapped;
|
|
75
119
|
}
|
|
76
120
|
get unreceivedRequests() {
|
|
77
121
|
return this.store.unreceivedRequests?.bind(this.store);
|
|
78
122
|
}
|
|
79
123
|
async createRoom(room, participant, event) {
|
|
80
124
|
await this.store.createRoom(room, participant, event);
|
|
81
|
-
this.
|
|
125
|
+
await this.publish(room.roomId);
|
|
126
|
+
}
|
|
127
|
+
loadRoom(roomId, options) {
|
|
128
|
+
return this.store.loadRoom(roomId, options);
|
|
82
129
|
}
|
|
83
|
-
|
|
84
|
-
return this.store.
|
|
130
|
+
roomHead(roomId) {
|
|
131
|
+
return this.store.roomHead(roomId);
|
|
85
132
|
}
|
|
86
133
|
async apply(mutation, idempotency) {
|
|
87
134
|
await this.store.apply(mutation, idempotency);
|
|
88
|
-
this.
|
|
135
|
+
await this.publish(mutation.room.roomId);
|
|
89
136
|
}
|
|
90
|
-
readEvents(roomId, after, limit) {
|
|
91
|
-
return this.store.readEvents(roomId, after, limit);
|
|
137
|
+
readEvents(roomId, after, limit, through) {
|
|
138
|
+
return this.store.readEvents(roomId, after, limit, through);
|
|
92
139
|
}
|
|
93
140
|
eventBySeq(roomId, seq) {
|
|
94
141
|
return this.store.eventBySeq(roomId, seq);
|
|
@@ -99,17 +146,26 @@ export class NotifyingStore {
|
|
|
99
146
|
idempotencyRecord(roomId, key) {
|
|
100
147
|
return this.store.idempotencyRecord(roomId, key);
|
|
101
148
|
}
|
|
102
|
-
putInvite(invite) {
|
|
103
|
-
|
|
149
|
+
async putInvite(invite, expectedStateRevision) {
|
|
150
|
+
await this.store.putInvite(invite, expectedStateRevision);
|
|
151
|
+
await this.publish(invite.roomId);
|
|
104
152
|
}
|
|
105
153
|
inviteByDigest(digest) {
|
|
106
154
|
return this.store.inviteByDigest(digest);
|
|
107
155
|
}
|
|
108
|
-
reserveInvite(digest, attemptId, credentialHash, expectedOccupantId) {
|
|
109
|
-
|
|
156
|
+
async reserveInvite(digest, attemptId, credentialHash, expectedOccupantId, expectedStateRevision) {
|
|
157
|
+
const invite = await this.store.reserveInvite(digest, attemptId, credentialHash, expectedOccupantId, expectedStateRevision);
|
|
158
|
+
if (invite) {
|
|
159
|
+
await this.publish(invite.roomId);
|
|
160
|
+
}
|
|
161
|
+
return invite;
|
|
110
162
|
}
|
|
111
|
-
completeInvite(digest, participantId) {
|
|
112
|
-
|
|
163
|
+
async completeInvite(digest, participantId, attemptId) {
|
|
164
|
+
await this.store.completeInvite(digest, participantId, attemptId);
|
|
165
|
+
const invite = await this.store.inviteByDigest(digest);
|
|
166
|
+
if (invite) {
|
|
167
|
+
await this.publish(invite.roomId);
|
|
168
|
+
}
|
|
113
169
|
}
|
|
114
170
|
participantByCredential(roomId, credentialHash) {
|
|
115
171
|
return this.store.participantByCredential(roomId, credentialHash);
|
|
@@ -125,24 +181,27 @@ export class NotifyingStore {
|
|
|
125
181
|
}
|
|
126
182
|
async updateTurns(room, requests, expectedRevision) {
|
|
127
183
|
await this.store.updateTurns(room, requests, expectedRevision);
|
|
128
|
-
this.
|
|
184
|
+
await this.publish(room.roomId);
|
|
129
185
|
}
|
|
130
186
|
messageRequests(roomId, after, limit, recipientId) {
|
|
131
187
|
return this.store.messageRequests(roomId, after, limit, recipientId);
|
|
132
188
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
189
|
+
pendingRequestCount(roomId) {
|
|
190
|
+
return this.store.pendingRequestCount(roomId);
|
|
191
|
+
}
|
|
192
|
+
async setLifecycle(roomId, lifecycle, expectedStateRevision) {
|
|
193
|
+
await this.store.setLifecycle(roomId, lifecycle, expectedStateRevision);
|
|
194
|
+
await this.publish(roomId);
|
|
136
195
|
}
|
|
137
196
|
async deleteRoom(roomId) {
|
|
138
197
|
await this.store.deleteRoom(roomId);
|
|
139
|
-
this.
|
|
198
|
+
await this.publish(roomId);
|
|
140
199
|
}
|
|
141
200
|
dueAutoCloses(now, limit) {
|
|
142
201
|
return this.store.dueAutoCloses(now, limit);
|
|
143
202
|
}
|
|
144
|
-
nextAutoCloseAt() {
|
|
145
|
-
return this.store.nextAutoCloseAt();
|
|
203
|
+
nextAutoCloseAt(now) {
|
|
204
|
+
return this.store.nextAutoCloseAt(now);
|
|
146
205
|
}
|
|
147
206
|
}
|
|
148
207
|
//# sourceMappingURL=changes.js.map
|