@pairlobby/server-core 0.23.0 → 0.24.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/dist/relay.js ADDED
@@ -0,0 +1,459 @@
1
+ //! The relay kernel: every protocol rule a relay applies, over Web `Request`/`Response`,
2
+ //! so each platform only adapts its transport, storage, ordering and timers (`ports.ts`).
3
+ //!
4
+ //! A request goes through two halves. `edge` admits it and answers what needs no room;
5
+ //! otherwise it names the room. `inRoom` then runs it inside that room. A platform with
6
+ //! one process calls `handle`, which does both; one with an object per room, such as a
7
+ //! Worker in front of Durable Objects, calls `edge` in front and `inRoom` in the object.
8
+ import { INVITE_PROBE_LENGTH, CreateInviteRequest, CreateRoomRequest, PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER, FileId, MAX_EVENT_WAIT_MS, ProtocolError, ReadEventsQuery, RedeemInviteRequest, JoinAsGuestRequest, LocalJoinRequest, RoomId, hashCredential, newId, normalizeInviteCode, SetLocalJoinRequest, RenameRoomRequest, RenameSelfRequest, SendEventRequest, SetAccessRequest, SetInviteRoleRequest, SetAutoCloseRequest, SetLockedRequest, SetMutedRequest, SetPermissionsRequest, SetRoleRequest, TurnClaimRequest, TurnTokenRequest, TurnModeRequest, TurnActionRequest, ResolveRequestRequest, ProviderWaitRequest, SetExpiryRequest, ControlRequest } from '@pairlobby/protocol';
9
+ import { directExecutor } from './ports.js';
10
+ const JSON_HEADERS = { 'content-type': 'application/json; charset=utf-8', [PROTOCOL_VERSION_HEADER]: String(PROTOCOL_VERSION) };
11
+ export function createRelay(options) {
12
+ const { service } = options;
13
+ const executor = options.executor ?? directExecutor();
14
+ const inviteRoom = options.inviteRoom ?? ((digest) => service.inviteRoom(digest));
15
+ const peerIsLocal = (request, context) => !options.behindProxy && Boolean(options.peerIsLocal?.(request, context));
16
+ async function edge(request, context = {}) {
17
+ try {
18
+ return await edgeRoute(request, context, options, inviteRoom, peerIsLocal);
19
+ }
20
+ catch (error) {
21
+ return failure(error);
22
+ }
23
+ }
24
+ async function inRoom(request, roomId, context = {}) {
25
+ const write = !['GET', 'HEAD'].includes(request.method.toUpperCase());
26
+ return executor.run(roomId, write, async () => {
27
+ try {
28
+ return await roomRoute(request, roomId, context, options);
29
+ }
30
+ catch (error) {
31
+ return failure(error);
32
+ }
33
+ });
34
+ }
35
+ async function tick(_kind) {
36
+ const scheduler = options.scheduler;
37
+ await executor.run(null, true, async () => {
38
+ try {
39
+ const result = await service.closeDueRooms();
40
+ scheduler?.plan(result.more ? Date.now() : result.nextAt);
41
+ }
42
+ catch {
43
+ scheduler?.plan(Date.now() + 60_000);
44
+ }
45
+ });
46
+ }
47
+ return {
48
+ edge,
49
+ inRoom,
50
+ tick,
51
+ async handle(request, context = {}) {
52
+ const routed = await edge(request, context);
53
+ if (routed instanceof Response) {
54
+ return routed;
55
+ }
56
+ const response = inRoom(routed.request, routed.roomId, context);
57
+ // Every write may change an auto-close deadline, so the wake-up is planned again after it.
58
+ if (options.scheduler && !['GET', 'HEAD'].includes(request.method.toUpperCase())) {
59
+ void tick('auto-close');
60
+ }
61
+ return response;
62
+ }
63
+ };
64
+ }
65
+ function failure(error) {
66
+ if (error instanceof ProtocolError) {
67
+ return errorResponse(error.code, error.message, error.httpStatus, error.details);
68
+ }
69
+ if (isSchemaError(error)) {
70
+ return errorResponse('invalid_request', 'the request body did not match the protocol schema', 400);
71
+ }
72
+ return errorResponse('server_unavailable', 'the server could not complete this request', 503);
73
+ }
74
+ async function edgeRoute(request, context, options, inviteRoom, peerIsLocal) {
75
+ const guard = checkHeaders(request, options);
76
+ if (guard) {
77
+ return guard;
78
+ }
79
+ const url = new URL(request.url);
80
+ const path = url.pathname;
81
+ const segments = path.split('/').filter(Boolean);
82
+ const method = request.method.toUpperCase();
83
+ if (method === 'GET' && path === '/v1/server') {
84
+ return json(describe(options));
85
+ }
86
+ if (options.inviteProbe && method === 'GET' && path === '/v1/invites/probe') {
87
+ const prefix = url.searchParams.get('prefix') ?? '';
88
+ if (!new RegExp(`^[0-9a-f]{${INVITE_PROBE_LENGTH}}$`).test(prefix)) {
89
+ return errorResponse('invalid_request', `prefix must be ${INVITE_PROBE_LENGTH} lowercase hex digits`, 400);
90
+ }
91
+ return json({ known: await options.inviteProbe(prefix) });
92
+ }
93
+ if (options.discovery && method === 'GET' && path === '/.well-known/pairlobby.json') {
94
+ return new Response(JSON.stringify(options.discovery()), { status: 200, headers: { ...JSON_HEADERS, 'cache-control': 'public, max-age=300' } });
95
+ }
96
+ if (options.accountCheck && options.admission && method === 'GET' && path === '/api/online/account') {
97
+ await options.admission.beforeAccountCheck(request, context);
98
+ return json(options.accountCheck(request));
99
+ }
100
+ const local = await routeLocal(request, context, options, peerIsLocal);
101
+ if (local) {
102
+ return local;
103
+ }
104
+ if (segments[0] !== 'v1') {
105
+ return errorResponse('invalid_request', 'unknown path', 404);
106
+ }
107
+ // A new room gets its id here, because a relay with an object per room routes by it.
108
+ if (segments[1] === 'rooms' && segments.length === 2 && method === 'POST') {
109
+ await options.admission?.beforeCreate(request, context);
110
+ return { roomId: newId('room'), request };
111
+ }
112
+ // A code names its room only through its digest; the room then checks the code itself.
113
+ if (segments[1] === 'invites' && segments[2] === 'redeem' && method === 'POST') {
114
+ await options.admission?.beforeRedeem(request, context);
115
+ const body = await request.text();
116
+ const input = RedeemInviteRequest.parse(JSON.parse(body));
117
+ const normalized = normalizeInviteCode(input.code);
118
+ const roomId = normalized ? await inviteRoom(await hashCredential(normalized)) : null;
119
+ if (!roomId) {
120
+ await options.admission?.afterUnknownInvite(request, context);
121
+ throw new ProtocolError('invite_unknown', normalized ? 'that invite code is not valid' : 'that invite code is not well formed');
122
+ }
123
+ return { roomId, request: new Request(request.url, { method: request.method, headers: request.headers, body }) };
124
+ }
125
+ if (segments[1] !== 'rooms' || segments.length < 3) {
126
+ return errorResponse('invalid_request', 'unknown path', 404);
127
+ }
128
+ return { roomId: segments[2], request };
129
+ }
130
+ const NOT_LOCAL = 'joining by name is only open to devices on this relay\'s local network or tailnet; ask for an invite code';
131
+ /**
132
+ * Finding and joining rooms by name: both need a transport that vouches the caller is local.
133
+ * A lookup is answered here; a join that passes the check goes on to its room.
134
+ */
135
+ async function routeLocal(request, context, options, peerIsLocal) {
136
+ const url = new URL(request.url);
137
+ const segments = url.pathname.split('/').filter(Boolean);
138
+ const method = request.method.toUpperCase();
139
+ const lookup = method === 'GET' && segments.length === 3 && segments[0] === 'v1' && segments[1] === 'rooms' && segments[2] === 'local';
140
+ const join = method === 'POST' && segments.length === 4 && segments[0] === 'v1' && segments[1] === 'rooms' && segments[3] === 'local-join';
141
+ if (!lookup && !join) {
142
+ return null;
143
+ }
144
+ if (lookup && !options.localRooms) {
145
+ return errorResponse('invalid_request', 'unknown path', 404);
146
+ }
147
+ if (!peerIsLocal(request, context)) {
148
+ return errorResponse('unauthorized', NOT_LOCAL, 401);
149
+ }
150
+ if (lookup) {
151
+ // No name at all lists every room open to the local network, for the room list.
152
+ if (!url.searchParams.has('name')) {
153
+ return json({ rooms: await options.localRooms() });
154
+ }
155
+ const name = (url.searchParams.get('name') ?? '').trim();
156
+ if (name.length === 0 || name.length > 64) {
157
+ return errorResponse('invalid_request', 'name must be 1–64 characters', 400);
158
+ }
159
+ return json({ rooms: await options.localRooms(name) });
160
+ }
161
+ return { roomId: RoomId.parse(segments[2]), request };
162
+ }
163
+ /** The relay's own account of itself, from what this router was given: nothing is claimed that it was not. */
164
+ export function describe(options) {
165
+ const profile = options.service.relayProfile();
166
+ const features = [
167
+ ...(profile.files ? ['files'] : []),
168
+ ...(options.peerIsLocal && options.localRooms && !options.behindProxy ? ['local-join'] : []),
169
+ ...(options.inviteProbe ? ['invite-probe'] : []),
170
+ ...(options.admission?.createTokenRequired ? ['create-token'] : []),
171
+ ...(options.accountCheck && options.admission ? ['token-login'] : []),
172
+ ...(options.features ?? [])
173
+ ];
174
+ const transport = options.transport ?? (options.changes ? 'long-poll' : undefined);
175
+ return describeRelay({ limits: profile.limits, features, ...(transport ? { transport } : {}), ...(options.serverInfo ? { info: options.serverInfo() } : {}) });
176
+ }
177
+ /**
178
+ * `GET /v1/server` for any relay, including one that answers it outside this router, such as
179
+ * a Worker in front of Durable Objects. Every relay speaking this protocol has message stages.
180
+ */
181
+ export function describeRelay({ limits, features, transport, info }) {
182
+ return {
183
+ protocol: PROTOCOL_VERSION,
184
+ ...info,
185
+ features: [...new Set(['message-stages', ...features])],
186
+ ...(transport ? { transport: { live: transport, ...(transport === 'long-poll' ? { maxWaitMs: MAX_EVENT_WAIT_MS } : {}) } } : {}),
187
+ limits
188
+ };
189
+ }
190
+ /**
191
+ * A read that waits: registered before reading so a write in between still wakes it, and
192
+ * answered as soon as anything is newer than `after`, at the deadline, or on any other change
193
+ * to the room, so the client rereads whatever else it watches.
194
+ */
195
+ async function readWaiting(service, changes, roomId, credential, after, limit, waitMs) {
196
+ const waiting = changes.wait(roomId, Math.min(waitMs, MAX_EVENT_WAIT_MS));
197
+ try {
198
+ const page = await service.read(roomId, credential, after, limit);
199
+ if (page.events.length > 0 || !waiting || !(await waiting.changed)) {
200
+ return json(page);
201
+ }
202
+ return json(await service.read(roomId, credential, after, limit));
203
+ }
204
+ finally {
205
+ waiting?.cancel();
206
+ }
207
+ }
208
+ /** Everything inside one room. Admission already happened in `edge`. */
209
+ async function roomRoute(request, roomId, context, options) {
210
+ const { service, admission, changes } = options;
211
+ const url = new URL(request.url);
212
+ const segments = url.pathname.split('/').filter(Boolean);
213
+ const method = request.method.toUpperCase();
214
+ if (segments[1] === 'rooms' && segments.length === 2 && method === 'POST') {
215
+ const input = CreateRoomRequest.parse(await request.json());
216
+ const created = await service.createRoom({ ...input, roomId });
217
+ return json({ room: created.snapshot, participantId: created.participantId, invite: created.invite }, 201);
218
+ }
219
+ if (segments[1] === 'invites' && segments[2] === 'redeem' && method === 'POST') {
220
+ const input = RedeemInviteRequest.parse(await request.json());
221
+ try {
222
+ const result = await service.redeemInvite(input);
223
+ return json({ roomId: result.roomId, participantId: result.participantId, role: result.role, room: result.snapshot });
224
+ }
225
+ catch (error) {
226
+ if (error instanceof ProtocolError && error.code === 'invite_unknown') {
227
+ await admission?.afterUnknownInvite(request, context);
228
+ }
229
+ throw error;
230
+ }
231
+ }
232
+ if (method === 'POST' && segments.length === 4 && segments[3] === 'local-join') {
233
+ const input = LocalJoinRequest.parse(await request.json());
234
+ const result = await service.joinOnLocalNetwork(roomId, input);
235
+ return json({ roomId: result.roomId, participantId: result.participantId, role: result.role, room: result.snapshot });
236
+ }
237
+ // Guest entry is the one room route with no credential: knowing the id is the claim.
238
+ if (method === 'POST' && segments[3] === 'guests') {
239
+ const input = JoinAsGuestRequest.parse(await request.json());
240
+ const result = await service.joinAsGuest(roomId, input);
241
+ return json({ roomId: result.roomId, participantId: result.participantId, role: result.role, room: result.snapshot });
242
+ }
243
+ const credential = bearer(request);
244
+ if (segments.length === 3 && method === 'GET') {
245
+ return json(await service.snapshot(roomId, credential));
246
+ }
247
+ if (segments.length === 3 && method === 'DELETE') {
248
+ await service.delete(roomId, credential);
249
+ return new Response(null, { status: 204, headers: JSON_HEADERS });
250
+ }
251
+ switch (`${method} ${segments[3]}`) {
252
+ case 'GET turns':
253
+ return json(await service.turns.status(roomId, credential));
254
+ case 'POST turns': {
255
+ const input = await readOptionalJson(request);
256
+ if (segments[4] === 'mode') {
257
+ return json(await service.turns.mode(roomId, credential, TurnModeRequest.parse(input).mode));
258
+ }
259
+ return json(await service.turns.control(roomId, credential, TurnActionRequest.parse(input)));
260
+ }
261
+ case 'POST self': {
262
+ if (segments.length !== 5 || segments[4] !== 'name') {
263
+ return errorResponse('invalid_request', 'unknown self operation', 404);
264
+ }
265
+ return json(await service.renameSelf(roomId, credential, RenameSelfRequest.parse(await request.json())));
266
+ }
267
+ case 'POST rejoin':
268
+ return json(await service.rejoin(roomId, credential));
269
+ case 'POST invites': {
270
+ const { role, reusable, expiresAt, defaultName } = CreateInviteRequest.parse(await readOptionalJson(request));
271
+ return json(await service.mintInvite(roomId, credential, role, reusable, expiresAt, defaultName), 201);
272
+ }
273
+ case 'POST requests': {
274
+ if (segments[4] && segments[5] === 'claim') {
275
+ return json(await service.turns.claim(roomId, credential, segments[4], TurnClaimRequest.parse(await request.json()).claimId));
276
+ }
277
+ if (segments[4] && segments[5] === 'working') {
278
+ await service.turns.working(roomId, credential, segments[4], TurnTokenRequest.parse(await request.json()).token);
279
+ return json({ ok: true });
280
+ }
281
+ if (segments[4] && segments[5] === 'renew') {
282
+ return json(await service.turns.renew(roomId, credential, segments[4], TurnTokenRequest.parse(await request.json()).token));
283
+ }
284
+ if (segments[4] && segments[5] === 'pass') {
285
+ await service.turns.pass(roomId, credential, segments[4], TurnTokenRequest.parse(await request.json()).token);
286
+ return json({ ok: true });
287
+ }
288
+ if (segments[4] && segments[5] === 'defer') {
289
+ const input = ProviderWaitRequest.parse(await request.json());
290
+ const { token, model, source, ...wait } = input;
291
+ const providerWait = { ...wait, ...(model ? { model } : {}), ...(source ? { source } : {}) };
292
+ await service.turns.defer(roomId, credential, segments[4], token, providerWait);
293
+ return json({ ok: true });
294
+ }
295
+ if (segments[4] && segments[5] === 'resume') {
296
+ return json(await service.turns.resume(roomId, credential, segments[4]));
297
+ }
298
+ if (segments[4] && segments[5] === 'resolve') {
299
+ return json(await service.resolveRequest(roomId, credential, segments[4], ResolveRequestRequest.parse(await request.json())));
300
+ }
301
+ if (segments[4] && segments[5] === 'ack') {
302
+ return json(await service.acknowledgeMessage(roomId, credential, segments[4]));
303
+ }
304
+ return errorResponse('invalid_request', 'unknown request operation', 404);
305
+ }
306
+ case 'GET requests': {
307
+ if (segments[4]) {
308
+ return json(await service.request(roomId, credential, segments[4]));
309
+ }
310
+ const query = ReadEventsQuery.parse(Object.fromEntries(url.searchParams));
311
+ return json(await service.requests(roomId, credential, query.after, query.limit, url.searchParams.get('to') ?? undefined, url.searchParams.get('turns') === '1'));
312
+ }
313
+ case 'POST files': {
314
+ const name = url.searchParams.get('name') ?? '';
315
+ if (!name.trim() || name.length > 1024) {
316
+ return errorResponse('invalid_request', 'name the file with ?name=', 400);
317
+ }
318
+ const bytes = new Uint8Array(await request.arrayBuffer());
319
+ return json({ file: await service.uploadFile(roomId, credential, { name, mediaType: request.headers.get('content-type') ?? '', bytes }) }, 201);
320
+ }
321
+ case 'GET files': {
322
+ if (!segments[4]) {
323
+ return json(await service.listFiles(roomId, credential));
324
+ }
325
+ const { file, bytes } = await service.downloadFile(roomId, credential, FileId.parse(segments[4]));
326
+ // Always a download, never something a browser would render or run: the name and type came from another participant.
327
+ return new Response(bytes, { status: 200, headers: { 'content-type': 'application/octet-stream', 'content-disposition': `attachment; filename*=UTF-8''${encodeURIComponent(file.name)}`, 'content-length': String(bytes.byteLength), 'x-content-type-options': 'nosniff', 'cache-control': 'private, no-store', 'pairlobby-file-sha256': file.sha256, [PROTOCOL_VERSION_HEADER]: String(PROTOCOL_VERSION) } });
328
+ }
329
+ case 'GET events': {
330
+ const query = ReadEventsQuery.parse(Object.fromEntries(new URL(request.url).searchParams));
331
+ if (changes && query.wait > 0) {
332
+ return readWaiting(service, changes, roomId, credential, query.after, query.limit, query.wait);
333
+ }
334
+ return json(await service.read(roomId, credential, query.after, query.limit));
335
+ }
336
+ case 'POST events': {
337
+ const input = SendEventRequest.parse(await request.json());
338
+ const result = await service.send(roomId, credential, input);
339
+ return json(result, result.deduplicated ? 200 : 201);
340
+ }
341
+ case 'POST control': {
342
+ const input = ControlRequest.parse(await request.json());
343
+ if (input.interrupt) {
344
+ if (!input.paused) {
345
+ return errorResponse('invalid_request', 'an interrupt also pauses; send paused: true', 400);
346
+ }
347
+ const result = await service.interrupt(roomId, credential, input.targetParticipantId);
348
+ return json({ revision: result.event.type === 'control.pause' ? result.event.payload.revision : 0, event: result.event, fenced: result.fenced });
349
+ }
350
+ const event = await service.control(roomId, credential, input.targetParticipantId, input.paused);
351
+ return json({ revision: event.type === 'control.pause' || event.type === 'control.resume' ? event.payload.revision : 0, event });
352
+ }
353
+ case 'POST name': {
354
+ const { name } = RenameRoomRequest.parse(await request.json());
355
+ return json({ event: await service.rename(roomId, credential, name) });
356
+ }
357
+ case 'POST lock': {
358
+ const { locked } = SetLockedRequest.parse(await request.json());
359
+ return json({ event: await service.setLocked(roomId, credential, locked) });
360
+ }
361
+ case 'POST participants': {
362
+ if (segments.length === 6 && segments[5] === 'role') {
363
+ const { role } = SetRoleRequest.parse(await request.json());
364
+ return json(await service.setRole(roomId, credential, segments[4], role));
365
+ }
366
+ if (segments.length === 6 && segments[5] === 'permissions') {
367
+ const { permissions } = SetPermissionsRequest.parse(await request.json());
368
+ return json(await service.setParticipantPermissions(roomId, credential, segments[4], permissions));
369
+ }
370
+ if (segments.length !== 6 || segments[5] !== 'mute') {
371
+ return errorResponse('invalid_request', 'unknown participant operation', 404);
372
+ }
373
+ const { muted } = SetMutedRequest.parse(await request.json());
374
+ return json({ event: await service.setMuted(roomId, credential, segments[4], muted) });
375
+ }
376
+ case 'POST permissions': {
377
+ const { permissions } = SetPermissionsRequest.parse(await request.json());
378
+ return json(await service.setRoomPermissions(roomId, credential, permissions));
379
+ }
380
+ case 'POST access': {
381
+ const { joinPolicy } = SetAccessRequest.parse(await request.json());
382
+ return json({ event: await service.setJoinPolicy(roomId, credential, joinPolicy) });
383
+ }
384
+ case 'POST local-access': {
385
+ const { localJoin } = SetLocalJoinRequest.parse(await request.json());
386
+ return json({ event: await service.setLocalJoin(roomId, credential, localJoin) });
387
+ }
388
+ case 'POST auto-close': {
389
+ const { autoClose } = SetAutoCloseRequest.parse(await request.json());
390
+ return json({ event: await service.setAutoClose(roomId, credential, autoClose) });
391
+ }
392
+ case 'POST invite-role': {
393
+ const { inviteRole } = SetInviteRoleRequest.parse(await request.json());
394
+ return json({ event: await service.setInviteRole(roomId, credential, inviteRole) });
395
+ }
396
+ case 'POST expiry': {
397
+ const { expiresAt } = SetExpiryRequest.parse(await request.json());
398
+ return json({ event: await service.setExpiry(roomId, credential, expiresAt) });
399
+ }
400
+ case 'POST close':
401
+ return json({ event: await service.close(roomId, credential) });
402
+ case 'POST leave':
403
+ return json({ event: await service.leave(roomId, credential) });
404
+ case 'GET export':
405
+ return json(await service.export(roomId, credential));
406
+ case 'DELETE participants': {
407
+ const participantId = segments[4];
408
+ if (!participantId) {
409
+ return errorResponse('invalid_request', 'no participant named', 400);
410
+ }
411
+ return json({ event: await service.revoke(roomId, credential, participantId) });
412
+ }
413
+ default:
414
+ return errorResponse('invalid_request', 'unknown path', 404);
415
+ }
416
+ }
417
+ /** Refuses a request declaring another protocol version, before anything else looks at it. Null when it may go on. */
418
+ export function protocolVersionRefusal(request) {
419
+ const declared = request.headers.get(PROTOCOL_VERSION_HEADER);
420
+ return declared !== null && declared !== String(PROTOCOL_VERSION) ? errorResponse('protocol_version_unsupported', `this server speaks protocol version ${PROTOCOL_VERSION}`, 400) : null;
421
+ }
422
+ function checkHeaders(request, options) {
423
+ const refused = protocolVersionRefusal(request);
424
+ if (refused) {
425
+ return refused;
426
+ }
427
+ const origin = request.headers.get('origin');
428
+ if (origin !== null && !(options.allowedOrigins ?? []).includes(origin)) {
429
+ return errorResponse('unauthorized', 'this origin may not call this server', 401);
430
+ }
431
+ const host = request.headers.get('host');
432
+ const allowedHosts = options.allowedHosts;
433
+ if (allowedHosts && host !== null && !(typeof allowedHosts === 'function' ? allowedHosts(host) : allowedHosts.includes(host))) {
434
+ return errorResponse('unauthorized', 'unexpected host header', 401);
435
+ }
436
+ return null;
437
+ }
438
+ function bearer(request) {
439
+ const header = request.headers.get('authorization') ?? '';
440
+ const match = /^Bearer (.+)$/.exec(header);
441
+ if (!match) {
442
+ throw new ProtocolError('unauthorized', 'a bearer credential is required');
443
+ }
444
+ return match[1];
445
+ }
446
+ async function readOptionalJson(request) {
447
+ const text = await request.text();
448
+ return text.length === 0 ? {} : JSON.parse(text);
449
+ }
450
+ function json(body, status = 200) {
451
+ return new Response(JSON.stringify(body), { status, headers: JSON_HEADERS });
452
+ }
453
+ function errorResponse(code, message, status, details = {}) {
454
+ return new Response(JSON.stringify({ error: { code, message, ...details } }), { status, headers: JSON_HEADERS });
455
+ }
456
+ function isSchemaError(error) {
457
+ return typeof error === 'object' && error !== null && error.name === 'ZodError';
458
+ }
459
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
package/dist/router.d.ts CHANGED
@@ -1,98 +1,5 @@
1
- import type { LiveTransport, LocalRoom, RelayLimits, ServerDescription } from '@pairlobby/protocol';
2
- import type { Admission } from './admission.js';
3
- import type { ChangeNotifier } from './changes.js';
4
- import type { RoomService } from './service.js';
5
- export interface RouterOptions {
6
- service: RoomService;
7
- /**
8
- * Exact origins a browser may call from. A CLI sends no `Origin`, so an
9
- * unexpected one means a web page is talking to us — including a malicious
10
- * page reaching for loopback.
11
- */
12
- allowedOrigins?: string[];
13
- /** `Host` values to accept, defeating DNS rebinding against a local server. */
14
- allowedHosts?: string[] | ((host: string) => boolean);
15
- /** What only the adapter knows for `GET /v1/server`: its share addresses and its build. Every relay answers the path. */
16
- serverInfo?: () => ServerInfo;
17
- /**
18
- * Wakes held reads. Present means the relay offers long-poll: `GET .../events?wait=` waits for a change
19
- * instead of answering empty. Only a relay whose writes all pass through one process can offer it.
20
- */
21
- changes?: ChangeNotifier;
22
- /**
23
- * How clients hear about new events, when the relay knows. Defaults to `long-poll` with `changes` and is
24
- * otherwise left out, so a client keeps its own rule; a relay with a socket hub says `websocket`.
25
- */
26
- transport?: LiveTransport;
27
- /** Features beyond those the router can see for itself. */
28
- features?: string[];
29
- /**
30
- * Answers `GET /v1/invites/probe?prefix=`: whether any invite this server issued
31
- * has a digest starting with that prefix. Lets a client on the same network find
32
- * the relay behind a bare code; absent means the path is unknown.
33
- */
34
- inviteProbe?: (prefix: string) => Promise<boolean>;
35
- /**
36
- * Whether this request came from the relay's own device, its local network or its
37
- * tailnet. Only a transport that sees the connection's real address can say; absent
38
- * means never, so joining by name is refused.
39
- */
40
- peerIsLocal?: (request: Request) => boolean;
41
- /** Open rooms that allow local joins, matching a name or all of them; answers `GET /v1/rooms/local[?name=]`. */
42
- localRooms?: (name?: string) => Promise<LocalRoom[]>;
43
- /** The create token and rate limits; absent means anyone who reaches the relay may create rooms and try codes freely. */
44
- admission?: Admission;
45
- /** Answers `GET /.well-known/pairlobby.json`, which tells `pairlobby setup` who this relay is and how to log in. */
46
- discovery?: () => DiscoveryDocument;
47
- /**
48
- * Token-mode login: answers `GET /api/online/account` for a caller holding the team
49
- * token (the create token). Absent means the path is unknown. Needs `admission`.
50
- */
51
- accountCheck?: (request: Request) => TeamAccount;
52
- }
53
- /** What a deployment says about itself to `pairlobby setup`. */
54
- export interface DiscoveryDocument {
55
- version: 1;
56
- name?: string;
57
- login: {
58
- mode: 'token' | 'none';
59
- tokenHelp?: string;
60
- verify?: string;
61
- };
62
- relays: string[];
63
- features: string[];
64
- support?: string;
65
- }
66
- /** The account a team token stands for: no person, just where its rooms go. */
67
- export interface TeamAccount {
68
- email: null;
69
- userId: 'team';
70
- name: string | null;
71
- server: string;
72
- handle: null;
73
- }
74
- export interface ServerInfo {
75
- /** Addresses other devices can use to reach this server; empty when it only listens on this device. */
76
- shareUrls: string[];
77
- /** True when a device on the same network or tailnet can find this server from an invite code alone. */
78
- discoverable?: boolean;
79
- /** The relay's own version, so a client can tell when it runs an older build than the CLI. */
80
- version?: string;
81
- }
82
- export declare function createRouter(options: RouterOptions): (request: Request) => Promise<Response>;
83
- /** The relay's own account of itself, from what this router was given: nothing is claimed that it was not. */
84
- export declare function describe(options: RouterOptions): ServerDescription;
85
- export type RelayDescriptionInput = {
86
- limits: RelayLimits;
87
- features: string[];
88
- transport?: LiveTransport;
89
- info?: ServerInfo;
90
- };
91
- /**
92
- * `GET /v1/server` for any relay, including one that answers it outside this router, such as
93
- * a Worker in front of Durable Objects. Every relay speaking this protocol has message stages.
94
- */
95
- export declare function describeRelay({ limits, features, transport, info }: RelayDescriptionInput): ServerDescription;
96
- /** Refuses a request declaring another protocol version, before anything else looks at it. Null when it may go on. */
97
- export declare function protocolVersionRefusal(request: Request): Response | null;
1
+ import type { RelayOptions } from './relay.js';
2
+ import type { RequestContext } from './ports.js';
3
+ export type RouterOptions = RelayOptions;
4
+ export declare function createRouter(options: RouterOptions): (request: Request, context?: RequestContext) => Promise<Response>;
98
5
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC;AAEzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,CAGtH"}