@pairlobby/protocol 0.11.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/LICENSE +93 -0
- package/README.md +5 -0
- package/dist/auto-close.d.ts +34 -0
- package/dist/auto-close.d.ts.map +1 -0
- package/dist/auto-close.js +12 -0
- package/dist/auto-close.js.map +1 -0
- package/dist/credentials.d.ts +15 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +48 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +78 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +3177 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +145 -0
- package/dist/events.js.map +1 -0
- package/dist/handover.d.ts +266 -0
- package/dist/handover.d.ts.map +1 -0
- package/dist/handover.js +37 -0
- package/dist/handover.js.map +1 -0
- package/dist/http.d.ts +8849 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +157 -0
- package/dist/http.js.map +1 -0
- package/dist/ids.d.ts +26 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +46 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +74 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +56 -0
- package/dist/limits.js.map +1 -0
- package/dist/names.d.ts +16 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +7 -0
- package/dist/names.js.map +1 -0
- package/dist/records.d.ts +1109 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +169 -0
- package/dist/records.js.map +1 -0
- package/dist/requests.d.ts +71 -0
- package/dist/requests.d.ts.map +1 -0
- package/dist/requests.js +93 -0
- package/dist/requests.js.map +1 -0
- package/dist/wire.d.ts +4266 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +24 -0
- package/dist/wire.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKvB,iFAAiF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEnF,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
//! The v1 HTTP contract. Every route authenticates and authorizes independently;
|
|
2
|
+
//! a generic events endpoint must not become a way around control authorization.
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { NameSource, ParticipantName } from './names.js';
|
|
5
|
+
import { AdapterCapabilities, ParticipantKind, ParticipantRole, RoomEvent, SendEventRequest } from './events.js';
|
|
6
|
+
import { AttemptId, EventId, ParticipantId, RoomId, SessionId } from './ids.js';
|
|
7
|
+
import { HandoverRecord, RoomSnapshot } from './records.js';
|
|
8
|
+
import { ERROR_CODES } from './errors.js';
|
|
9
|
+
import { AutoClosePolicySchema } from './auto-close.js';
|
|
10
|
+
export const ROUTES = {
|
|
11
|
+
createRoom: { method: 'POST', path: '/v1/rooms' },
|
|
12
|
+
redeemInvite: { method: 'POST', path: '/v1/invites/redeem' },
|
|
13
|
+
createInvite: { method: 'POST', path: '/v1/rooms/:roomId/invites' },
|
|
14
|
+
getRoom: { method: 'GET', path: '/v1/rooms/:roomId' },
|
|
15
|
+
renameSelf: { method: 'POST', path: '/v1/rooms/:roomId/self/name' },
|
|
16
|
+
rejoinRoom: { method: 'POST', path: '/v1/rooms/:roomId/rejoin' },
|
|
17
|
+
turnQueue: { method: 'GET', path: '/v1/rooms/:roomId/turns' },
|
|
18
|
+
turnMode: { method: 'POST', path: '/v1/rooms/:roomId/turns/mode' },
|
|
19
|
+
turnControl: { method: 'POST', path: '/v1/rooms/:roomId/turns' },
|
|
20
|
+
claimTurn: { method: 'POST', path: '/v1/rooms/:roomId/requests/:eventId/claim' },
|
|
21
|
+
renewTurn: { method: 'POST', path: '/v1/rooms/:roomId/requests/:eventId/renew' },
|
|
22
|
+
declareWorking: { method: 'POST', path: '/v1/rooms/:roomId/requests/:eventId/working' },
|
|
23
|
+
passTurn: { method: 'POST', path: '/v1/rooms/:roomId/requests/:eventId/pass' },
|
|
24
|
+
readEvents: { method: 'GET', path: '/v1/rooms/:roomId/events' },
|
|
25
|
+
sendEvent: { method: 'POST', path: '/v1/rooms/:roomId/events' },
|
|
26
|
+
connectTicket: { method: 'POST', path: '/v1/rooms/:roomId/connect-ticket' },
|
|
27
|
+
connect: { method: 'GET', path: '/v1/rooms/:roomId/connect' },
|
|
28
|
+
control: { method: 'POST', path: '/v1/rooms/:roomId/control' },
|
|
29
|
+
revokeParticipant: { method: 'DELETE', path: '/v1/rooms/:roomId/participants/:participantId' },
|
|
30
|
+
renameRoom: { method: 'POST', path: '/v1/rooms/:roomId/name' },
|
|
31
|
+
setExpiry: { method: 'POST', path: '/v1/rooms/:roomId/expiry' },
|
|
32
|
+
setLocked: { method: 'POST', path: '/v1/rooms/:roomId/lock' },
|
|
33
|
+
setMuted: { method: 'POST', path: '/v1/rooms/:roomId/participants/:participantId/mute' },
|
|
34
|
+
setRole: { method: 'POST', path: '/v1/rooms/:roomId/participants/:participantId/role' },
|
|
35
|
+
setAccess: { method: 'POST', path: '/v1/rooms/:roomId/access' },
|
|
36
|
+
joinAsGuest: { method: 'POST', path: '/v1/rooms/:roomId/guests' },
|
|
37
|
+
closeRoom: { method: 'POST', path: '/v1/rooms/:roomId/close' },
|
|
38
|
+
exportRoom: { method: 'GET', path: '/v1/rooms/:roomId/export' },
|
|
39
|
+
deleteRoom: { method: 'DELETE', path: '/v1/rooms/:roomId' }
|
|
40
|
+
};
|
|
41
|
+
const identity = z.object({
|
|
42
|
+
displayName: ParticipantName,
|
|
43
|
+
nameSource: NameSource.optional(),
|
|
44
|
+
kind: ParticipantKind,
|
|
45
|
+
sessionId: SessionId.optional(),
|
|
46
|
+
capabilities: AdapterCapabilities.optional()
|
|
47
|
+
});
|
|
48
|
+
export const CreateRoomRequest = z.intersection(identity, z.object({
|
|
49
|
+
name: z.string().min(1).max(64),
|
|
50
|
+
/** Overrides the server default. Null, or omitted with no server default, means no expiry. */
|
|
51
|
+
expiresAt: z.number().int().nonnegative().nullable().optional(),
|
|
52
|
+
/** Client-generated so a lost response never strands a credential the caller does not hold. */
|
|
53
|
+
controllerCredential: z.string().min(32).max(256),
|
|
54
|
+
participantCredential: z.string().min(32).max(256)
|
|
55
|
+
}));
|
|
56
|
+
export const CreateRoomResponse = z.object({
|
|
57
|
+
room: RoomSnapshot,
|
|
58
|
+
participantId: ParticipantId,
|
|
59
|
+
invite: z.object({ code: z.string(), expiresAt: z.number().int().nonnegative() })
|
|
60
|
+
});
|
|
61
|
+
export const RedeemInviteRequest = z.intersection(identity, z.object({
|
|
62
|
+
code: z.string().min(1).max(32),
|
|
63
|
+
useInviteName: z.boolean().optional(),
|
|
64
|
+
/** Stable across retries of the same join, so a crashed redemption resumes instead of forking. */
|
|
65
|
+
attemptId: AttemptId,
|
|
66
|
+
attemptSecret: z.string().min(32).max(256),
|
|
67
|
+
participantCredential: z.string().min(32).max(256)
|
|
68
|
+
}));
|
|
69
|
+
/**
|
|
70
|
+
* Joining a room the caller's account is already allowed into, from any of its
|
|
71
|
+
* devices, without an invite. Only servers with account login offer this; the
|
|
72
|
+
* account itself is proven outside this body.
|
|
73
|
+
*/
|
|
74
|
+
export const AccountJoinRequest = z.intersection(identity, z.object({
|
|
75
|
+
/** Stable across retries of the same join, so a lost response returns the same membership. */
|
|
76
|
+
attemptId: AttemptId,
|
|
77
|
+
attemptSecret: z.string().min(32).max(256),
|
|
78
|
+
participantCredential: z.string().min(32).max(256)
|
|
79
|
+
}));
|
|
80
|
+
export const RedeemInviteResponse = z.object({
|
|
81
|
+
roomId: RoomId,
|
|
82
|
+
participantId: ParticipantId,
|
|
83
|
+
role: ParticipantRole,
|
|
84
|
+
room: RoomSnapshot
|
|
85
|
+
});
|
|
86
|
+
export const SetLockedRequest = z.object({ locked: z.boolean() });
|
|
87
|
+
export const SetMutedRequest = z.object({ muted: z.boolean() });
|
|
88
|
+
export const SetRoleRequest = z.object({ role: z.enum(['member', 'controller']) });
|
|
89
|
+
export const TurnClaimRequest = z.object({ claimId: z.string().min(16).max(128) });
|
|
90
|
+
export const TurnTokenRequest = z.object({ token: z.string().min(16).max(128) });
|
|
91
|
+
export const TurnModeRequest = z.object({ mode: z.enum(['sequential', 'parallel']) });
|
|
92
|
+
export const TurnActionRequest = z.object({ action: z.enum(['skip', 'cancel']), requestId: EventId.optional(), participantId: ParticipantId.optional() });
|
|
93
|
+
export const CreateInviteRequest = z.object({
|
|
94
|
+
defaultName: z.string().trim().min(1).max(64).optional(),
|
|
95
|
+
role: ParticipantRole.default('member'),
|
|
96
|
+
reusable: z.boolean().default(true),
|
|
97
|
+
/** Absolute expiry. Null means it never expires; omitted takes the room's policy. */
|
|
98
|
+
expiresAt: z.number().int().nonnegative().nullable().optional()
|
|
99
|
+
});
|
|
100
|
+
export const CreateInviteResponse = z.object({ code: z.string(), expiresAt: z.number().int().nonnegative().nullable(), reusable: z.boolean() });
|
|
101
|
+
export const ReadEventsQuery = z.object({
|
|
102
|
+
after: z.coerce.number().int().nonnegative().default(0),
|
|
103
|
+
limit: z.coerce.number().int().min(1).max(500).default(200)
|
|
104
|
+
});
|
|
105
|
+
export const ReadEventsResponse = z.object({
|
|
106
|
+
events: z.array(RoomEvent),
|
|
107
|
+
earliestSeq: z.number().int().nonnegative(),
|
|
108
|
+
latestSeq: z.number().int().nonnegative(),
|
|
109
|
+
hasMore: z.boolean()
|
|
110
|
+
});
|
|
111
|
+
export { SendEventRequest };
|
|
112
|
+
export const SendEventResponse = z.object({
|
|
113
|
+
event: RoomEvent,
|
|
114
|
+
/** True when the idempotency key replayed an already-accepted event. */
|
|
115
|
+
deduplicated: z.boolean()
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* A browser cannot set headers on a WebSocket handshake and a long-lived secret
|
|
119
|
+
* must not sit in a query string, so `connect` takes a short-lived single-use
|
|
120
|
+
* ticket minted here by an ordinary authenticated request. CLI clients may
|
|
121
|
+
* instead present their participant credential as a handshake header.
|
|
122
|
+
*/
|
|
123
|
+
export const ConnectTicketResponse = z.object({ ticket: z.string(), expiresAt: z.number().int().nonnegative() });
|
|
124
|
+
export const RenameRoomRequest = z.object({ name: z.string().min(1).max(64) });
|
|
125
|
+
/** `expiresAt: null` means the room stops expiring. */
|
|
126
|
+
export const SetExpiryRequest = z.object({ expiresAt: z.number().int().nonnegative().nullable() });
|
|
127
|
+
export const SetAccessRequest = z.object({ joinPolicy: z.enum(['invite_only', 'open_to_guests']) });
|
|
128
|
+
export const SetInviteRoleRequest = z.object({ inviteRole: z.enum(['member', 'guest']) });
|
|
129
|
+
export const SetAutoCloseRequest = z.object({ autoClose: AutoClosePolicySchema });
|
|
130
|
+
/** Guest entry carries no invite code: knowing the room id is the whole claim. */
|
|
131
|
+
export const JoinAsGuestRequest = z.intersection(identity, z.object({ participantCredential: z.string().min(32).max(256) }));
|
|
132
|
+
/** Joining a room open to the local network: the same claim as a guest, but admitted as a member. */
|
|
133
|
+
export const LocalJoinRequest = JoinAsGuestRequest;
|
|
134
|
+
export const SetLocalJoinRequest = z.object({ localJoin: z.boolean() });
|
|
135
|
+
/** A room that devices on the relay's network may join by name. Only what is needed to choose one. */
|
|
136
|
+
export const LocalRoom = z.object({ roomId: RoomId, name: z.string(), createdAt: z.number().int().nonnegative(), participantCount: z.number().int().nonnegative() });
|
|
137
|
+
export const LocalRoomsResponse = z.object({ rooms: z.array(LocalRoom) });
|
|
138
|
+
export const ControlRequest = z.object({ targetParticipantId: ParticipantId, paused: z.boolean(), interrupt: z.boolean().optional() });
|
|
139
|
+
export const ControlResponse = z.object({ revision: z.number().int().min(1), event: RoomEvent });
|
|
140
|
+
export const ExportResponse = z.object({
|
|
141
|
+
room: RoomSnapshot,
|
|
142
|
+
events: z.array(RoomEvent),
|
|
143
|
+
handovers: z.array(HandoverRecord),
|
|
144
|
+
exportedAt: z.number().int().nonnegative(),
|
|
145
|
+
/** False when retention already dropped events older than `room.earliestSeq`. */
|
|
146
|
+
complete: z.boolean()
|
|
147
|
+
});
|
|
148
|
+
export const ErrorResponse = z.object({
|
|
149
|
+
error: z.object({
|
|
150
|
+
code: z.enum(ERROR_CODES),
|
|
151
|
+
message: z.string(),
|
|
152
|
+
retryAfterMs: z.number().int().nonnegative().optional(),
|
|
153
|
+
earliestAvailableSeq: z.number().int().nonnegative().optional(),
|
|
154
|
+
currentRevision: z.number().int().nonnegative().optional()
|
|
155
|
+
})
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/ids.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Crockford base32: digits and uppercase letters without I, L, O, or U. */
|
|
3
|
+
export declare const CODE_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
4
|
+
export declare const ID_PREFIXES: {
|
|
5
|
+
readonly room: "rm";
|
|
6
|
+
readonly participant: "pt";
|
|
7
|
+
readonly event: "ev";
|
|
8
|
+
readonly handover: "ho";
|
|
9
|
+
readonly session: "se";
|
|
10
|
+
readonly invite: "iv";
|
|
11
|
+
readonly attempt: "at";
|
|
12
|
+
};
|
|
13
|
+
export type IdKind = keyof typeof ID_PREFIXES;
|
|
14
|
+
export declare function newId(kind: IdKind): string;
|
|
15
|
+
export declare const RoomId: z.ZodString;
|
|
16
|
+
export declare const ParticipantId: z.ZodString;
|
|
17
|
+
export declare const EventId: z.ZodString;
|
|
18
|
+
export declare const HandoverId: z.ZodString;
|
|
19
|
+
export declare const SessionId: z.ZodString;
|
|
20
|
+
export declare const AttemptId: z.ZodString;
|
|
21
|
+
/** Generates a fresh invite code in canonical `XXXX-XXXX` form. */
|
|
22
|
+
export declare function newInviteCode(length?: 8 | 12): string;
|
|
23
|
+
/** Strips formatting and folds the characters Crockford treats as equivalent. Returns null when the result is not a well-formed code. */
|
|
24
|
+
export declare function normalizeInviteCode(input: string): string | null;
|
|
25
|
+
export declare function formatInviteCode(normalized: string): string;
|
|
26
|
+
//# sourceMappingURL=ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../src/ids.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,4EAA4E;AAC5E,eAAO,MAAM,aAAa,qCAAqC,CAAC;AAKhE,eAAO,MAAM,WAAW;;;;;;;;CAAoH,CAAC;AAE7I,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,WAAW,CAAC;AAS9C,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAMD,eAAO,MAAM,MAAM,aAAmB,CAAC;AACvC,eAAO,MAAM,aAAa,aAA0B,CAAC;AACrD,eAAO,MAAM,OAAO,aAAoB,CAAC;AACzC,eAAO,MAAM,UAAU,aAAuB,CAAC;AAC/C,eAAO,MAAM,SAAS,aAAsB,CAAC;AAC7C,eAAO,MAAM,SAAS,aAAsB,CAAC;AAE7C,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,MAAM,GAAE,CAAC,GAAG,EAAM,GAAG,MAAM,CAExD;AAED,yIAAyI;AACzI,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWhE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/ids.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//! Identifier generation and the human-typed invite code alphabet.
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/** Crockford base32: digits and uppercase letters without I, L, O, or U. */
|
|
4
|
+
export const CODE_ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
5
|
+
const ID_BODY_LENGTH = 26;
|
|
6
|
+
const INVITE_CODE_LENGTH = 8;
|
|
7
|
+
export const ID_PREFIXES = { room: 'rm', participant: 'pt', event: 'ev', handover: 'ho', session: 'se', invite: 'iv', attempt: 'at' };
|
|
8
|
+
function randomAlphabet(length) {
|
|
9
|
+
const bytes = new Uint8Array(length);
|
|
10
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
11
|
+
// 256 is a multiple of 32, so masking the low 5 bits stays uniform.
|
|
12
|
+
return Array.from(bytes, (byte) => CODE_ALPHABET[byte & 0x1f]).join('');
|
|
13
|
+
}
|
|
14
|
+
export function newId(kind) {
|
|
15
|
+
return `${ID_PREFIXES[kind]}_${randomAlphabet(ID_BODY_LENGTH)}`;
|
|
16
|
+
}
|
|
17
|
+
function idSchema(kind) {
|
|
18
|
+
return z.string().regex(new RegExp(`^${ID_PREFIXES[kind]}_[${CODE_ALPHABET}]{${ID_BODY_LENGTH}}$`), `expected a ${kind} id`);
|
|
19
|
+
}
|
|
20
|
+
export const RoomId = idSchema('room');
|
|
21
|
+
export const ParticipantId = idSchema('participant');
|
|
22
|
+
export const EventId = idSchema('event');
|
|
23
|
+
export const HandoverId = idSchema('handover');
|
|
24
|
+
export const SessionId = idSchema('session');
|
|
25
|
+
export const AttemptId = idSchema('attempt');
|
|
26
|
+
/** Generates a fresh invite code in canonical `XXXX-XXXX` form. */
|
|
27
|
+
export function newInviteCode(length = 8) {
|
|
28
|
+
return formatInviteCode(randomAlphabet(length));
|
|
29
|
+
}
|
|
30
|
+
/** Strips formatting and folds the characters Crockford treats as equivalent. Returns null when the result is not a well-formed code. */
|
|
31
|
+
export function normalizeInviteCode(input) {
|
|
32
|
+
const folded = input
|
|
33
|
+
.toUpperCase()
|
|
34
|
+
.replace(/[^0-9A-Z]/g, '')
|
|
35
|
+
.replace(/[IL]/g, '1')
|
|
36
|
+
.replace(/O/g, '0')
|
|
37
|
+
.replace(/U/g, 'V');
|
|
38
|
+
if (folded.length !== INVITE_CODE_LENGTH && folded.length !== 12) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return [...folded].every((char) => CODE_ALPHABET.includes(char)) ? folded : null;
|
|
42
|
+
}
|
|
43
|
+
export function formatInviteCode(normalized) {
|
|
44
|
+
return normalized.match(/.{1,4}/g).join('-');
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=ids.js.map
|
package/dist/ids.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.js","sourceRoot":"","sources":["../src/ids.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,4EAA4E;AAC5E,MAAM,CAAC,MAAM,aAAa,GAAG,kCAAkC,CAAC;AAEhE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAU,CAAC;AAI7I,SAAS,cAAc,CAAC,MAAc;IAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,oEAAoE;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAC9B,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC1B,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,aAAa,KAAK,cAAc,IAAI,CAAC,EAAE,cAAc,IAAI,KAAK,CAAC,CAAC;AACjI,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAE7C,mEAAmE;AACnE,MAAM,UAAU,aAAa,CAAC,SAAiB,CAAC;IAC5C,OAAO,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,yIAAyI;AACzI,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC7C,MAAM,MAAM,GAAG,KAAK;SACf,WAAW,EAAE;SACb,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAkB,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IAC/C,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './auto-close.js';
|
|
2
|
+
export * from './credentials.js';
|
|
3
|
+
export * from './errors.js';
|
|
4
|
+
export * from './events.js';
|
|
5
|
+
export * from './handover.js';
|
|
6
|
+
export * from './http.js';
|
|
7
|
+
export * from './ids.js';
|
|
8
|
+
export * from './names.js';
|
|
9
|
+
export * from './limits.js';
|
|
10
|
+
export * from './records.js';
|
|
11
|
+
export * from './wire.js';
|
|
12
|
+
export * from './requests.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAE1B,cAAc,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './auto-close.js';
|
|
2
|
+
export * from './credentials.js';
|
|
3
|
+
export * from './errors.js';
|
|
4
|
+
export * from './events.js';
|
|
5
|
+
export * from './handover.js';
|
|
6
|
+
export * from './http.js';
|
|
7
|
+
export * from './ids.js';
|
|
8
|
+
export * from './names.js';
|
|
9
|
+
export * from './limits.js';
|
|
10
|
+
export * from './records.js';
|
|
11
|
+
export * from './wire.js';
|
|
12
|
+
export * from './requests.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAE1B,cAAc,eAAe,CAAC"}
|
package/dist/limits.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a room may be joined.
|
|
3
|
+
*
|
|
4
|
+
* `open_to_guests` makes the room id sufficient to enter as a read-only guest.
|
|
5
|
+
* That turns the id into a bearer secret, and ids are printed by `list`, by
|
|
6
|
+
* errors, and in logs — which is why opening a room is a deliberate controller
|
|
7
|
+
* action rather than a default.
|
|
8
|
+
*/
|
|
9
|
+
export type JoinPolicy = 'invite_only' | 'open_to_guests';
|
|
10
|
+
/** What a plain `/invite` admits: a `member` who can speak, or a read-only `guest`. */
|
|
11
|
+
export type InviteRole = 'member' | 'guest';
|
|
12
|
+
/**
|
|
13
|
+
* When a room closes itself. One mode per room, so a closure has exactly one reason.
|
|
14
|
+
* `inactivity` counts from the last accepted `message` (replies included), or from
|
|
15
|
+
* creation when there is none; `age` counts from creation; `agents_and_guests_left`
|
|
16
|
+
* arms once an agent or read-only guest has joined and closes when none remain.
|
|
17
|
+
*/
|
|
18
|
+
export type AutoClosePolicy = {
|
|
19
|
+
mode: 'off';
|
|
20
|
+
} | {
|
|
21
|
+
mode: 'inactivity';
|
|
22
|
+
afterMs: number;
|
|
23
|
+
} | {
|
|
24
|
+
mode: 'age';
|
|
25
|
+
afterMs: number;
|
|
26
|
+
} | {
|
|
27
|
+
mode: 'agents_and_guests_left';
|
|
28
|
+
};
|
|
29
|
+
export type CloseReason = 'manual' | 'inactivity' | 'age' | 'agents_and_guests_left';
|
|
30
|
+
/** Shortest auto-close duration a relay accepts. */
|
|
31
|
+
export declare const MIN_AUTO_CLOSE_MS = 1000;
|
|
32
|
+
export interface RoomPolicy {
|
|
33
|
+
joinPolicy: JoinPolicy;
|
|
34
|
+
/** Absent on rooms created before invitation defaults existed, which means `member`. */
|
|
35
|
+
inviteRole?: InviteRole;
|
|
36
|
+
/** Absent means off. */
|
|
37
|
+
autoClose?: AutoClosePolicy;
|
|
38
|
+
/**
|
|
39
|
+
* Anyone on the relay's local network or tailnet may join by the room's name, as
|
|
40
|
+
* a member who can speak. Only a relay that can see where a request comes from
|
|
41
|
+
* (`pairlobby serve`) admits these joins; others refuse them. Absent means off.
|
|
42
|
+
*/
|
|
43
|
+
localJoin?: boolean;
|
|
44
|
+
maxParticipants: number;
|
|
45
|
+
maxEventPayloadBytes: number;
|
|
46
|
+
maxRetainedEventBytes: number;
|
|
47
|
+
maxRetainedEvents: number;
|
|
48
|
+
/** Milliseconds a new room lives, or null for a room that does not expire. */
|
|
49
|
+
roomLifetimeMs: number | null;
|
|
50
|
+
/** Milliseconds a new invite stays redeemable, or null for one that does not expire. */
|
|
51
|
+
inviteLifetimeMs: number | null;
|
|
52
|
+
exportWindowMs: number;
|
|
53
|
+
connectTicketLifetimeMs: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Neither rooms nor invites expire by default. The roadmap proposed 24-hour rooms
|
|
57
|
+
* and 10-minute invites; both were guesses, and a code that dies while you are
|
|
58
|
+
* still pasting it is worse than one that outlives its usefulness. Expiry is
|
|
59
|
+
* opt-in per room, per invite, or per device.
|
|
60
|
+
*
|
|
61
|
+
* Rooms do not expire by default. The roadmap proposed a 24-hour lifetime; in
|
|
62
|
+
* practice a room ending underneath a working pair is worse than one that
|
|
63
|
+
* outlives its usefulness, so expiry is opt-in per room or per device.
|
|
64
|
+
*
|
|
65
|
+
* The roadmap's proposed pairing of a 32 KiB payload cap with 10 MiB of retained
|
|
66
|
+
* payload admits only ~320 maximum-size events, which one 16-participant session
|
|
67
|
+
* exchanging handovers can reach. Retention is raised to 32 MiB and given an
|
|
68
|
+
* explicit event-count companion so both bounds are legible.
|
|
69
|
+
*/
|
|
70
|
+
export declare const DEFAULT_ROOM_POLICY: RoomPolicy;
|
|
71
|
+
/** Control, close, and export paths stay usable after ordinary writes hit quota. */
|
|
72
|
+
export declare const QUOTA_EXEMPT_EVENT_TYPES: readonly ["control.pause", "control.resume", "control.ack", "participant.revoked", "room.closed", "room.renamed", "room.expiry_changed", "room.access_changed", "room.auto_close_changed", "room.local_join_changed", "room.invitation_changed", "message.received", "conversation.turn_changed", "message.delivery_failed"];
|
|
73
|
+
export declare function isQuotaExempt(eventType: string): boolean;
|
|
74
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAE1D,uFAAuF;AACvF,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAAC,IAAI,EAAE,KAAK,CAAA;CAAC,GAAG;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG;IAAC,IAAI,EAAE,wBAAwB,CAAA;CAAC,CAAC;AAExJ,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,KAAK,GAAG,wBAAwB,CAAC;AAErF,oDAAoD;AACpD,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,wFAAwF;IACxF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,wBAAwB;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wFAAwF;IACxF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;CACnC;AAOD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAWjC,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,8TAe3B,CAAC;AAEX,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
package/dist/limits.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//! Starting product limits. These are product choices to validate, not platform
|
|
2
|
+
//! limits and not commercial entitlements.
|
|
3
|
+
/** Shortest auto-close duration a relay accepts. */
|
|
4
|
+
export const MIN_AUTO_CLOSE_MS = 1000;
|
|
5
|
+
const KIB = 1024;
|
|
6
|
+
const MIB = 1024 * KIB;
|
|
7
|
+
const MINUTE = 60_000;
|
|
8
|
+
const HOUR = 60 * MINUTE;
|
|
9
|
+
/**
|
|
10
|
+
* Neither rooms nor invites expire by default. The roadmap proposed 24-hour rooms
|
|
11
|
+
* and 10-minute invites; both were guesses, and a code that dies while you are
|
|
12
|
+
* still pasting it is worse than one that outlives its usefulness. Expiry is
|
|
13
|
+
* opt-in per room, per invite, or per device.
|
|
14
|
+
*
|
|
15
|
+
* Rooms do not expire by default. The roadmap proposed a 24-hour lifetime; in
|
|
16
|
+
* practice a room ending underneath a working pair is worse than one that
|
|
17
|
+
* outlives its usefulness, so expiry is opt-in per room or per device.
|
|
18
|
+
*
|
|
19
|
+
* The roadmap's proposed pairing of a 32 KiB payload cap with 10 MiB of retained
|
|
20
|
+
* payload admits only ~320 maximum-size events, which one 16-participant session
|
|
21
|
+
* exchanging handovers can reach. Retention is raised to 32 MiB and given an
|
|
22
|
+
* explicit event-count companion so both bounds are legible.
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_ROOM_POLICY = {
|
|
25
|
+
joinPolicy: 'invite_only',
|
|
26
|
+
inviteRole: 'member',
|
|
27
|
+
maxParticipants: 16,
|
|
28
|
+
maxEventPayloadBytes: 32 * KIB,
|
|
29
|
+
maxRetainedEventBytes: 32 * MIB,
|
|
30
|
+
maxRetainedEvents: 20_000,
|
|
31
|
+
roomLifetimeMs: null,
|
|
32
|
+
inviteLifetimeMs: null,
|
|
33
|
+
exportWindowMs: 24 * HOUR,
|
|
34
|
+
connectTicketLifetimeMs: 30_000
|
|
35
|
+
};
|
|
36
|
+
/** Control, close, and export paths stay usable after ordinary writes hit quota. */
|
|
37
|
+
export const QUOTA_EXEMPT_EVENT_TYPES = [
|
|
38
|
+
'control.pause',
|
|
39
|
+
'control.resume',
|
|
40
|
+
'control.ack',
|
|
41
|
+
'participant.revoked',
|
|
42
|
+
'room.closed',
|
|
43
|
+
'room.renamed',
|
|
44
|
+
'room.expiry_changed',
|
|
45
|
+
'room.access_changed',
|
|
46
|
+
'room.auto_close_changed',
|
|
47
|
+
'room.local_join_changed',
|
|
48
|
+
'room.invitation_changed',
|
|
49
|
+
'message.received',
|
|
50
|
+
'conversation.turn_changed',
|
|
51
|
+
'message.delivery_failed'
|
|
52
|
+
];
|
|
53
|
+
export function isQuotaExempt(eventType) {
|
|
54
|
+
return QUOTA_EXEMPT_EVENT_TYPES.includes(eventType);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,2CAA2C;AAyB3C,oDAAoD;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AA0BtC,MAAM,GAAG,GAAG,IAAI,CAAC;AACjB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,MAAM,MAAM,GAAG,MAAM,CAAC;AACtB,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC;AAEzB;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC3C,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,QAAQ;IACpB,eAAe,EAAE,EAAE;IACnB,oBAAoB,EAAE,EAAE,GAAG,GAAG;IAC9B,qBAAqB,EAAE,EAAE,GAAG,GAAG;IAC/B,iBAAiB,EAAE,MAAM;IACzB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,EAAE,GAAG,IAAI;IACzB,uBAAuB,EAAE,MAAM;CAClC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACpC,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,qBAAqB;IACrB,aAAa;IACb,cAAc;IACd,qBAAqB;IACrB,qBAAqB;IACrB,yBAAyB;IACzB,yBAAyB;IACzB,yBAAyB;IACzB,kBAAkB;IAClB,2BAA2B;IAC3B,yBAAyB;CACnB,CAAC;AAEX,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC3C,OAAQ,wBAA8C,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC"}
|
package/dist/names.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ParticipantName: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
3
|
+
export declare const NameSource: z.ZodEnum<["profile", "room"]>;
|
|
4
|
+
export type NameSource = z.infer<typeof NameSource>;
|
|
5
|
+
export declare const RenameSelfRequest: z.ZodObject<{
|
|
6
|
+
name: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
7
|
+
source: z.ZodDefault<z.ZodEnum<["profile", "room"]>>;
|
|
8
|
+
}, "strict", z.ZodTypeAny, {
|
|
9
|
+
name: string;
|
|
10
|
+
source: "profile" | "room";
|
|
11
|
+
}, {
|
|
12
|
+
name: string;
|
|
13
|
+
source?: "profile" | "room" | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type RenameSelfRequest = z.infer<typeof RenameSelfRequest>;
|
|
16
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,eAAe,yEAE6D,CAAC;AAE1F,eAAO,MAAM,UAAU,gCAA8B,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,iBAAiB;;;;;;;;;EAAiF,CAAC;AAChH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
package/dist/names.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const ParticipantName = z.string().trim().min(1).max(64)
|
|
3
|
+
.refine((name) => !/[\u0000-\u001f\u007f-\u009f]/u.test(name), 'names cannot contain control characters')
|
|
4
|
+
.refine((name) => name.toLowerCase() !== 'all', 'all is reserved for group mentions');
|
|
5
|
+
export const NameSource = z.enum(['profile', 'room']);
|
|
6
|
+
export const RenameSelfRequest = z.object({ name: ParticipantName, source: NameSource.default('room') }).strict();
|
|
7
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;KAC1D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,yCAAyC,CAAC;KACxG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,oCAAoC,CAAC,CAAC;AAE1F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAGtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC,MAAM,EAAE,CAAC"}
|