@yyyu-star/arcade-kit 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +43 -0
  3. package/dist/client.d.ts +44 -1
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +103 -0
  6. package/dist/client.js.map +1 -1
  7. package/dist/fun-logic.d.ts +14 -2
  8. package/dist/fun-logic.d.ts.map +1 -1
  9. package/dist/fun-logic.js +19 -4
  10. package/dist/fun-logic.js.map +1 -1
  11. package/dist/game.d.ts +7 -0
  12. package/dist/game.d.ts.map +1 -1
  13. package/dist/game.js +38 -0
  14. package/dist/game.js.map +1 -1
  15. package/dist/internal.d.ts +4 -0
  16. package/dist/internal.d.ts.map +1 -1
  17. package/dist/internal.js +6 -0
  18. package/dist/internal.js.map +1 -1
  19. package/dist/match.d.ts +85 -0
  20. package/dist/match.d.ts.map +1 -0
  21. package/dist/match.js +361 -0
  22. package/dist/match.js.map +1 -0
  23. package/dist/meter.d.ts +38 -0
  24. package/dist/meter.d.ts.map +1 -1
  25. package/dist/meter.js +56 -14
  26. package/dist/meter.js.map +1 -1
  27. package/dist/protocol.d.ts +35 -0
  28. package/dist/protocol.d.ts.map +1 -1
  29. package/dist/protocol.js.map +1 -1
  30. package/dist/room.d.ts +48 -1
  31. package/dist/room.d.ts.map +1 -1
  32. package/dist/room.js +157 -17
  33. package/dist/room.js.map +1 -1
  34. package/dist/table-chat.d.ts +2 -0
  35. package/dist/table-chat.d.ts.map +1 -1
  36. package/dist/table-chat.js +25 -2
  37. package/dist/table-chat.js.map +1 -1
  38. package/dist/table-fun.d.ts.map +1 -1
  39. package/dist/table-fun.js +4 -4
  40. package/dist/table-fun.js.map +1 -1
  41. package/dist/worker.d.ts +12 -0
  42. package/dist/worker.d.ts.map +1 -1
  43. package/dist/worker.js +44 -1
  44. package/dist/worker.js.map +1 -1
  45. package/package.json +5 -1
  46. package/src/client.ts +118 -1
  47. package/src/fun-logic.ts +31 -4
  48. package/src/game.ts +40 -0
  49. package/src/internal.ts +8 -0
  50. package/src/match.ts +371 -0
  51. package/src/meter.ts +68 -12
  52. package/src/protocol.ts +41 -0
  53. package/src/room.ts +171 -18
  54. package/src/table-chat.ts +25 -3
  55. package/src/table-fun.ts +4 -3
  56. package/src/worker.ts +44 -2
package/dist/match.js ADDED
@@ -0,0 +1,361 @@
1
+ /**
2
+ * 快速匹配的排队(0.20.0,设计 docs/match.md):游戏 Worker 里的 Durable Object 继承它,填上一桌几个真人,就能按档位排队凑桌。
3
+ * 每个档位一个实例(matchStub 按档位取),浏览器经 worker.ts 的 acceptMatch 连进来,连接本身就是"排着"。
4
+ *
5
+ * 守的规矩(和房间同一套,docs/platform-backend.md 第 4 节):
6
+ * - 0 行存储:排着的人就是 ctx.getWebSockets(),附件里只放 userId、昵称、开始排的时间;被驱逐后名单还在;
7
+ * - 只用一个闹钟:最早那个人等满 waitMs 的时刻,只往早了调(setAlarm 也算一行写入);
8
+ * - 只用 ctx.acceptWebSocket,不用 setTimeout / setInterval;排队连接只收不发,浏览器发什么都 1008 断开;
9
+ * - 不碰牌局:不 import 规则、不读房间状态。电脑补位、公平底线全在房间里,和好友房一样;
10
+ * - 名额由房间开桌时向计量一次占齐(kitCreateMatch),排队本身不占。
11
+ */
12
+ import { DurableObject } from 'cloudflare:workers';
13
+ import { KIT_HOST, newRoomCode, parseIdentity, roomStub } from './internal.js';
14
+ import { CLOSE } from './protocol.js';
15
+ /** 开桌时房间码撞了最多再换几次 */
16
+ const CODE_TRIES = 5;
17
+ /** 一次凑桌最多重来几轮(有人被计量挡掉、请出去以后接着凑) */
18
+ const FORM_ROUNDS = 8;
19
+ /** 平台屏蔽名单一次最多问几个人(平台 blockedAmong 的上限,德州 9 人桌) */
20
+ const BLOCK_MAX = 9;
21
+ /**
22
+ * 凑桌时找平台、找房间最多等多久(毫秒,安全审阅 0.20.0):凑桌持着"正在凑"的锁,平台或房间卡住时整个档位都会一直"等待中"。
23
+ * 超时的屏蔽名单按空的算,建房按 unavailable(这一桌的人转单机)
24
+ */
25
+ export const MATCH_CALL_MS = 3_000;
26
+ export class MatchQueue extends DurableObject {
27
+ /** 最多等多久(毫秒):到点 ≥ 2 人就开,只剩自己就转单机 */
28
+ waitMs = 15_000;
29
+ /** 一个档位最多排几个人,满了 1013(挡刷连接) */
30
+ maxQueue = 200;
31
+ /** 每人每小时最多排几次,超了 4029(内存里记,被驱逐就清零,接受) */
32
+ perHour = 30;
33
+ /** 凑桌时找平台、找房间最多等多久(毫秒,见 MATCH_CALL_MS) */
34
+ callMs = MATCH_CALL_MS;
35
+ /** 这个档位一桌最多几个真人;默认 seats */
36
+ tableSize(_tier) {
37
+ return this.seats;
38
+ }
39
+ /** 这个档位开桌带的开局选项(交给房间的 RoomGame.options 校验);默认不带 */
40
+ roomOptions(_tier) {
41
+ return undefined;
42
+ }
43
+ /**
44
+ * 这几个人之间谁屏蔽了谁(平台 0.25.0 的 ARCADE.blockedAmong,最多 9 人,只读)。没有平台(单独部署)、出错都当没有,回 []。
45
+ * 测试覆盖它换成假名单
46
+ */
47
+ async blockedAmong(userIds) {
48
+ const arcade = this.env.ARCADE;
49
+ if (!arcade || userIds.length < 2)
50
+ return [];
51
+ try {
52
+ const out = await arcade.blockedAmong(userIds.slice(0, BLOCK_MAX));
53
+ return Array.isArray(out) ? out.filter((p) => Array.isArray(p) && typeof p[0] === 'string' && typeof p[1] === 'string') : [];
54
+ }
55
+ catch (e) {
56
+ console.error('blockedAmong failed, matching without it', e instanceof Error ? e.message : e);
57
+ return [];
58
+ }
59
+ }
60
+ /** 开一张匹配桌(房间的 kitCreateMatch)。游戏不用覆盖;kit 的测试用它模拟房间卡住 */
61
+ createMatchRoom(code, players, opts) {
62
+ const stub = roomStub(this.env.ROOM, code);
63
+ return stub.kitCreateMatch(code, players, opts);
64
+ }
65
+ /** 现在设着的闹钟;undefined 是还不知道,用前 getAlarm() 读 */
66
+ alarmAt;
67
+ /** 正在凑桌(中间 await 了平台和房间):这时进来的人、到点的闹钟只记一笔,凑完再来一轮 */
68
+ forming = false;
69
+ again = false;
70
+ /** 凑桌途中已经选中的人:别的一轮不再选他们 */
71
+ taken = new Set();
72
+ /** 每人这一小时排了几次 */
73
+ hourly = new Map();
74
+ constructor(ctx, env) {
75
+ super(ctx, env);
76
+ ctx.setWebSocketAutoResponse(new WebSocketRequestResponsePair('ping', 'pong'));
77
+ }
78
+ /** 入队:只认 kit 自己拼的内部地址(worker.ts 的 acceptMatch),身份在 x-kit-user 头里。 */
79
+ async fetch(request) {
80
+ const url = new URL(request.url);
81
+ if (url.hostname !== KIT_HOST || url.pathname !== '/match' || request.headers.get('upgrade')?.toLowerCase() !== 'websocket') {
82
+ return new Response('not a kit request', { status: 400 });
83
+ }
84
+ const me = parseIdentity(request.headers.get('x-kit-user'));
85
+ const tier = url.searchParams.get('tier');
86
+ if (!me || !tier)
87
+ return new Response('no identity', { status: 401 });
88
+ const pair = new WebSocketPair();
89
+ const [client, server] = [pair[0], pair[1]];
90
+ this.ctx.acceptWebSocket(server);
91
+ const done = new Response(null, { status: 101, webSocket: client });
92
+ const now = Date.now();
93
+ // 只数还排着的(附件还在):已经出队、正在关的连接不占队长
94
+ const others = this.waiting().filter((o) => o !== server);
95
+ const mine = others.filter((o) => waiterOf(o)?.userId === me.userId);
96
+ if (others.length - mine.length >= this.maxQueue) {
97
+ server.close(CLOSE.tryLater, 'queue full');
98
+ return done;
99
+ }
100
+ // 一小时前的旧条目顺手清掉(排过一次就走的人不能让这张表一直涨)
101
+ for (const [u, ts] of this.hourly)
102
+ if (now - ts[ts.length - 1] >= 3_600_000)
103
+ this.hourly.delete(u);
104
+ const times = (this.hourly.get(me.userId) ?? []).filter((t) => now - t < 3_600_000);
105
+ if (times.length >= this.perHour) {
106
+ this.hourly.set(me.userId, times);
107
+ server.close(CLOSE.tooManyJoins, 'too often');
108
+ return done;
109
+ }
110
+ times.push(now);
111
+ this.hourly.set(me.userId, times);
112
+ // 同一个人只排一次:旧的那条让位
113
+ for (const o of mine)
114
+ this.drop(o, CLOSE.replaced, 'replaced');
115
+ server.serializeAttachment({ userId: me.userId, name: me.name, since: now, tier });
116
+ // 先回 101 再凑桌:凑桌要找平台、房间,不能让新来的人连连接都拿不到
117
+ this.ctx.waitUntil(this.form());
118
+ return done;
119
+ }
120
+ /** 排队连接只收不发:发什么都断开(不让它变成能刷的入口) */
121
+ async webSocketMessage(ws) {
122
+ this.drop(ws, CLOSE.policy, 'queue is receive-only');
123
+ this.pushWaiting();
124
+ }
125
+ async webSocketClose(ws, code) {
126
+ try {
127
+ ws.close(code === 1005 || code === 1006 ? 1000 : code, 'bye');
128
+ }
129
+ catch {
130
+ // 已经关了
131
+ }
132
+ ws.serializeAttachment(null);
133
+ this.pushWaiting();
134
+ }
135
+ async webSocketError(ws) {
136
+ ws.serializeAttachment(null);
137
+ this.pushWaiting();
138
+ }
139
+ async alarm() {
140
+ this.alarmAt = null;
141
+ try {
142
+ await this.form();
143
+ }
144
+ catch (e) {
145
+ // 闹钟里不往外抛(会自动重试、每次计费)
146
+ console.error('match alarm failed', e instanceof Error ? e.message : e);
147
+ }
148
+ }
149
+ // ---------- 凑桌 ----------
150
+ /**
151
+ * 凑一轮:凑满一桌立刻开;最早的人等够了:≥ 2 人就开,只剩自己转单机。凑完还有人就把闹钟对到下一个人。
152
+ * 凑桌中间要 await(平台、房间),这时别的入口进来只记 again,凑完再来一轮
153
+ */
154
+ async form() {
155
+ if (this.forming) {
156
+ this.again = true;
157
+ return;
158
+ }
159
+ this.forming = true;
160
+ try {
161
+ let rounds = 0;
162
+ do {
163
+ this.again = false;
164
+ while (rounds++ < FORM_ROUNDS && (await this.formOnce()))
165
+ ;
166
+ } while (this.again && rounds < FORM_ROUNDS);
167
+ }
168
+ finally {
169
+ this.forming = false;
170
+ this.taken.clear();
171
+ }
172
+ this.pushWaiting();
173
+ await this.planAlarm();
174
+ }
175
+ /** 凑一桌;凑出了(或者有人被请出去了)回 true,接着凑下一桌 */
176
+ async formOnce() {
177
+ const list = this.queue().filter((w) => !this.taken.has(w.me.userId));
178
+ if (!list.length)
179
+ return false;
180
+ const tier = list[0].me.tier;
181
+ const size = Math.max(1, Math.min(this.tableSize(tier), BLOCK_MAX));
182
+ const due = Date.now() >= list[0].me.since + this.waitMs;
183
+ if (list.length < size && !due)
184
+ return false;
185
+ const blocks = await withTimeout(this.blockedAmong(list.slice(0, BLOCK_MAX).map((w) => w.me.userId)), this.callMs).catch((e) => {
186
+ console.error('blockedAmong timed out, matching without it', e instanceof Error ? e.message : e);
187
+ return [];
188
+ });
189
+ const chosen = [];
190
+ for (const w of list.slice(0, BLOCK_MAX)) {
191
+ if (chosen.length >= size)
192
+ break;
193
+ if (chosen.some((c) => blocks.some(([a, b]) => (a === c.me.userId && b === w.me.userId) || (a === w.me.userId && b === c.me.userId))))
194
+ continue;
195
+ chosen.push(w);
196
+ }
197
+ if (chosen.length < size && !due)
198
+ return false;
199
+ if (chosen.length < 2) {
200
+ // 等够了却只有自己(或者在的人都和他互相屏蔽):转单机
201
+ this.solo(chosen[0].ws, 'alone');
202
+ return true;
203
+ }
204
+ for (const c of chosen)
205
+ this.taken.add(c.me.userId);
206
+ const players = chosen.map((c) => ({ userId: c.me.userId, name: c.me.name }));
207
+ let out = { r: 'unavailable' };
208
+ let code = '';
209
+ for (let i = 0; i < CODE_TRIES; i++) {
210
+ code = newRoomCode();
211
+ try {
212
+ out = await withTimeout(this.createMatchRoom(code, players, this.roomOptions(tier)), this.callMs);
213
+ }
214
+ catch (e) {
215
+ console.error('kitCreateMatch failed', e instanceof Error ? e.message : e);
216
+ out = { r: 'unavailable' };
217
+ }
218
+ if (out.r !== 'exists')
219
+ break;
220
+ }
221
+ for (const c of chosen)
222
+ this.taken.delete(c.me.userId);
223
+ // 等的这一会儿可能有人走了、换了页面:按 userId 找他现在的连接
224
+ const sockOf = (userId) => this.waiting().find((ws) => waiterOf(ws)?.userId === userId);
225
+ if (out.r === 'created') {
226
+ for (const c of chosen) {
227
+ const ws = sockOf(c.me.userId);
228
+ if (ws)
229
+ this.finish(ws, { t: 'matched', code });
230
+ }
231
+ return true;
232
+ }
233
+ if (out.r === 'refused') {
234
+ if (out.userId === null) {
235
+ // 全站忙:这一轮的人都转单机,其他人留着(到点还会被同样挡掉)
236
+ for (const c of chosen) {
237
+ const ws = sockOf(c.me.userId);
238
+ if (ws)
239
+ this.solo(ws, 'busy');
240
+ }
241
+ return true;
242
+ }
243
+ const ws = sockOf(out.userId);
244
+ if (ws) {
245
+ if (out.why === 'has_room')
246
+ this.finish(ws, { t: 'has_room', code: out.code });
247
+ else
248
+ this.solo(ws, 'daily_limit');
249
+ return true;
250
+ }
251
+ return true;
252
+ }
253
+ // 房间那边出错、超时、选项不对:这一轮的人转单机,不让他们一直等。
254
+ // bad / bad_options 是游戏配错了(tableSize 比这一局的座位多、roomOptions 过不了 RoomGame.options),每桌都会这样:
255
+ // 大声记日志;游戏在自己的测试里用 game.ts 的 matchConfigErrors 先查
256
+ if (out.r === 'bad' || out.r === 'bad_options')
257
+ console.error(`MatchQueue misconfigured for tier ${tier}: room said ${out.r} (check tableSize / roomOptions with matchConfigErrors)`);
258
+ else
259
+ console.error('match room not created', out.r);
260
+ for (const c of chosen) {
261
+ const ws = sockOf(c.me.userId);
262
+ if (ws)
263
+ this.solo(ws, 'unavailable');
264
+ }
265
+ // 房间那边不好(超时、出错):这一次不接着凑,剩下的人等下一次闹钟,不让锁一直被连着的超时占着
266
+ this.again = false;
267
+ return false;
268
+ }
269
+ /** 只往早了调闹钟:最早那个人等够的时刻 */
270
+ async planAlarm() {
271
+ const list = this.queue();
272
+ if (!list.length)
273
+ return;
274
+ const next = list[0].me.since + this.waitMs;
275
+ if (this.alarmAt === undefined)
276
+ this.alarmAt = await this.ctx.storage.getAlarm();
277
+ if (this.alarmAt !== null && this.alarmAt <= next && this.alarmAt > Date.now() - 1_000)
278
+ return;
279
+ this.alarmAt = next;
280
+ try {
281
+ await this.ctx.storage.setAlarm(next);
282
+ }
283
+ catch (e) {
284
+ console.error('match setAlarm failed', e instanceof Error ? e.message : e);
285
+ this.alarmAt = undefined;
286
+ }
287
+ }
288
+ // ---------- 连接 ----------
289
+ sockets() {
290
+ return this.ctx.getWebSockets();
291
+ }
292
+ waiting() {
293
+ return this.sockets().filter((ws) => waiterOf(ws) !== null);
294
+ }
295
+ /** 排着的人,按开始排的先后;同一个人只算最新的那条 */
296
+ queue() {
297
+ const by = new Map();
298
+ for (const ws of this.waiting()) {
299
+ const me = waiterOf(ws);
300
+ const had = by.get(me.userId);
301
+ if (!had || had.me.since <= me.since)
302
+ by.set(me.userId, { ws, me });
303
+ }
304
+ return [...by.values()].sort((a, b) => a.me.since - b.me.since);
305
+ }
306
+ /** 人数变了就推一次(不每秒推,页面自己倒计时) */
307
+ pushWaiting() {
308
+ const list = this.queue();
309
+ if (!list.length)
310
+ return;
311
+ // 倒计时按最早的那个人算:他到点时大家一起凑,后来的人等不满 waitMs
312
+ const left = Math.max(0, list[0].me.since + this.waitMs - Date.now());
313
+ const msg = { t: 'waiting', n: list.length, seats: this.tableSize(list[0].me.tier), left };
314
+ for (const { ws } of list)
315
+ send(ws, msg);
316
+ }
317
+ solo(ws, why) {
318
+ this.finish(ws, { t: 'solo', why });
319
+ }
320
+ /** 发最后一条,出队、关掉 */
321
+ finish(ws, msg) {
322
+ send(ws, msg);
323
+ this.drop(ws, 1000, msg.t);
324
+ }
325
+ drop(ws, code, reason) {
326
+ ws.serializeAttachment(null);
327
+ try {
328
+ ws.close(code, reason);
329
+ }
330
+ catch {
331
+ // 已经关了
332
+ }
333
+ }
334
+ }
335
+ function waiterOf(ws) {
336
+ const a = ws.deserializeAttachment();
337
+ return a && typeof a.userId === 'string' ? a : null;
338
+ }
339
+ function send(ws, msg) {
340
+ try {
341
+ ws.send(JSON.stringify(msg));
342
+ }
343
+ catch {
344
+ // 连接正在关
345
+ }
346
+ }
347
+ /**
348
+ * 等一个外部调用最多 ms 毫秒,超时抛错(调用方按失败处理)。只在凑桌这一次请求里等,不是房间的状态计时,
349
+ * 所以用运行时的 scheduler.wait(不是 setTimeout、也不占那一个闹钟)
350
+ */
351
+ async function withTimeout(p, ms) {
352
+ // 超时以后原来的调用照样可能失败:先接住它的错,免得变成没人处理的 rejection
353
+ const settled = p.then((v) => ({ ok: true, v }), (e) => ({ ok: false, e }));
354
+ const out = await Promise.race([settled, scheduler.wait(ms).then(() => null)]);
355
+ if (out === null)
356
+ throw new Error(`timed out after ${ms} ms`);
357
+ if (!out.ok)
358
+ throw out.e;
359
+ return out.v;
360
+ }
361
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"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"}
package/dist/meter.d.ts CHANGED
@@ -60,6 +60,29 @@ export type Reserve = {
60
60
  ok: false;
61
61
  error: 'daily_limit' | 'busy';
62
62
  };
63
+ /** 几个人一起占(0.20.0):被挡时 userId 是第一个被挡的人;全站忙(busy)不是哪一个人的事,userId 为 null */
64
+ export type ReserveMany = {
65
+ ok: true;
66
+ } | {
67
+ ok: false;
68
+ userId: string;
69
+ error: 'has_room';
70
+ code: string;
71
+ } | {
72
+ ok: false;
73
+ userId: string;
74
+ error: 'daily_limit';
75
+ } | {
76
+ ok: false;
77
+ userId: null;
78
+ error: 'busy';
79
+ };
80
+ /** kitPeek 的结果(0.20.0):room 是这个人开着的房间码,daily 是今天的开房次数用完了 */
81
+ export interface Peek {
82
+ room: string | null;
83
+ daily: boolean;
84
+ level: MeterLevel;
85
+ }
63
86
  export interface Usage {
64
87
  day: string;
65
88
  writes: number;
@@ -72,11 +95,26 @@ export declare class RoomMeter extends DurableObject<MeterEnv> {
72
95
  private limitsCache;
73
96
  /** 开房前占一个名额(房间调)。房间没建成要调 kitRelease(…, cancel) 退回。 */
74
97
  kitReserve(userId: string, code: string, until: number): Promise<Reserve>;
98
+ /**
99
+ * 一张桌给几个人一起占名额(0.20.0,快速匹配):要么都占上,要么一个都不占,占不上的回第一个被挡的人。
100
+ * 全站开房数只记 1(一张桌一个房间)。一次写 1 + 人数 行(每人那一行加当天那一行),写在计量里、记进当天的数,不算房间的"每步 ≤ 2 行"
101
+ */
102
+ kitReserveMany(userIds: readonly string[], code: string, until: number): Promise<ReserveMany>;
75
103
  /**
76
104
  * 房间结束(打完、关掉)时还名额,顺便报最后一批写入(writes 可以是 0)。cancel:房间没建成,开房次数也退回。
77
105
  * 名额已经不在(还过一次、或者已经到点作废)就只记写入,可以重复调。
78
106
  */
79
107
  kitRelease(userId: string, code: string, writes: number, cancel?: boolean): Promise<MeterLevel>;
108
+ /**
109
+ * 一张桌的几个人一起还(0.20.0)。cancel:开房次数也退回;room:全站开房数也退 1(默认跟着 cancel:整桌没建成)。
110
+ * 匹配桌开打时没来的人(0.20.0)是 cancel 但不退全站数:桌子开成了,只是他的那一份退给他
111
+ */
112
+ kitReleaseMany(userIds: readonly string[], code: string, writes: number, cancel?: boolean, room?: boolean): Promise<MeterLevel>;
113
+ /**
114
+ * 只读(0.20.0,快速匹配入队前问):这个人现在开着的房间(没有为 null)、今天的开房次数用完没有、全站的门槛。
115
+ * 入队前就挡掉"有房间""今天用完了""联机忙"的人,不让他们白等 15 秒
116
+ */
117
+ kitPeek(userId: string): Promise<Peek>;
80
118
  /** 报一批写入(房间攒够一批时调),回现在的门槛。 */
81
119
  kitReport(writes: number): Promise<MeterLevel>;
82
120
  /** 只读:现在的门槛(房间放新人进来之前问,不写库)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"meter.d.ts","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meter.d.ts","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}
package/dist/meter.js CHANGED
@@ -38,20 +38,33 @@ export class RoomMeter extends DurableObject {
38
38
  limitsCache = null;
39
39
  /** 开房前占一个名额(房间调)。房间没建成要调 kitRelease(…, cancel) 退回。 */
40
40
  async kitReserve(userId, code, until) {
41
+ const r = await this.kitReserveMany([userId], code, until);
42
+ return r.ok ? r : r.error === 'has_room' ? { ok: false, error: 'has_room', code: r.code } : { ok: false, error: r.error };
43
+ }
44
+ /**
45
+ * 一张桌给几个人一起占名额(0.20.0,快速匹配):要么都占上,要么一个都不占,占不上的回第一个被挡的人。
46
+ * 全站开房数只记 1(一张桌一个房间)。一次写 1 + 人数 行(每人那一行加当天那一行),写在计量里、记进当天的数,不算房间的"每步 ≤ 2 行"
47
+ */
48
+ async kitReserveMany(userIds, code, until) {
41
49
  const now = Date.now();
42
50
  const lim = this.limits();
43
51
  const day = this.day(now);
44
- const user = this.user(userId, day.day, now);
52
+ const users = userIds.map((id) => ({ id, row: this.user(id, day.day, now) }));
45
53
  // 先说"回你的房间":在打的房间不受全站门槛影响,回去照样能玩
46
- if (user.live.length >= lim.roomsPerUser)
47
- return { ok: false, error: 'has_room', code: user.live[user.live.length - 1].code };
48
- if (user.count >= lim.dailyRoomsPerUser)
49
- return { ok: false, error: 'daily_limit' };
54
+ for (const { id, row } of users)
55
+ if (row.live.length >= lim.roomsPerUser)
56
+ return { ok: false, userId: id, error: 'has_room', code: row.live[row.live.length - 1].code };
57
+ for (const { id, row } of users)
58
+ if (row.count >= lim.dailyRoomsPerUser)
59
+ return { ok: false, userId: id, error: 'daily_limit' };
50
60
  if (levelOf(day.writes, lim) !== 'ok' || day.rooms >= lim.dailyRooms)
51
- return { ok: false, error: 'busy' };
52
- user.count++;
53
- user.live.push({ code, until: until + EXPIRY_SLACK_MS });
54
- const w = this.saveUser(userId, user);
61
+ return { ok: false, userId: null, error: 'busy' };
62
+ let w = 0;
63
+ for (const { id, row } of users) {
64
+ row.count++;
65
+ row.live.push({ code, until: until + EXPIRY_SLACK_MS });
66
+ w += this.saveUser(id, row);
67
+ }
55
68
  this.saveDay(day.day, day.writes + w + 1, day.rooms + 1);
56
69
  return { ok: true };
57
70
  }
@@ -60,22 +73,51 @@ export class RoomMeter extends DurableObject {
60
73
  * 名额已经不在(还过一次、或者已经到点作废)就只记写入,可以重复调。
61
74
  */
62
75
  async kitRelease(userId, code, writes, cancel = false) {
76
+ return this.kitReleaseMany([userId], code, writes, cancel);
77
+ }
78
+ /**
79
+ * 一张桌的几个人一起还(0.20.0)。cancel:开房次数也退回;room:全站开房数也退 1(默认跟着 cancel:整桌没建成)。
80
+ * 匹配桌开打时没来的人(0.20.0)是 cancel 但不退全站数:桌子开成了,只是他的那一份退给他
81
+ */
82
+ async kitReleaseMany(userIds, code, writes, cancel = false, room = cancel) {
63
83
  const now = Date.now();
64
84
  const day = this.day(now);
65
- const user = this.user(userId, day.day, now);
66
- const i = user.live.findIndex((r) => r.code === code);
67
85
  let w = 0;
68
- if (i >= 0) {
86
+ let found = false;
87
+ for (const id of userIds) {
88
+ const user = this.user(id, day.day, now);
89
+ const i = user.live.findIndex((r) => r.code === code);
90
+ if (i < 0)
91
+ continue;
92
+ found = true;
69
93
  user.live.splice(i, 1);
70
94
  if (cancel && user.count > 0)
71
95
  user.count--;
72
- w = this.saveUser(userId, user);
96
+ w += this.saveUser(id, user);
73
97
  }
74
- const rooms = cancel && i >= 0 ? Math.max(0, day.rooms - 1) : day.rooms;
98
+ const rooms = room && found ? Math.max(0, day.rooms - 1) : day.rooms;
75
99
  const total = day.writes + clean(writes) + w + 1;
76
100
  this.saveDay(day.day, total, rooms);
77
101
  return levelOf(total, this.limits());
78
102
  }
103
+ /**
104
+ * 只读(0.20.0,快速匹配入队前问):这个人现在开着的房间(没有为 null)、今天的开房次数用完没有、全站的门槛。
105
+ * 入队前就挡掉"有房间""今天用完了""联机忙"的人,不让他们白等 15 秒
106
+ */
107
+ async kitPeek(userId) {
108
+ const now = Date.now();
109
+ const lim = this.limits();
110
+ const day = this.day(now);
111
+ const user = this.user(userId, day.day, now);
112
+ const lv = levelOf(day.writes, lim);
113
+ // 全站开房数到了也开不了新桌,对排队的人和"联机忙"一样
114
+ const level = lv === 'ok' && day.rooms >= lim.dailyRooms ? 'busy' : lv;
115
+ return {
116
+ room: user.live.length >= lim.roomsPerUser ? user.live[user.live.length - 1].code : null,
117
+ daily: user.count >= lim.dailyRoomsPerUser,
118
+ level,
119
+ };
120
+ }
79
121
  /** 报一批写入(房间攒够一批时调),回现在的门槛。 */
80
122
  async kitReport(writes) {
81
123
  const day = this.day(Date.now());
package/dist/meter.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"meter.js","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meter.js","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}