@pairlobby/server-core 0.32.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.
Files changed (56) hide show
  1. package/README.md +1 -1
  2. package/dist/admission.d.ts +11 -0
  3. package/dist/admission.d.ts.map +1 -1
  4. package/dist/admission.js +18 -12
  5. package/dist/admission.js.map +1 -1
  6. package/dist/auto-close-store.d.ts +10 -8
  7. package/dist/auto-close-store.d.ts.map +1 -1
  8. package/dist/auto-close-store.js +35 -22
  9. package/dist/auto-close-store.js.map +1 -1
  10. package/dist/changes.d.ts +25 -11
  11. package/dist/changes.d.ts.map +1 -1
  12. package/dist/changes.js +81 -22
  13. package/dist/changes.js.map +1 -1
  14. package/dist/commit.d.ts +12 -0
  15. package/dist/commit.d.ts.map +1 -0
  16. package/dist/commit.js +33 -0
  17. package/dist/commit.js.map +1 -0
  18. package/dist/export.d.ts +12 -0
  19. package/dist/export.d.ts.map +1 -0
  20. package/dist/export.js +72 -0
  21. package/dist/export.js.map +1 -0
  22. package/dist/index.d.ts +4 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +4 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/paging.d.ts +12 -0
  27. package/dist/paging.d.ts.map +1 -0
  28. package/dist/paging.js +32 -0
  29. package/dist/paging.js.map +1 -0
  30. package/dist/ports.d.ts +12 -5
  31. package/dist/ports.d.ts.map +1 -1
  32. package/dist/ports.js +12 -9
  33. package/dist/ports.js.map +1 -1
  34. package/dist/relay.d.ts +14 -4
  35. package/dist/relay.d.ts.map +1 -1
  36. package/dist/relay.js +79 -39
  37. package/dist/relay.js.map +1 -1
  38. package/dist/service.d.ts +53 -3
  39. package/dist/service.d.ts.map +1 -1
  40. package/dist/service.js +459 -207
  41. package/dist/service.js.map +1 -1
  42. package/dist/settings.d.ts +33 -0
  43. package/dist/settings.d.ts.map +1 -0
  44. package/dist/settings.js +66 -0
  45. package/dist/settings.js.map +1 -0
  46. package/dist/store.d.ts +32 -13
  47. package/dist/store.d.ts.map +1 -1
  48. package/dist/turns.d.ts +1 -0
  49. package/dist/turns.d.ts.map +1 -1
  50. package/dist/turns.js +150 -117
  51. package/dist/turns.js.map +1 -1
  52. package/package.json +4 -3
  53. package/dist/request-backfill.d.ts +0 -3
  54. package/dist/request-backfill.d.ts.map +0 -1
  55. package/dist/request-backfill.js +0 -34
  56. 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.32.0. See that repository for documentation.
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.
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"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"}
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
- const perMs = perMinute / 60_000;
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.tokens + (at - bucket.updatedAt) * perMs >= burst) {
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
- return { ok: true };
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"admission.js","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"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"}
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
- loadRoom(roomId: string): Promise<RoomView | null>;
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
- setLifecycle(roomId: string, lifecycle: RoomRecord['lifecycle']): Promise<void>;
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":"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"}
1
+ {"version":3,"file":"auto-close-store.d.ts","sourceRoot":"","sources":["../src/auto-close-store.ts"],"names":[],"mappings":"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"}
@@ -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 loadRoom(roomId) {
32
- let view = await this.store.loadRoom(roomId);
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 current = await this.store.loadRoom(mutation.room.roomId);
53
- const members = membersAfter(current?.participants ?? [], mutation.upsertParticipants);
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
- // A lease renewal writes the room without an event; keep the deadline the latest write computed.
58
- const current = (await this.store.loadRoom(room.roomId))?.room;
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
- setLifecycle(roomId, lifecycle) {
102
- return this.store.setLifecycle(roomId, lifecycle);
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":"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"}
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
- constructor(store: RoomStore, notifier: ChangeNotifier);
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
- setLifecycle(roomId: string, lifecycle: RoomRecord['lifecycle']): Promise<void>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
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
- return this.store.files;
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.notifier.changed(room.roomId);
125
+ await this.publish(room.roomId);
126
+ }
127
+ loadRoom(roomId, options) {
128
+ return this.store.loadRoom(roomId, options);
82
129
  }
83
- loadRoom(roomId) {
84
- return this.store.loadRoom(roomId);
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.notifier.changed(mutation.room.roomId);
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
- return this.store.putInvite(invite);
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
- return this.store.reserveInvite(digest, attemptId, credentialHash, expectedOccupantId);
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
- return this.store.completeInvite(digest, participantId);
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.notifier.changed(room.roomId);
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
- async setLifecycle(roomId, lifecycle) {
134
- await this.store.setLifecycle(roomId, lifecycle);
135
- this.notifier.changed(roomId);
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.notifier.changed(roomId);
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