@yyyu-star/arcade-kit 0.13.1 → 0.15.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/CHANGELOG.md +25 -0
- package/README.md +16 -5
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +8 -0
- package/dist/internal.js.map +1 -1
- package/dist/meter.d.ts +15 -0
- package/dist/meter.d.ts.map +1 -1
- package/dist/meter.js +27 -0
- package/dist/meter.js.map +1 -1
- package/dist/qr.d.ts +15 -0
- package/dist/qr.d.ts.map +1 -0
- package/dist/qr.js +264 -0
- package/dist/qr.js.map +1 -0
- package/dist/room.d.ts +12 -2
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +31 -12
- package/dist/room.js.map +1 -1
- package/dist/share.d.ts +33 -14
- package/dist/share.d.ts.map +1 -1
- package/dist/share.js +99 -22
- package/dist/share.js.map +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +44 -3
- package/dist/worker.js.map +1 -1
- package/package.json +2 -1
- package/src/internal.ts +11 -0
- package/src/meter.ts +37 -0
- package/src/qr.ts +259 -0
- package/src/room.ts +35 -13
- package/src/share.ts +104 -24
- package/src/worker.ts +42 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## 0.15.0
|
|
4
|
+
|
|
5
|
+
分享卡加强(主线派,所有者要"晒战绩、一键分享、发朋友圈")。
|
|
6
|
+
- **右下角二维码**:朋友圈里的图不能点,扫码是唯一入口。内容是运行时的 `location.origin` 加上 `opts.url` 的路径、查询和 `#`(`shareLink`),代码里不写域名。
|
|
7
|
+
纯白框、近黑的格、每格整数像素、留白 ≥ 4 格,下面写"扫码来玩";名场面和日期往左让。链接太长(> 213 字节)不画码。
|
|
8
|
+
- **二维码编码器 `src/qr.ts`**:自己写的最小子集(字节模式、纠错 M、版本 1–10),不引运行时依赖(kit 至今零运行时依赖,引一个就进每个游戏的 lockfile 和审阅范围)。
|
|
9
|
+
- **微信内置浏览器**:检测到 `MicroMessenger` 不试系统分享,直接出预览:图用 `data:` URL,提示"长按图片 → 发送给朋友,或保存后发朋友圈",不给"保存图片"。
|
|
10
|
+
- **系统分享的 `text` 末尾带上链接**(有的 App 只取 text);系统分享的 `url`、"复制链接"也换成 `shareLink` 算出的那一个。
|
|
11
|
+
- `drawShareCard(card, canvas?, link?)`、`shareCardBlob(card, link?)` 多一个可选参数,不给就和以前一样不画码。
|
|
12
|
+
- 测试:`qr.test`(新):版本 1–10 的边界长度都用 jsQR(Apache-2.0,devDependency)解回原文,格式信息、版本信息对规范表的已知向量;`share.test` 加链接、文字、码的留白、微信 UA 几条。
|
|
13
|
+
反证:格式信息错 1 位、纠错码生成元错、版本信息 BCH 错、链接用游戏给的域名、微信里给保存、文字不带链接,都让测试失败(格式信息错 1 位解码器会纠正,所以另加了已知向量)。
|
|
14
|
+
浏览器里实画三张演示卡,JPEG 质量 0.6、缩到 360 宽后都解得出链接。
|
|
15
|
+
|
|
16
|
+
## 0.14.0
|
|
17
|
+
|
|
18
|
+
第三轮安全审计 kit 的三条(主线派)。
|
|
19
|
+
- **进房猜码限次**(中):`acceptJoin` 按人、按 IP 数每小时"码不存在"的次数(`KIT_QUOTA` 新字段 `joinMissesPerUser` 20、`joinMissesPerIp` 60)。超了以后进任何房间都回 1013,
|
|
20
|
+
房间在不在都一样;只有这个房间的自己人(房主、坐着的、开打后绑过座位的)照常进,断线重连不受牵连。计数放在计量类按人、按 IP 取的小实例里(不挤全站那一个),每次各 1 行并记进当天的数。
|
|
21
|
+
房间回"码不存在"时在 101 上带内部头 `x-kit-miss`,转给浏览器前去掉。
|
|
22
|
+
- **令牌桶按人记**(低):以前每条连接一个桶,断开重连就拿到一个满的;现在按 userId。
|
|
23
|
+
- **旁观名额**(低):按账号数;房主和开打后绑过座位(离座去看)的人不占名额、也不受限,几个陌生账号占满名额也挡不住他们。
|
|
24
|
+
- 评估(只评估,没做):"房主踢人"和"只许好友坐下"见 PR 说明;结论是暂不做,猜码限次加上开打后座位绑人已经够用,出现滥用再加。
|
|
25
|
+
- `worker.ts` 只按类型引用 `meter.ts`(门槛由计量的小实例自己按 `KIT_QUOTA` 算):游戏会在普通 Node 的测试里加载 `worker.ts`,`meter.ts` 依赖 `cloudflare:workers`;加了一条架构测试守住。
|
|
26
|
+
- 测试:`room.test` 第三轮审计 4 条;反证(不去内部头、不记数、超限不放自己人、不带超限头、令牌桶按连接、绑过座位的也占名额)都会让测试失败。
|
|
27
|
+
|
|
3
28
|
## 0.13.1
|
|
4
29
|
|
|
5
30
|
稳定性小修(主线派,含第三轮审计 kit 的 setAlarm 一条)。
|
package/README.md
CHANGED
|
@@ -351,7 +351,7 @@ protected override onEmote(from: number, id: number, to?: number): void {
|
|
|
351
351
|
|
|
352
352
|
### 分享卡
|
|
353
353
|
|
|
354
|
-
游戏只交数据,画法统一(主题色渐变底、图标、游戏名、一个大数字、最多 3
|
|
354
|
+
游戏只交数据,画法统一(主题色渐变底、图标、游戏名、一个大数字、最多 3 条小数据、一句名场面、昵称和称号、北京时间日期、右下角扫码来玩的二维码):
|
|
355
355
|
|
|
356
356
|
```ts
|
|
357
357
|
import { shareCard } from 'arcade-kit/share';
|
|
@@ -365,7 +365,7 @@ const r = await shareCard(
|
|
|
365
365
|
art: { image: atlasImg, crop: { x: 128, y: 0, w: 128, h: 128 }, fit: 'contain' },
|
|
366
366
|
player: { name: '小明', badge: '炸弹狂人' },
|
|
367
367
|
},
|
|
368
|
-
{ url:
|
|
368
|
+
{ url: './?room=123456' /* 只取路径,域名用运行时的 origin;好友房结算带房间码 */, log: (l) => smokeLog.push(l) },
|
|
369
369
|
); // 'shared' | 'preview' | 'cancelled'
|
|
370
370
|
```
|
|
371
371
|
|
|
@@ -375,7 +375,14 @@ const r = await shareCard(
|
|
|
375
375
|
预览层 z-index 默认 11000(0.12.4 起),按钮的 `data-key` 是 `share:save`、`share:copy`、`share:close`,冒烟点这些;`log` 给 `分享 系统`、`分享 预览`、`分享 保存`、`分享 复制`。
|
|
376
376
|
- **结算页一出现就先画好**(0.12.3,iOS 必须):iOS 只许在点击的那一下里调系统分享,点了再画就过期了、只能出预览。结算页出来时 `const p = prepareShare(card, opts)`,
|
|
377
377
|
"分享"按钮的点击里直接 `void p.share()`(前面别 await):画好了就同步调 `navigator.share`,没画好等画完再试、调不起来出预览。`shareCard` 是"点了才画"的简写。
|
|
378
|
-
-
|
|
378
|
+
- **二维码**(0.15.0):朋友圈里的图不能点,扫码是唯一入口。码的内容是 `shareLink(opts.url, location.origin)`:运行时的 origin 加上 `url` 的路径、查询和 `#` 后面,
|
|
379
|
+
游戏给相对路径还是绝对地址都行,kit 和游戏都不写域名(单独部署的游戏扫出来就是它自己的 `workers.dev`)。系统分享、"复制链接"也用这个链接,系统分享的 `text` 末尾自动带上它(有的 App 只取 text)。
|
|
380
|
+
码画在右下角的纯白框里(`#111` 的格、每格整数像素、四周留白 ≥ 4 格、下面写"扫码来玩"),名场面和日期往左让;JPEG 压缩、缩到三分之一宽的截图实测照样解得出。
|
|
381
|
+
编码器是 `src/qr.ts`,自己写的最小子集(字节模式、纠错 M、版本 1–10,最长 213 字节,约 9 KB 源码),不引运行时依赖:kit 一个运行时依赖都没有,引一个就进每个游戏的 lockfile 和审阅范围。
|
|
382
|
+
链接太长编不了码就不画码,卡照常出。测试用 jsQR(Apache-2.0,只是 devDependency,不进包)把码解回原文,再对格式信息、版本信息做规范表的已知向量核对。
|
|
383
|
+
- **微信内置浏览器**(0.15.0,UA 带 `MicroMessenger`):没有 `navigator.share`,下载链接也常常不生效。检测到微信就不试系统分享,直接出预览:图用 `data:` URL(`blob:` 的图在微信里长按经常存不下来),
|
|
384
|
+
提示"长按图片 → 发送给朋友,或保存后发朋友圈",不给"保存图片"按钮("复制链接""关闭"照旧)。判断在 `isWeChat`、`previewMode`(纯函数)。
|
|
385
|
+
- 只要图不分享:`drawShareCard(card, canvas?, link?)` 返回画好的 canvas(给了 `link` 才画码),`shareCardBlob(card, link?)` 返回 PNG。
|
|
379
386
|
- **图上只有游戏给的数据**:别人没摊的牌、手牌这类隐藏信息游戏自己别放进来。
|
|
380
387
|
|
|
381
388
|
### 报位置、收邀请
|
|
@@ -452,9 +459,9 @@ export class CardRoom extends GameRoom<State, Action, View, Env> {
|
|
|
452
459
|
- 客户端重发没确认的操作带原来的 `baseSeq`:牌局变过就回 `stale`,旧操作不会被套到新的一手上。有人进出不算牌局变了。
|
|
453
460
|
- 重复的 moveId 每个座位记最近 8 个(0.11.1,和座位一起存在状态那一行里,不多写):连发 A、B 时 A 的 ack 丢了,补发 A 仍然只回 ack,不轮流的操作不会做第二遍。
|
|
454
461
|
- **硬限制**(4.6):
|
|
455
|
-
- 单条入站消息 4 KB(1009
|
|
462
|
+
- 单条入站消息 4 KB(1009);每人每秒 5 条、最多攒 10 条(1008;0.14.0 起按人记,断开重连、多开标签页都还是同一个桶);房间一生 3,000 条入站消息;寿命 3 小时;没人 10 分钟——到了就关房间:
|
|
456
463
|
断开所有人(4000)、删闹钟、删存储;
|
|
457
|
-
-
|
|
464
|
+
- 没入座的最多 4 个账号(4003);入座的人、房主、开打后绑过座位(离座去看)的人不占这个数,也不受它限,旁观的再多也挡不住座位的主人回来;
|
|
458
465
|
- 每人一生最多 300 次"掉线后回来"(只数会写库的那种,4029)。按 userId 记,只管他自己,别人刷不光,离座再坐下也不清零;
|
|
459
466
|
这些重连同时算进房间一生的 3,000 条入站额度,所以房间一生的写入总数有上限。没入座的人进出不写库,不受这个管;
|
|
460
467
|
- 一个人最多用掉房间入站额度的 `maxInboundShare`(默认四成,1,200 条):超了只断开他(4030),以后也进不来,房间和别人照常;
|
|
@@ -489,6 +496,8 @@ export class CardRoom extends GameRoom<State, Action, View, Env> {
|
|
|
489
496
|
| `stopWrites` | 85,000 | 在打的房间走到 `breakPoint`(这一副打完)时收场:把这一步发给大家,再以 4000 + 原因 `quota` 关房;等人的、已经打完的马上关 |
|
|
490
497
|
| `emoteMs`(0.7.0,房间读) | 1000 | 快捷短语每个座位多少毫秒补 1 个令牌,0 不限速 |
|
|
491
498
|
| `emoteBurst`(0.7.0,房间读) | 3 | 快捷短语每个座位最多攒几个令牌 |
|
|
499
|
+
| `joinMissesPerUser`(0.14.0) | 20 | 这个人这一小时进房时"码不存在"到了这么多次:进任何房间都回 1013(房间在不在都一样),只有这个房间的自己人(房主、坐着的、开打后绑过座位的)照常进 |
|
|
500
|
+
| `joinMissesPerIp`(0.14.0) | 60 | 同一个 IP 这一小时的"码不存在"次数,到了同上(一个 IP 后面可能是一家人、一个宿舍,放宽些) |
|
|
492
501
|
|
|
493
502
|
- **改门槛**:在游戏的 `wrangler.jsonc` 里写 `"vars": { "KIT_QUOTA": { "busyWrites": 50000 } }`(对象或 JSON 字符串都行),只写要改的字段,部署后生效;
|
|
494
503
|
不认识的字段、不是非负整数的值记日志后忽略,用默认值。门槛按每个游戏各算各的,有几个联机游戏就要分一分(见下面"多个游戏怎么分额度")。
|
|
@@ -498,6 +507,7 @@ export class CardRoom extends GameRoom<State, Action, View, Env> {
|
|
|
498
507
|
计量每报一次写 1 行,200 行一报摊下来多花 0.5%;开房(这个人一行、当天一行)、还名额(同样两行)另算,也都记进当天的数。
|
|
499
508
|
没报的数随房间那一行一起存,被驱逐后接着数;被驱逐前刚报过、还没存下去的那一批会再报一次,偏保守。房间跨 UTC 0 点报上来的记在新的一天。
|
|
500
509
|
- **计量连不上**:不开新房(503 `unavailable`)、不进新人(1013,客户端过会儿自己重试);在打的照常,报不上的攒着,60 秒后再试。
|
|
510
|
+
- **进房猜码**(0.14.0,第三轮审计):房间码只有 6 位,不限的话能一个个试出谁开着房、进去旁观或坐空位。`acceptJoin` 按人、按 IP 数"码不存在"(计量类的小实例 `kit-miss:u:<userId>` / `kit-miss:ip:<地址>`,每次各写 1 行、再报进当天的数;没绑 `METER` 不管,没有 `cf-connecting-ip` 只按人)。超了门槛不直接拒,而是带一个内部头进房,由房间判断是不是自己人:自己人照常进,别人一律 1013,这样超限的人说不出房间在不在,在打的人断线重连也不受牵连。计量连不上时同样处理。每次进房多问一次小实例(只读)。
|
|
501
511
|
- **房间怎么知道门槛**:每次报数、还名额时计量顺便回现在的门槛;有新人来进房时房间也会问(记 30 秒,只读不写)。所以 stop 以后在打的房间最晚再写一批(≤ 200 行)加上这一副剩下的才收场,
|
|
502
512
|
按同时最多二三十个房间算,8.5 万离 10 万还有余量。
|
|
503
513
|
- 名额只按游戏算:同一个人在两个游戏里可以各开一个房间。
|
|
@@ -601,6 +611,7 @@ packages/arcade-kit/
|
|
|
601
611
|
│ ├─ fun-logic.ts 牌桌互动的规则:冷却、护盾、连击、回敬、电脑反应、菜单位置(纯函数)
|
|
602
612
|
│ ├─ table-fun.ts 牌桌互动组件 TableFun(DOM:头像菜单、面板、提示)
|
|
603
613
|
│ ├─ share.ts 分享卡(Canvas 画战绩图、系统分享或预览)
|
|
614
|
+
│ ├─ qr.ts 二维码编码器(字节模式、纠错 M、版本 1–10,纯函数,分享卡用)
|
|
604
615
|
│ ├─ social.ts 报位置、收邀请的横条、好友和邀请的接口小函数
|
|
605
616
|
│ ├─ testing.ts 假平台钱包(只给测试和本地开发)
|
|
606
617
|
│ └─ internal.ts 内部地址、身份头(不在 exports 里)
|
package/dist/internal.d.ts
CHANGED
|
@@ -28,6 +28,12 @@ export declare function newRoomCode(): string;
|
|
|
28
28
|
export declare function roomStub(ns: DurableObjectNamespace, code: string): DurableObjectStub;
|
|
29
29
|
/** 计量的名字:每个游戏 Worker 只有这一个实例(meter.ts)。 */
|
|
30
30
|
export declare const METER_NAME = "kit-meter";
|
|
31
|
+
/** 进房猜码的计数(0.14.0):按人(u:<userId>)、按 IP(ip:<地址>)各一个小实例,和全站的计量同一个类、不同名字,不挤一个热点 */
|
|
32
|
+
export declare function missStub(ns: DurableObjectNamespace, key: string): DurableObjectStub;
|
|
33
|
+
/** 房间告诉 acceptJoin"这个码没有房间"的内部头(只在房间回给 Worker 的 101 上,转给浏览器前去掉) */
|
|
34
|
+
export declare const MISS_HEADER = "x-kit-miss";
|
|
35
|
+
/** acceptJoin 告诉房间"这个人猜码超了门槛"的内部头:房间只放自己人(房主、入座的、绑过座位的)进来,别人一律 1013 */
|
|
36
|
+
export declare const LIMITED_HEADER = "x-kit-limited";
|
|
31
37
|
/** 计量的 stub:和房间一样放在亚太,开房、报数少绕路。 */
|
|
32
38
|
export declare function meterStub(ns: DurableObjectNamespace): DurableObjectStub;
|
|
33
39
|
//# sourceMappingURL=internal.d.ts.map
|
package/dist/internal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAM/D;AAED,+CAA+C;AAC/C,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,wBAAwB,CAAC;AAE9C,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAQjE;AAED,yBAAyB;AACzB,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,kCAAkC;AAClC,wBAAgB,QAAQ,CAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAEpF;AAED,2CAA2C;AAC3C,eAAO,MAAM,UAAU,cAAc,CAAC;AAEtC,mCAAmC;AACnC,wBAAgB,SAAS,CAAC,EAAE,EAAE,sBAAsB,GAAG,iBAAiB,CAEvE"}
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAM/D;AAED,+CAA+C;AAC/C,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,wBAAwB,CAAC;AAE9C,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAQjE;AAED,yBAAyB;AACzB,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,kCAAkC;AAClC,wBAAgB,QAAQ,CAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAEpF;AAED,2CAA2C;AAC3C,eAAO,MAAM,UAAU,cAAc,CAAC;AAEtC,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAEnF;AAED,mEAAmE;AACnE,eAAO,MAAM,WAAW,eAAe,CAAC;AAExC,uEAAuE;AACvE,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,mCAAmC;AACnC,wBAAgB,SAAS,CAAC,EAAE,EAAE,sBAAsB,GAAG,iBAAiB,CAEvE"}
|
package/dist/internal.js
CHANGED
|
@@ -46,6 +46,14 @@ export function roomStub(ns, code) {
|
|
|
46
46
|
}
|
|
47
47
|
/** 计量的名字:每个游戏 Worker 只有这一个实例(meter.ts)。 */
|
|
48
48
|
export const METER_NAME = 'kit-meter';
|
|
49
|
+
/** 进房猜码的计数(0.14.0):按人(u:<userId>)、按 IP(ip:<地址>)各一个小实例,和全站的计量同一个类、不同名字,不挤一个热点 */
|
|
50
|
+
export function missStub(ns, key) {
|
|
51
|
+
return ns.get(ns.idFromName(`kit-miss:${key}`), { locationHint: 'apac' });
|
|
52
|
+
}
|
|
53
|
+
/** 房间告诉 acceptJoin"这个码没有房间"的内部头(只在房间回给 Worker 的 101 上,转给浏览器前去掉) */
|
|
54
|
+
export const MISS_HEADER = 'x-kit-miss';
|
|
55
|
+
/** acceptJoin 告诉房间"这个人猜码超了门槛"的内部头:房间只放自己人(房主、入座的、绑过座位的)进来,别人一律 1013 */
|
|
56
|
+
export const LIMITED_HEADER = 'x-kit-limited';
|
|
49
57
|
/** 计量的 stub:和房间一样放在亚太,开房、报数少绕路。 */
|
|
50
58
|
export function meterStub(ns) {
|
|
51
59
|
return ns.get(ns.idFromName(METER_NAME), { locationHint: 'apac' });
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C,sCAAsC;AACtC,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAE9C,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,EAAY;IACzC,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAkB;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAsB,CAAC;QACnE,OAAO,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7F,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,QAAQ,CAAC,EAA0B,EAAE,IAAY;IAC/D,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AAEtC,mCAAmC;AACnC,MAAM,UAAU,SAAS,CAAC,EAA0B;IAClD,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C,sCAAsC;AACtC,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAE9C,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,EAAY;IACzC,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAkB;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAsB,CAAC;QACnE,OAAO,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7F,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,QAAQ,CAAC,EAA0B,EAAE,IAAY;IAC/D,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AAEtC,gFAAgF;AAChF,MAAM,UAAU,QAAQ,CAAC,EAA0B,EAAE,GAAW;IAC9D,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AAExC,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAE9C,mCAAmC;AACnC,MAAM,UAAU,SAAS,CAAC,EAA0B;IAClD,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
package/dist/meter.d.ts
CHANGED
|
@@ -29,6 +29,12 @@ export interface QuotaLimits {
|
|
|
29
29
|
busyWrites: number;
|
|
30
30
|
/** 当天写入到这么多行:在打的房间这一段打完收场 */
|
|
31
31
|
stopWrites: number;
|
|
32
|
+
/**
|
|
33
|
+
* 进房猜码(0.14.0,第三轮审计):每个人每小时最多几次"房间码不存在"、每个 IP 每小时最多几次。超了这一小时里进任何房间都回 1013,
|
|
34
|
+
* 存在的房间也一样(不然 1013 和 welcome 的差别照样说出房间在不在)。房间码只有 6 位,不限就能一个个试出谁开着房
|
|
35
|
+
*/
|
|
36
|
+
joinMissesPerUser: number;
|
|
37
|
+
joinMissesPerIp: number;
|
|
32
38
|
}
|
|
33
39
|
export declare const DEFAULT_QUOTA: QuotaLimits;
|
|
34
40
|
/** KIT_QUOTA 里由房间读的字段(0.7.0):emoteMs 每多少毫秒补一个短语令牌(0 不限速),emoteBurst 最多攒几个 */
|
|
@@ -75,6 +81,15 @@ export declare class RoomMeter extends DurableObject<MeterEnv> {
|
|
|
75
81
|
kitReport(writes: number): Promise<MeterLevel>;
|
|
76
82
|
/** 只读:现在的门槛(房间放新人进来之前问,不写库)。 */
|
|
77
83
|
kitLevel(): Promise<MeterLevel>;
|
|
84
|
+
/**
|
|
85
|
+
* 进房猜码(0.14.0):这两个方法用在 missStub 按人、按 IP 取的小实例上(不是全站那一个),不碰 SQL 表,只存一个 { 第几个小时, 几次 }。
|
|
86
|
+
* kitMissBlocked 只读,进房前问(门槛在这里按 KIT_QUOTA 算,worker.ts 不用在运行时引用本文件:它要能在普通 Node 里加载);
|
|
87
|
+
* kitMiss 记一次(1 行),只有真的进了一个不存在的房间才调,超了门槛的人进不到这一步,所以一小时最多写门槛那么多行
|
|
88
|
+
*/
|
|
89
|
+
kitMissBlocked(kind: 'user' | 'ip'): Promise<boolean>;
|
|
90
|
+
/** 只读:这一小时记了几次(给测试看) */
|
|
91
|
+
kitMisses(): Promise<number>;
|
|
92
|
+
kitMiss(): Promise<number>;
|
|
78
93
|
/** 只读:当天的数,给运维和测试看。 */
|
|
79
94
|
kitUsage(): Promise<Usage>;
|
|
80
95
|
private ensure;
|
package/dist/meter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meter.d.ts","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"meter.d.ts","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}
|
package/dist/meter.js
CHANGED
|
@@ -25,6 +25,9 @@ export const DEFAULT_QUOTA = {
|
|
|
25
25
|
dailyRooms: 300,
|
|
26
26
|
busyWrites: 60_000,
|
|
27
27
|
stopWrites: 85_000,
|
|
28
|
+
// 正常人输错码一小时也就几次;一个 IP 后面可能是一家人、一个宿舍,放宽一些
|
|
29
|
+
joinMissesPerUser: 20,
|
|
30
|
+
joinMissesPerIp: 60,
|
|
28
31
|
};
|
|
29
32
|
/** KIT_QUOTA 里由房间读的字段(0.7.0):emoteMs 每多少毫秒补一个短语令牌(0 不限速),emoteBurst 最多攒几个 */
|
|
30
33
|
export const ROOM_QUOTA_FIELDS = ['emoteMs', 'emoteBurst'];
|
|
@@ -84,6 +87,27 @@ export class RoomMeter extends DurableObject {
|
|
|
84
87
|
async kitLevel() {
|
|
85
88
|
return levelOf(this.day(Date.now()).writes, this.limits());
|
|
86
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* 进房猜码(0.14.0):这两个方法用在 missStub 按人、按 IP 取的小实例上(不是全站那一个),不碰 SQL 表,只存一个 { 第几个小时, 几次 }。
|
|
92
|
+
* kitMissBlocked 只读,进房前问(门槛在这里按 KIT_QUOTA 算,worker.ts 不用在运行时引用本文件:它要能在普通 Node 里加载);
|
|
93
|
+
* kitMiss 记一次(1 行),只有真的进了一个不存在的房间才调,超了门槛的人进不到这一步,所以一小时最多写门槛那么多行
|
|
94
|
+
*/
|
|
95
|
+
async kitMissBlocked(kind) {
|
|
96
|
+
const lim = this.limits();
|
|
97
|
+
return (await this.kitMisses()) >= (kind === 'user' ? lim.joinMissesPerUser : lim.joinMissesPerIp);
|
|
98
|
+
}
|
|
99
|
+
/** 只读:这一小时记了几次(给测试看) */
|
|
100
|
+
async kitMisses() {
|
|
101
|
+
const r = await this.ctx.storage.get('miss');
|
|
102
|
+
return r && r.h === hourOf(Date.now()) ? r.n : 0;
|
|
103
|
+
}
|
|
104
|
+
async kitMiss() {
|
|
105
|
+
const h = hourOf(Date.now());
|
|
106
|
+
const r = await this.ctx.storage.get('miss');
|
|
107
|
+
const n = (r && r.h === h ? r.n : 0) + 1;
|
|
108
|
+
await this.ctx.storage.put('miss', { h, n });
|
|
109
|
+
return n;
|
|
110
|
+
}
|
|
87
111
|
/** 只读:当天的数,给运维和测试看。 */
|
|
88
112
|
async kitUsage() {
|
|
89
113
|
const day = this.day(Date.now());
|
|
@@ -197,6 +221,9 @@ export function levelOf(writes, lim) {
|
|
|
197
221
|
return 'busy';
|
|
198
222
|
return 'ok';
|
|
199
223
|
}
|
|
224
|
+
function hourOf(now) {
|
|
225
|
+
return Math.floor(now / 3_600_000);
|
|
226
|
+
}
|
|
200
227
|
function utcDay(now) {
|
|
201
228
|
return new Date(now).toISOString().slice(0, 10);
|
|
202
229
|
}
|
package/dist/meter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meter.js","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"meter.js","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}
|
package/dist/qr.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 最小的二维码编码器(0.15.0,分享卡右下角的码):只做字节模式、纠错等级 M、版本 1–10(最多 213 字节,链接够用)。
|
|
3
|
+
* 自己写而不引依赖:kit 没有运行时依赖,引一个包就进了每个游戏的 lockfile 和审阅范围;要的子集只有这么点,规范见 ISO/IEC 18004。
|
|
4
|
+
* 纯函数,不碰 DOM;画在哪、画多大由 share.ts 决定。测试用解码库把码解回原文(test/qr.test.ts)。
|
|
5
|
+
*/
|
|
6
|
+
/** size × size 的格子,true 是深色。外面的留白(4 格)不在里面,画的时候自己留 */
|
|
7
|
+
export interface QrMatrix {
|
|
8
|
+
size: number;
|
|
9
|
+
version: number;
|
|
10
|
+
dark: boolean[][];
|
|
11
|
+
}
|
|
12
|
+
export declare const QR_MAX_VERSION: number;
|
|
13
|
+
/** 编码一段文字(UTF-8)。放不下(超过版本 10)返回 null,调用方就不画码 */
|
|
14
|
+
export declare function qrEncode(text: string): QrMatrix | null;
|
|
15
|
+
//# sourceMappingURL=qr.d.ts.map
|
package/dist/qr.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;CACnB;AAeD,eAAO,MAAM,cAAc,QAAkB,CAAC;AAU9C,gDAAgD;AAChD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAatD"}
|
package/dist/qr.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 最小的二维码编码器(0.15.0,分享卡右下角的码):只做字节模式、纠错等级 M、版本 1–10(最多 213 字节,链接够用)。
|
|
3
|
+
* 自己写而不引依赖:kit 没有运行时依赖,引一个包就进了每个游戏的 lockfile 和审阅范围;要的子集只有这么点,规范见 ISO/IEC 18004。
|
|
4
|
+
* 纯函数,不碰 DOM;画在哪、画多大由 share.ts 决定。测试用解码库把码解回原文(test/qr.test.ts)。
|
|
5
|
+
*/
|
|
6
|
+
/** 纠错 M:每个版本的 [每块纠错码字数, 第一组块数, 第一组每块数据码字数, 第二组块数](第二组每块多 1 个数据码字) */
|
|
7
|
+
const BLOCKS_M = [
|
|
8
|
+
[10, 1, 16, 0],
|
|
9
|
+
[16, 1, 28, 0],
|
|
10
|
+
[26, 1, 44, 0],
|
|
11
|
+
[18, 2, 32, 0],
|
|
12
|
+
[24, 2, 43, 0],
|
|
13
|
+
[16, 4, 27, 0],
|
|
14
|
+
[18, 4, 31, 0],
|
|
15
|
+
[22, 2, 38, 2],
|
|
16
|
+
[22, 3, 36, 2],
|
|
17
|
+
[26, 4, 43, 1],
|
|
18
|
+
];
|
|
19
|
+
export const QR_MAX_VERSION = BLOCKS_M.length;
|
|
20
|
+
/** 校正图形的中心坐标(版本 2 起) */
|
|
21
|
+
const ALIGN = [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50]];
|
|
22
|
+
function dataCodewords(v) {
|
|
23
|
+
const [, b1, d1, b2] = BLOCKS_M[v - 1];
|
|
24
|
+
return b1 * d1 + b2 * (d1 + 1);
|
|
25
|
+
}
|
|
26
|
+
/** 编码一段文字(UTF-8)。放不下(超过版本 10)返回 null,调用方就不画码 */
|
|
27
|
+
export function qrEncode(text) {
|
|
28
|
+
const bytes = new TextEncoder().encode(text);
|
|
29
|
+
let version = 0;
|
|
30
|
+
for (let v = 1; v <= QR_MAX_VERSION; v++) {
|
|
31
|
+
const countBits = v < 10 ? 8 : 16;
|
|
32
|
+
if (4 + countBits + bytes.length * 8 <= dataCodewords(v) * 8) {
|
|
33
|
+
version = v;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!version)
|
|
38
|
+
return null;
|
|
39
|
+
const data = interleave(version, pack(bytes, version));
|
|
40
|
+
return place(version, data);
|
|
41
|
+
}
|
|
42
|
+
/** 模式指示 0100(字节)+ 长度 + 数据 + 结束符 + 补齐 */
|
|
43
|
+
function pack(bytes, v) {
|
|
44
|
+
const bits = [];
|
|
45
|
+
const put = (val, n) => {
|
|
46
|
+
for (let i = n - 1; i >= 0; i--)
|
|
47
|
+
bits.push((val >>> i) & 1);
|
|
48
|
+
};
|
|
49
|
+
put(4, 4);
|
|
50
|
+
put(bytes.length, v < 10 ? 8 : 16);
|
|
51
|
+
for (const b of bytes)
|
|
52
|
+
put(b, 8);
|
|
53
|
+
const cap = dataCodewords(v) * 8;
|
|
54
|
+
put(0, Math.min(4, cap - bits.length));
|
|
55
|
+
put(0, (8 - (bits.length % 8)) % 8);
|
|
56
|
+
const out = [];
|
|
57
|
+
for (let i = 0; i < bits.length; i += 8)
|
|
58
|
+
out.push(bits.slice(i, i + 8).reduce((a, b) => (a << 1) | b, 0));
|
|
59
|
+
for (let pad = 0xec; out.length < cap / 8; pad ^= 0xec ^ 0x11)
|
|
60
|
+
out.push(pad);
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
// GF(256),本原多项式 0x11d
|
|
64
|
+
function gfMul(a, b) {
|
|
65
|
+
let r = 0;
|
|
66
|
+
for (let i = 7; i >= 0; i--) {
|
|
67
|
+
r = (r << 1) ^ ((r >>> 7) * 0x11d);
|
|
68
|
+
r ^= ((b >>> i) & 1) * a;
|
|
69
|
+
}
|
|
70
|
+
return r & 0xff;
|
|
71
|
+
}
|
|
72
|
+
/** RS 生成多项式(最高次项系数 1 省略) */
|
|
73
|
+
function rsGenerator(degree) {
|
|
74
|
+
const g = new Array(degree).fill(0);
|
|
75
|
+
g[degree - 1] = 1;
|
|
76
|
+
let root = 1;
|
|
77
|
+
for (let i = 0; i < degree; i++) {
|
|
78
|
+
for (let j = 0; j < degree; j++) {
|
|
79
|
+
g[j] = gfMul(g[j], root) ^ (j + 1 < degree ? g[j + 1] : 0);
|
|
80
|
+
}
|
|
81
|
+
root = gfMul(root, 2);
|
|
82
|
+
}
|
|
83
|
+
return g;
|
|
84
|
+
}
|
|
85
|
+
function rsRemainder(data, gen) {
|
|
86
|
+
const r = new Array(gen.length).fill(0);
|
|
87
|
+
for (const b of data) {
|
|
88
|
+
const f = b ^ r.shift();
|
|
89
|
+
r.push(0);
|
|
90
|
+
gen.forEach((c, i) => (r[i] = r[i] ^ gfMul(c, f)));
|
|
91
|
+
}
|
|
92
|
+
return r;
|
|
93
|
+
}
|
|
94
|
+
/** 分块、算纠错码、交错排列 */
|
|
95
|
+
function interleave(v, data) {
|
|
96
|
+
const [ec, b1, d1, b2] = BLOCKS_M[v - 1];
|
|
97
|
+
const gen = rsGenerator(ec);
|
|
98
|
+
const blocks = [];
|
|
99
|
+
let k = 0;
|
|
100
|
+
for (let i = 0; i < b1 + b2; i++) {
|
|
101
|
+
const len = d1 + (i < b1 ? 0 : 1);
|
|
102
|
+
blocks.push(data.slice(k, k + len));
|
|
103
|
+
k += len;
|
|
104
|
+
}
|
|
105
|
+
const ecs = blocks.map((b) => rsRemainder(b, gen));
|
|
106
|
+
const out = [];
|
|
107
|
+
for (let i = 0; i <= d1; i++)
|
|
108
|
+
for (const b of blocks)
|
|
109
|
+
if (i < b.length)
|
|
110
|
+
out.push(b[i]);
|
|
111
|
+
for (let i = 0; i < ec; i++)
|
|
112
|
+
for (const e of ecs)
|
|
113
|
+
out.push(e[i]);
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
const MASKS = [
|
|
117
|
+
(x, y) => (x + y) % 2 === 0,
|
|
118
|
+
(_x, y) => y % 2 === 0,
|
|
119
|
+
(x) => x % 3 === 0,
|
|
120
|
+
(x, y) => (x + y) % 3 === 0,
|
|
121
|
+
(x, y) => (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0,
|
|
122
|
+
(x, y) => ((x * y) % 2) + ((x * y) % 3) === 0,
|
|
123
|
+
(x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 === 0,
|
|
124
|
+
(x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 === 0,
|
|
125
|
+
];
|
|
126
|
+
/** 画功能图形、填数据、挑罚分最低的掩码 */
|
|
127
|
+
function place(version, data) {
|
|
128
|
+
const size = version * 4 + 17;
|
|
129
|
+
const dark = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
130
|
+
const fixed = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
131
|
+
const set = (x, y, on) => {
|
|
132
|
+
dark[y][x] = on;
|
|
133
|
+
fixed[y][x] = true;
|
|
134
|
+
};
|
|
135
|
+
for (let i = 0; i < size; i++) {
|
|
136
|
+
set(6, i, i % 2 === 0);
|
|
137
|
+
set(i, 6, i % 2 === 0);
|
|
138
|
+
}
|
|
139
|
+
for (const [cx, cy] of [[3, 3], [size - 4, 3], [3, size - 4]]) {
|
|
140
|
+
for (let dy = -4; dy <= 4; dy++) {
|
|
141
|
+
for (let dx = -4; dx <= 4; dx++) {
|
|
142
|
+
const x = cx + dx;
|
|
143
|
+
const y = cy + dy;
|
|
144
|
+
const d = Math.max(Math.abs(dx), Math.abs(dy));
|
|
145
|
+
if (x >= 0 && x < size && y >= 0 && y < size)
|
|
146
|
+
set(x, y, d !== 2 && d !== 4);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const al = ALIGN[version - 1];
|
|
151
|
+
al.forEach((ay, i) => al.forEach((ax, j) => {
|
|
152
|
+
const last = al.length - 1;
|
|
153
|
+
if ((i === 0 && j === 0) || (i === 0 && j === last) || (i === last && j === 0))
|
|
154
|
+
return;
|
|
155
|
+
for (let dy = -2; dy <= 2; dy++)
|
|
156
|
+
for (let dx = -2; dx <= 2; dx++)
|
|
157
|
+
set(ax + dx, ay + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
|
|
158
|
+
}));
|
|
159
|
+
formatBits(set, size, 0); // 先占位,挑好掩码再写真的
|
|
160
|
+
if (version >= 7) {
|
|
161
|
+
let rem = version;
|
|
162
|
+
for (let i = 0; i < 12; i++)
|
|
163
|
+
rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);
|
|
164
|
+
const bits = (version << 12) | rem;
|
|
165
|
+
for (let i = 0; i < 18; i++) {
|
|
166
|
+
const on = ((bits >>> i) & 1) === 1;
|
|
167
|
+
const a = size - 11 + (i % 3);
|
|
168
|
+
const b = Math.floor(i / 3);
|
|
169
|
+
set(a, b, on);
|
|
170
|
+
set(b, a, on);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// 数据:从右下角起两列一组,蛇形上下走,跳过第 6 列(竖的定时线)
|
|
174
|
+
let i = 0;
|
|
175
|
+
for (let right = size - 1; right >= 1; right -= 2) {
|
|
176
|
+
if (right === 6)
|
|
177
|
+
right = 5;
|
|
178
|
+
for (let vert = 0; vert < size; vert++) {
|
|
179
|
+
for (let j = 0; j < 2; j++) {
|
|
180
|
+
const x = right - j;
|
|
181
|
+
const y = ((right + 1) & 2) === 0 ? size - 1 - vert : vert;
|
|
182
|
+
if (!fixed[y][x] && i < data.length * 8) {
|
|
183
|
+
dark[y][x] = ((data[i >>> 3] >>> (7 - (i & 7))) & 1) === 1;
|
|
184
|
+
i++;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
let best = 0;
|
|
190
|
+
let bestScore = Infinity;
|
|
191
|
+
for (let m = 0; m < MASKS.length; m++) {
|
|
192
|
+
const trial = dark.map((row, y) => row.map((on, x) => (fixed[y][x] ? on : on !== MASKS[m](x, y))));
|
|
193
|
+
formatBits((x, y, on) => (trial[y][x] = on), size, m);
|
|
194
|
+
const s = penalty(trial);
|
|
195
|
+
if (s < bestScore) {
|
|
196
|
+
bestScore = s;
|
|
197
|
+
best = m;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const out = dark.map((row, y) => row.map((on, x) => (fixed[y][x] ? on : on !== MASKS[best](x, y))));
|
|
201
|
+
formatBits((x, y, on) => (out[y][x] = on), size, best);
|
|
202
|
+
return { size, version, dark: out };
|
|
203
|
+
}
|
|
204
|
+
/** 格式信息(纠错 M = 00 + 掩码号,BCH 后异或 0x5412),两份;外加那个固定的深色格 */
|
|
205
|
+
function formatBits(set, size, mask) {
|
|
206
|
+
const data = mask; // M 的两位是 00
|
|
207
|
+
let rem = data;
|
|
208
|
+
for (let i = 0; i < 10; i++)
|
|
209
|
+
rem = (rem << 1) ^ ((rem >>> 9) * 0x537);
|
|
210
|
+
const bits = ((data << 10) | rem) ^ 0x5412;
|
|
211
|
+
const bit = (i) => ((bits >>> i) & 1) === 1;
|
|
212
|
+
for (let i = 0; i <= 5; i++)
|
|
213
|
+
set(8, i, bit(i));
|
|
214
|
+
set(8, 7, bit(6));
|
|
215
|
+
set(8, 8, bit(7));
|
|
216
|
+
set(7, 8, bit(8));
|
|
217
|
+
for (let i = 9; i < 15; i++)
|
|
218
|
+
set(14 - i, 8, bit(i));
|
|
219
|
+
for (let i = 0; i < 8; i++)
|
|
220
|
+
set(size - 1 - i, 8, bit(i));
|
|
221
|
+
for (let i = 8; i < 15; i++)
|
|
222
|
+
set(8, size - 15 + i, bit(i));
|
|
223
|
+
set(8, size - 8, true);
|
|
224
|
+
}
|
|
225
|
+
/** 掩码罚分(规范的四条),越低越好扫 */
|
|
226
|
+
function penalty(m) {
|
|
227
|
+
const size = m.length;
|
|
228
|
+
let score = 0;
|
|
229
|
+
const lines = [];
|
|
230
|
+
for (let y = 0; y < size; y++)
|
|
231
|
+
lines.push(m[y], m.map((row) => row[y]));
|
|
232
|
+
const finderLike = /10111010000|00001011101/g;
|
|
233
|
+
for (const line of lines) {
|
|
234
|
+
let run = 1;
|
|
235
|
+
for (let i = 1; i <= size; i++) {
|
|
236
|
+
if (i < size && line[i] === line[i - 1])
|
|
237
|
+
run++;
|
|
238
|
+
else {
|
|
239
|
+
if (run >= 5)
|
|
240
|
+
score += run - 2;
|
|
241
|
+
run = 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// 外面算浅色:两头各补 4 个浅格再找像定位图形的那一串
|
|
245
|
+
const s = `0000${line.map((on) => (on ? 1 : 0)).join('')}0000`;
|
|
246
|
+
score += (s.match(finderLike)?.length ?? 0) * 40;
|
|
247
|
+
}
|
|
248
|
+
let darkCount = 0;
|
|
249
|
+
for (let y = 0; y < size; y++) {
|
|
250
|
+
for (let x = 0; x < size; x++) {
|
|
251
|
+
if (m[y][x])
|
|
252
|
+
darkCount++;
|
|
253
|
+
if (x + 1 < size && y + 1 < size) {
|
|
254
|
+
const c = m[y][x];
|
|
255
|
+
if (m[y][x + 1] === c && m[y + 1][x] === c && m[y + 1][x + 1] === c)
|
|
256
|
+
score += 3;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const total = size * size;
|
|
261
|
+
score += Math.max(0, Math.ceil(Math.abs(darkCount * 20 - total * 10) / total) - 1) * 10;
|
|
262
|
+
return score;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=qr.js.map
|
package/dist/qr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"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"}
|