@lokiplay/protocol 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,3 +9,14 @@ npm install @lokiplay/protocol
9
9
 
10
10
  Schemas are exported as Zod schemas with corresponding inferred TypeScript
11
11
  types.
12
+
13
+ Protocol version 1 is accepted only by version-1 clients and servers. Clients
14
+ must reject a `minimumProtocolVersion` they do not support and must ignore
15
+ capabilities they did not negotiate. Additive optional fields are compatible;
16
+ changing required fields, meanings, opcodes, or error codes requires a new
17
+ protocol version.
18
+
19
+ Rooms are host-authoritative. Loki validates tenancy, membership, sequencing,
20
+ quotas, and host ownership, but it cannot prove that the elected host simulated
21
+ gameplay honestly. This contract is intended for casual and unranked games and
22
+ must not be used as a ranked anti-cheat boundary.
package/dist/index.d.ts CHANGED
@@ -28,6 +28,62 @@ export declare const RoomConfigSchema: z.ZodObject<{
28
28
  }>;
29
29
  maxPlayers: z.ZodNumber;
30
30
  teamSize: z.ZodOptional<z.ZodNumber>;
31
+ tickRate: z.ZodNumber;
32
+ }, z.core.$strict>;
33
+ export declare const PROTOCOL_VERSION: 1;
34
+ export declare const ErrorCodeSchema: z.ZodEnum<{
35
+ UNAUTHORIZED: "UNAUTHORIZED";
36
+ FORBIDDEN: "FORBIDDEN";
37
+ TENANT_MISMATCH: "TENANT_MISMATCH";
38
+ PROJECT_SUSPENDED: "PROJECT_SUSPENDED";
39
+ ROOM_NOT_FOUND: "ROOM_NOT_FOUND";
40
+ ROOM_FULL: "ROOM_FULL";
41
+ INVITE_INVALID: "INVITE_INVALID";
42
+ INVITE_EXPIRED: "INVITE_EXPIRED";
43
+ STALE_VERSION: "STALE_VERSION";
44
+ HOST_REQUIRED: "HOST_REQUIRED";
45
+ RATE_LIMITED: "RATE_LIMITED";
46
+ QUOTA_EXCEEDED: "QUOTA_EXCEEDED";
47
+ INVALID_MESSAGE: "INVALID_MESSAGE";
48
+ UNSUPPORTED_VERSION: "UNSUPPORTED_VERSION";
49
+ SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
50
+ }>;
51
+ export declare const CapabilitySchema: z.ZodEnum<{
52
+ matchmaking: "matchmaking";
53
+ rooms: "rooms";
54
+ invites: "invites";
55
+ host_migration: "host_migration";
56
+ reconnect: "reconnect";
57
+ presence: "presence";
58
+ chat: "chat";
59
+ private_leaderboards: "private_leaderboards";
60
+ }>;
61
+ export declare const ProtocolHelloSchema: z.ZodObject<{
62
+ protocolVersion: z.ZodLiteral<1>;
63
+ minimumProtocolVersion: z.ZodLiteral<1>;
64
+ capabilities: z.ZodArray<z.ZodEnum<{
65
+ matchmaking: "matchmaking";
66
+ rooms: "rooms";
67
+ invites: "invites";
68
+ host_migration: "host_migration";
69
+ reconnect: "reconnect";
70
+ presence: "presence";
71
+ chat: "chat";
72
+ private_leaderboards: "private_leaderboards";
73
+ }>>;
74
+ limits: z.ZodObject<{
75
+ maxPlayersPerRoom: z.ZodNumber;
76
+ maxMessageBytes: z.ZodNumber;
77
+ maxChatBytes: z.ZodNumber;
78
+ messagesPerSecond: z.ZodNumber;
79
+ }, z.core.$strip>;
80
+ }, z.core.$strict>;
81
+ export declare const PresenceSchema: z.ZodObject<{
82
+ playerId: z.ZodString;
83
+ sessionId: z.ZodString;
84
+ joinedAt: z.ZodNumber;
85
+ team: z.ZodOptional<z.ZodNumber>;
86
+ host: z.ZodBoolean;
31
87
  }, z.core.$strict>;
32
88
  export declare const ClientEnvelopeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
33
89
  type: z.ZodLiteral<"action">;
@@ -49,6 +105,29 @@ export declare const ClientEnvelopeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
49
105
  protocolVersion: z.ZodLiteral<1>;
50
106
  roomId: z.ZodString;
51
107
  sequence: z.ZodNumber;
108
+ }, z.core.$strip>, z.ZodObject<{
109
+ type: z.ZodLiteral<"snapshot_request">;
110
+ protocolVersion: z.ZodLiteral<1>;
111
+ roomId: z.ZodString;
112
+ sequence: z.ZodNumber;
113
+ }, z.core.$strip>, z.ZodObject<{
114
+ type: z.ZodLiteral<"chat">;
115
+ channel: z.ZodEnum<{
116
+ lobby: "lobby";
117
+ match: "match";
118
+ }>;
119
+ text: z.ZodString;
120
+ protocolVersion: z.ZodLiteral<1>;
121
+ roomId: z.ZodString;
122
+ sequence: z.ZodNumber;
123
+ }, z.core.$strip>, z.ZodObject<{
124
+ type: z.ZodLiteral<"score_submit">;
125
+ leaderboardId: z.ZodString;
126
+ score: z.ZodNumber;
127
+ subscore: z.ZodDefault<z.ZodNumber>;
128
+ protocolVersion: z.ZodLiteral<1>;
129
+ roomId: z.ZodString;
130
+ sequence: z.ZodNumber;
52
131
  }, z.core.$strip>], "type">;
53
132
  export declare const ServerEnvelopeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
54
133
  type: z.ZodLiteral<"snapshot">;
@@ -64,17 +143,112 @@ export declare const ServerEnvelopeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
64
143
  protocolVersion: z.ZodLiteral<1>;
65
144
  roomId: z.ZodString;
66
145
  sequence: z.ZodNumber;
146
+ }, z.core.$strip>, z.ZodObject<{
147
+ type: z.ZodLiteral<"action">;
148
+ senderId: z.ZodString;
149
+ payload: z.ZodUnknown;
150
+ protocolVersion: z.ZodLiteral<1>;
151
+ roomId: z.ZodString;
152
+ sequence: z.ZodNumber;
153
+ }, z.core.$strip>, z.ZodObject<{
154
+ type: z.ZodLiteral<"event">;
155
+ senderId: z.ZodString;
156
+ reliable: z.ZodBoolean;
157
+ payload: z.ZodUnknown;
158
+ protocolVersion: z.ZodLiteral<1>;
159
+ roomId: z.ZodString;
160
+ sequence: z.ZodNumber;
161
+ }, z.core.$strip>, z.ZodObject<{
162
+ type: z.ZodLiteral<"presence">;
163
+ joins: z.ZodArray<z.ZodObject<{
164
+ playerId: z.ZodString;
165
+ sessionId: z.ZodString;
166
+ joinedAt: z.ZodNumber;
167
+ team: z.ZodOptional<z.ZodNumber>;
168
+ host: z.ZodBoolean;
169
+ }, z.core.$strict>>;
170
+ leaves: z.ZodArray<z.ZodObject<{
171
+ playerId: z.ZodString;
172
+ sessionId: z.ZodString;
173
+ joinedAt: z.ZodNumber;
174
+ team: z.ZodOptional<z.ZodNumber>;
175
+ host: z.ZodBoolean;
176
+ }, z.core.$strict>>;
177
+ members: z.ZodArray<z.ZodObject<{
178
+ playerId: z.ZodString;
179
+ sessionId: z.ZodString;
180
+ joinedAt: z.ZodNumber;
181
+ team: z.ZodOptional<z.ZodNumber>;
182
+ host: z.ZodBoolean;
183
+ }, z.core.$strict>>;
184
+ protocolVersion: z.ZodLiteral<1>;
185
+ roomId: z.ZodString;
186
+ sequence: z.ZodNumber;
187
+ }, z.core.$strip>, z.ZodObject<{
188
+ type: z.ZodLiteral<"host_changed">;
189
+ previousHostId: z.ZodOptional<z.ZodString>;
190
+ hostId: z.ZodString;
191
+ stateVersion: z.ZodNumber;
192
+ protocolVersion: z.ZodLiteral<1>;
193
+ roomId: z.ZodString;
194
+ sequence: z.ZodNumber;
195
+ }, z.core.$strip>, z.ZodObject<{
196
+ type: z.ZodLiteral<"chat">;
197
+ channel: z.ZodEnum<{
198
+ lobby: "lobby";
199
+ match: "match";
200
+ }>;
201
+ messageId: z.ZodString;
202
+ senderId: z.ZodString;
203
+ text: z.ZodString;
204
+ sentAt: z.ZodNumber;
205
+ protocolVersion: z.ZodLiteral<1>;
206
+ roomId: z.ZodString;
207
+ sequence: z.ZodNumber;
208
+ }, z.core.$strip>, z.ZodObject<{
209
+ type: z.ZodLiteral<"leaderboard">;
210
+ leaderboardId: z.ZodString;
211
+ records: z.ZodArray<z.ZodObject<{
212
+ playerId: z.ZodString;
213
+ score: z.ZodNumber;
214
+ subscore: z.ZodNumber;
215
+ rank: z.ZodNumber;
216
+ }, z.core.$strip>>;
217
+ protocolVersion: z.ZodLiteral<1>;
218
+ roomId: z.ZodString;
219
+ sequence: z.ZodNumber;
220
+ }, z.core.$strip>, z.ZodObject<{
221
+ type: z.ZodLiteral<"room_closed">;
222
+ reason: z.ZodEnum<{
223
+ suspended: "suspended";
224
+ empty: "empty";
225
+ shutdown: "shutdown";
226
+ quota: "quota";
227
+ }>;
228
+ protocolVersion: z.ZodLiteral<1>;
229
+ roomId: z.ZodString;
230
+ sequence: z.ZodNumber;
67
231
  }, z.core.$strip>, z.ZodObject<{
68
232
  type: z.ZodLiteral<"error">;
69
233
  code: z.ZodEnum<{
70
234
  UNAUTHORIZED: "UNAUTHORIZED";
235
+ FORBIDDEN: "FORBIDDEN";
71
236
  TENANT_MISMATCH: "TENANT_MISMATCH";
237
+ PROJECT_SUSPENDED: "PROJECT_SUSPENDED";
238
+ ROOM_NOT_FOUND: "ROOM_NOT_FOUND";
239
+ ROOM_FULL: "ROOM_FULL";
240
+ INVITE_INVALID: "INVITE_INVALID";
241
+ INVITE_EXPIRED: "INVITE_EXPIRED";
72
242
  STALE_VERSION: "STALE_VERSION";
73
243
  HOST_REQUIRED: "HOST_REQUIRED";
74
244
  RATE_LIMITED: "RATE_LIMITED";
245
+ QUOTA_EXCEEDED: "QUOTA_EXCEEDED";
75
246
  INVALID_MESSAGE: "INVALID_MESSAGE";
247
+ UNSUPPORTED_VERSION: "UNSUPPORTED_VERSION";
248
+ SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
76
249
  }>;
77
250
  message: z.ZodString;
251
+ retryAfterMs: z.ZodOptional<z.ZodNumber>;
78
252
  protocolVersion: z.ZodLiteral<1>;
79
253
  roomId: z.ZodString;
80
254
  sequence: z.ZodNumber;
@@ -93,6 +267,10 @@ export declare const PlayerSessionClaimsSchema: z.ZodObject<{
93
267
  export type ProjectState = z.infer<typeof ProjectStateSchema>;
94
268
  export type GameManifest = z.infer<typeof GameManifestSchema>;
95
269
  export type RoomConfig = z.infer<typeof RoomConfigSchema>;
270
+ export type ErrorCode = z.infer<typeof ErrorCodeSchema>;
271
+ export type Capability = z.infer<typeof CapabilitySchema>;
272
+ export type ProtocolHello = z.infer<typeof ProtocolHelloSchema>;
273
+ export type Presence = z.infer<typeof PresenceSchema>;
96
274
  export type ClientEnvelope = z.infer<typeof ClientEnvelopeSchema>;
97
275
  export type ServerEnvelope = z.infer<typeof ServerEnvelopeSchema>;
98
276
  export type PlayerSessionClaims = z.infer<typeof PlayerSessionClaimsSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;EAO7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;kBAiBpB,CAAC;AAEZ,eAAO,MAAM,gBAAgB;;;;;;;;;kBAW1B,CAAC;AAQJ,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;2BAkB/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA0B/B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;kBAY3B,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqBpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;EAO7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;kBAiBpB,CAAC;AAEZ,eAAO,MAAM,gBAAgB;;;;;;;;;;kBAY1B,CAAC;AAEJ,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAE3C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;EAgB1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;EAS3B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;kBAYrB,CAAC;AAEZ,eAAO,MAAM,cAAc;;;;;;kBAQhB,CAAC;AAQZ,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmC/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA0E/B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;kBAY3B,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqBpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhD"}
package/dist/index.js CHANGED
@@ -32,12 +32,63 @@ export const RoomConfigSchema = z
32
32
  visibility: z.enum(["private", "unlisted", "matchmaking"]),
33
33
  maxPlayers: z.number().int().min(1).max(16),
34
34
  teamSize: z.number().int().min(1).max(16).optional(),
35
+ tickRate: z.number().int().min(1).max(10),
35
36
  })
36
37
  .strict()
37
38
  .refine((value) => !value.teamSize || value.maxPlayers % value.teamSize === 0, "teamSize must divide maxPlayers");
39
+ export const PROTOCOL_VERSION = 1;
40
+ export const ErrorCodeSchema = z.enum([
41
+ "UNAUTHORIZED",
42
+ "FORBIDDEN",
43
+ "TENANT_MISMATCH",
44
+ "PROJECT_SUSPENDED",
45
+ "ROOM_NOT_FOUND",
46
+ "ROOM_FULL",
47
+ "INVITE_INVALID",
48
+ "INVITE_EXPIRED",
49
+ "STALE_VERSION",
50
+ "HOST_REQUIRED",
51
+ "RATE_LIMITED",
52
+ "QUOTA_EXCEEDED",
53
+ "INVALID_MESSAGE",
54
+ "UNSUPPORTED_VERSION",
55
+ "SERVICE_UNAVAILABLE",
56
+ ]);
57
+ export const CapabilitySchema = z.enum([
58
+ "rooms",
59
+ "invites",
60
+ "matchmaking",
61
+ "host_migration",
62
+ "reconnect",
63
+ "presence",
64
+ "chat",
65
+ "private_leaderboards",
66
+ ]);
67
+ export const ProtocolHelloSchema = z
68
+ .object({
69
+ protocolVersion: z.literal(PROTOCOL_VERSION),
70
+ minimumProtocolVersion: z.literal(PROTOCOL_VERSION),
71
+ capabilities: z.array(CapabilitySchema),
72
+ limits: z.object({
73
+ maxPlayersPerRoom: z.number().int().min(1).max(16),
74
+ maxMessageBytes: z.number().int().positive(),
75
+ maxChatBytes: z.number().int().positive(),
76
+ messagesPerSecond: z.number().int().positive(),
77
+ }),
78
+ })
79
+ .strict();
80
+ export const PresenceSchema = z
81
+ .object({
82
+ playerId: z.string().min(1).max(128),
83
+ sessionId: z.string().min(1).max(128),
84
+ joinedAt: z.number().int().nonnegative(),
85
+ team: z.number().int().nonnegative().optional(),
86
+ host: z.boolean(),
87
+ })
88
+ .strict();
38
89
  const EnvelopeBase = {
39
90
  protocolVersion: z.literal(1),
40
- roomId: z.string().uuid(),
91
+ roomId: z.string().min(1).max(256),
41
92
  sequence: z.number().int().nonnegative(),
42
93
  };
43
94
  export const ClientEnvelopeSchema = z.discriminatedUnion("type", [
@@ -58,6 +109,23 @@ export const ClientEnvelopeSchema = z.discriminatedUnion("type", [
58
109
  expectedVersion: z.number().int().nonnegative(),
59
110
  state: z.unknown(),
60
111
  }),
112
+ z.object({
113
+ ...EnvelopeBase,
114
+ type: z.literal("snapshot_request"),
115
+ }),
116
+ z.object({
117
+ ...EnvelopeBase,
118
+ type: z.literal("chat"),
119
+ channel: z.enum(["lobby", "match"]),
120
+ text: z.string().trim().min(1).max(500),
121
+ }),
122
+ z.object({
123
+ ...EnvelopeBase,
124
+ type: z.literal("score_submit"),
125
+ leaderboardId: z.string().regex(/^[a-z0-9-]{1,64}$/),
126
+ score: z.number().int(),
127
+ subscore: z.number().int().default(0),
128
+ }),
61
129
  ]);
62
130
  export const ServerEnvelopeSchema = z.discriminatedUnion("type", [
63
131
  z.object({
@@ -72,18 +140,64 @@ export const ServerEnvelopeSchema = z.discriminatedUnion("type", [
72
140
  hostId: z.string().uuid(),
73
141
  state: z.unknown(),
74
142
  }),
143
+ z.object({
144
+ ...EnvelopeBase,
145
+ type: z.literal("action"),
146
+ senderId: z.string().min(1).max(128),
147
+ payload: z.unknown(),
148
+ }),
149
+ z.object({
150
+ ...EnvelopeBase,
151
+ type: z.literal("event"),
152
+ senderId: z.string().min(1).max(128),
153
+ reliable: z.boolean(),
154
+ payload: z.unknown(),
155
+ }),
156
+ z.object({
157
+ ...EnvelopeBase,
158
+ type: z.literal("presence"),
159
+ joins: z.array(PresenceSchema),
160
+ leaves: z.array(PresenceSchema),
161
+ members: z.array(PresenceSchema),
162
+ }),
163
+ z.object({
164
+ ...EnvelopeBase,
165
+ type: z.literal("host_changed"),
166
+ previousHostId: z.string().min(1).max(128).optional(),
167
+ hostId: z.string().min(1).max(128),
168
+ stateVersion: z.number().int().nonnegative(),
169
+ }),
170
+ z.object({
171
+ ...EnvelopeBase,
172
+ type: z.literal("chat"),
173
+ channel: z.enum(["lobby", "match"]),
174
+ messageId: z.string().min(1).max(128),
175
+ senderId: z.string().min(1).max(128),
176
+ text: z.string().min(1).max(500),
177
+ sentAt: z.number().int().nonnegative(),
178
+ }),
179
+ z.object({
180
+ ...EnvelopeBase,
181
+ type: z.literal("leaderboard"),
182
+ leaderboardId: z.string().regex(/^[a-z0-9-]{1,64}$/),
183
+ records: z.array(z.object({
184
+ playerId: z.string().min(1).max(128),
185
+ score: z.number().int(),
186
+ subscore: z.number().int(),
187
+ rank: z.number().int().positive(),
188
+ })),
189
+ }),
190
+ z.object({
191
+ ...EnvelopeBase,
192
+ type: z.literal("room_closed"),
193
+ reason: z.enum(["empty", "suspended", "shutdown", "quota"]),
194
+ }),
75
195
  z.object({
76
196
  ...EnvelopeBase,
77
197
  type: z.literal("error"),
78
- code: z.enum([
79
- "UNAUTHORIZED",
80
- "TENANT_MISMATCH",
81
- "STALE_VERSION",
82
- "HOST_REQUIRED",
83
- "RATE_LIMITED",
84
- "INVALID_MESSAGE",
85
- ]),
198
+ code: ErrorCodeSchema,
86
199
  message: z.string().max(200),
200
+ retryAfterMs: z.number().int().positive().optional(),
87
201
  }),
88
202
  ]);
89
203
  export const PlayerSessionClaimsSchema = z
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC;IACvC,OAAO;IACP,SAAS;IACT,UAAU;IACV,kBAAkB;IAClB,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACtC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,KAAK,CAAC,0DAA0D,CAAC;IACpE,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;QACpB,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;KAC1C,CAAC;SACD,QAAQ,EAAE;IACb,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChE,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,EACrE,iCAAiC,CAClC,CAAC;AAEJ,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACzB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;QACpB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KACpC,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QAC7B,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;QAC/C,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;KACnB,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;KACnB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;KACnB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YACX,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,eAAe;YACf,cAAc;YACd,iBAAiB;SAClB,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC7B,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CACzB,CAAC;KACD,MAAM,EAAE,CAAC;AASZ,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC3B,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACpE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ {
2
+ "manifest": {
3
+ "schemaVersion": 1,
4
+ "name": "Counter Party",
5
+ "entrypoint": "index.html",
6
+ "multiplayer": {
7
+ "enabled": true,
8
+ "authority": "host",
9
+ "maxPlayers": 8,
10
+ "tickRate": 10
11
+ },
12
+ "networkAllowlist": []
13
+ },
14
+ "canonicalState": {
15
+ "input": { "players": ["a", "b"], "score": { "b": 1, "a": 2 }, "tick": 7 },
16
+ "json": "{\"players\":[\"a\",\"b\"],\"score\":{\"a\":2,\"b\":1},\"tick\":7}",
17
+ "sha256": "039c5612a00a3ea03835619893ad0b6ddadcf6e331a0b1be69e0ad89fb5e676c"
18
+ },
19
+ "hello": {
20
+ "protocolVersion": 1,
21
+ "minimumProtocolVersion": 1,
22
+ "capabilities": ["rooms", "invites", "matchmaking", "host_migration", "reconnect", "presence", "chat", "private_leaderboards"],
23
+ "limits": {
24
+ "maxPlayersPerRoom": 16,
25
+ "maxMessageBytes": 16384,
26
+ "maxChatBytes": 500,
27
+ "messagesPerSecond": 10
28
+ }
29
+ },
30
+ "roomConfig": {
31
+ "roomKey": "fixture-room",
32
+ "visibility": "private",
33
+ "maxPlayers": 8,
34
+ "teamSize": 2,
35
+ "tickRate": 10
36
+ },
37
+ "clientMessages": [
38
+ {
39
+ "protocolVersion": 1,
40
+ "roomId": "00000000-0000-4000-8000-000000000001",
41
+ "sequence": 1,
42
+ "type": "action",
43
+ "payload": { "move": 1 }
44
+ },
45
+ {
46
+ "protocolVersion": 1,
47
+ "roomId": "00000000-0000-4000-8000-000000000001",
48
+ "sequence": 2,
49
+ "type": "host_state",
50
+ "expectedVersion": 0,
51
+ "state": { "tick": 1 }
52
+ },
53
+ {
54
+ "protocolVersion": 1,
55
+ "roomId": "00000000-0000-4000-8000-000000000001",
56
+ "sequence": 3,
57
+ "type": "chat",
58
+ "channel": "match",
59
+ "text": "ready"
60
+ }
61
+ ],
62
+ "serverReplay": [
63
+ {
64
+ "protocolVersion": 1,
65
+ "roomId": "00000000-0000-4000-8000-000000000001",
66
+ "sequence": 0,
67
+ "type": "snapshot",
68
+ "hostId": "00000000-0000-4000-8000-000000000002",
69
+ "state": { "tick": 0 }
70
+ },
71
+ {
72
+ "protocolVersion": 1,
73
+ "roomId": "00000000-0000-4000-8000-000000000001",
74
+ "sequence": 1,
75
+ "type": "host_changed",
76
+ "previousHostId": "00000000-0000-4000-8000-000000000002",
77
+ "hostId": "00000000-0000-4000-8000-000000000003",
78
+ "stateVersion": 0
79
+ },
80
+ {
81
+ "protocolVersion": 1,
82
+ "roomId": "00000000-0000-4000-8000-000000000001",
83
+ "sequence": 2,
84
+ "type": "error",
85
+ "code": "RATE_LIMITED",
86
+ "message": "message rate exceeded",
87
+ "retryAfterMs": 1000
88
+ }
89
+ ]
90
+ }
package/package.json CHANGED
@@ -1,12 +1,22 @@
1
1
  {
2
2
  "name": "@lokiplay/protocol",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Shared schemas, message types, and hashing utilities for Loki.",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/sanbornli/loki.git",
9
+ "directory": "packages/protocol"
10
+ },
11
+ "homepage": "https://github.com/sanbornli/loki#readme",
12
+ "bugs": "https://github.com/sanbornli/loki/issues",
6
13
  "type": "module",
7
14
  "files": [
8
15
  "dist",
9
- "README.md"
16
+ "fixtures",
17
+ "schema",
18
+ "README.md",
19
+ "LICENSE"
10
20
  ],
11
21
  "main": "./dist/index.js",
12
22
  "types": "./dist/index.d.ts",
@@ -0,0 +1,88 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.lokiplay.dev/game/v1.json",
4
+ "title": "Loki game manifest",
5
+ "$defs": {
6
+ "errorCode": {
7
+ "enum": [
8
+ "UNAUTHORIZED",
9
+ "FORBIDDEN",
10
+ "TENANT_MISMATCH",
11
+ "PROJECT_SUSPENDED",
12
+ "ROOM_NOT_FOUND",
13
+ "ROOM_FULL",
14
+ "INVITE_INVALID",
15
+ "INVITE_EXPIRED",
16
+ "STALE_VERSION",
17
+ "HOST_REQUIRED",
18
+ "RATE_LIMITED",
19
+ "QUOTA_EXCEEDED",
20
+ "INVALID_MESSAGE",
21
+ "UNSUPPORTED_VERSION",
22
+ "SERVICE_UNAVAILABLE"
23
+ ]
24
+ },
25
+ "roomConfig": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": ["roomKey", "visibility", "maxPlayers", "tickRate"],
29
+ "properties": {
30
+ "roomKey": { "type": "string", "pattern": "^[a-z0-9-]{1,64}$" },
31
+ "visibility": { "enum": ["private", "unlisted", "matchmaking"] },
32
+ "maxPlayers": { "type": "integer", "minimum": 1, "maximum": 16 },
33
+ "teamSize": { "type": "integer", "minimum": 1, "maximum": 16 },
34
+ "tickRate": { "type": "integer", "minimum": 1, "maximum": 10 }
35
+ }
36
+ },
37
+ "envelopeBase": {
38
+ "type": "object",
39
+ "required": ["protocolVersion", "roomId", "sequence", "type"],
40
+ "properties": {
41
+ "protocolVersion": { "const": 1 },
42
+ "roomId": { "type": "string", "minLength": 1, "maxLength": 256 },
43
+ "sequence": { "type": "integer", "minimum": 0 },
44
+ "type": { "type": "string" }
45
+ }
46
+ },
47
+ "capability": {
48
+ "enum": [
49
+ "rooms",
50
+ "invites",
51
+ "matchmaking",
52
+ "host_migration",
53
+ "reconnect",
54
+ "presence",
55
+ "chat",
56
+ "private_leaderboards"
57
+ ]
58
+ }
59
+ },
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["schemaVersion", "name", "entrypoint"],
63
+ "properties": {
64
+ "schemaVersion": { "const": 1 },
65
+ "name": { "type": "string", "minLength": 1, "maxLength": 80 },
66
+ "entrypoint": {
67
+ "type": "string",
68
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[A-Za-z0-9._/-]+\\.html$"
69
+ },
70
+ "multiplayer": {
71
+ "type": "object",
72
+ "additionalProperties": false,
73
+ "required": ["enabled", "authority", "maxPlayers", "tickRate"],
74
+ "properties": {
75
+ "enabled": { "type": "boolean" },
76
+ "authority": { "const": "host" },
77
+ "maxPlayers": { "type": "integer", "minimum": 1, "maximum": 16 },
78
+ "tickRate": { "type": "integer", "minimum": 1, "maximum": 10 }
79
+ }
80
+ },
81
+ "networkAllowlist": {
82
+ "type": "array",
83
+ "maxItems": 10,
84
+ "items": { "type": "string", "format": "uri" },
85
+ "default": []
86
+ }
87
+ }
88
+ }