canary-kit 0.10.0 → 1.0.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/CANARY.md +39 -1
- package/INTEGRATION.md +149 -0
- package/LICENSE +1 -1
- package/NIP-CANARY.md +28 -2
- package/README.md +28 -2
- package/SECURITY.md +1 -1
- package/dist/beacon.d.ts.map +1 -1
- package/dist/beacon.js +43 -2
- package/dist/beacon.js.map +1 -1
- package/dist/group.d.ts.map +1 -1
- package/dist/group.js +4 -0
- package/dist/group.js.map +1 -1
- package/dist/nostr.d.ts +104 -88
- package/dist/nostr.d.ts.map +1 -1
- package/dist/nostr.js +134 -111
- package/dist/nostr.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +60 -15
- package/dist/session.js.map +1 -1
- package/dist/sync-crypto.d.ts.map +1 -1
- package/dist/sync-crypto.js +7 -1
- package/dist/sync-crypto.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +40 -10
- package/dist/sync.js.map +1 -1
- package/llms-full.txt +1 -1
- package/llms.txt +1 -1
- package/package.json +5 -5
package/CANARY.md
CHANGED
|
@@ -31,6 +31,32 @@ The protocol is defined in three layers:
|
|
|
31
31
|
monitoring)
|
|
32
32
|
3. **CANARY-WORDLIST** — Spoken-word encoding optimised for voice clarity
|
|
33
33
|
|
|
34
|
+
## Protocol Layering
|
|
35
|
+
|
|
36
|
+
CANARY builds on two generic protocol specifications:
|
|
37
|
+
|
|
38
|
+
- **[Spoken Token Protocol](https://github.com/forgesworn/spoken-token/blob/main/PROTOCOL.md)**
|
|
39
|
+
— defines SPOKEN-DERIVE (the core HMAC-counter-to-words derivation) and SPOKEN-ENCODE
|
|
40
|
+
(word/PIN/hex encoding). CANARY-DERIVE is a superset of SPOKEN-DERIVE. The generic
|
|
41
|
+
protocol is implemented by the `spoken-token` npm package.
|
|
42
|
+
|
|
43
|
+
- **[Simple Shared Secret Groups](GROUPS.md)** — defines the group lifecycle (creation,
|
|
44
|
+
member management, seed rotation, sync protocol, replay protection). CANARY groups
|
|
45
|
+
are an application of this generic group protocol with additional duress, liveness,
|
|
46
|
+
and beacon extensions.
|
|
47
|
+
|
|
48
|
+
The Nostr transport binding is defined in two layers:
|
|
49
|
+
|
|
50
|
+
- **[NIP-XX: Simple Shared Secret Groups](NIP-XX.md)** — maps the generic group
|
|
51
|
+
protocol onto existing Nostr kinds (30078, NIP-17, 20078). Zero new event kinds.
|
|
52
|
+
|
|
53
|
+
- **[NIP-CANARY](NIP-CANARY.md)** — application profile of NIP-XX adding
|
|
54
|
+
CANARY-specific signal types (duress alerts, beacons) and Meshtastic fallback.
|
|
55
|
+
|
|
56
|
+
CANARY's unique contributions beyond the generic layers are: **duress detection**
|
|
57
|
+
(CANARY-DURESS), **liveness monitoring** (dead man's switch), **threat-profile
|
|
58
|
+
presets**, and **encrypted location beacons**.
|
|
59
|
+
|
|
34
60
|
## Motivation
|
|
35
61
|
|
|
36
62
|
AI voice cloning now requires as little as three seconds of audio. A thirty-second clip
|
|
@@ -96,6 +122,12 @@ separate keys or counters.
|
|
|
96
122
|
|
|
97
123
|
Core deterministic token derivation. The universal primitive that all other layers build on.
|
|
98
124
|
|
|
125
|
+
> **Generic layer:** The core derivation algorithm (HMAC-SHA256 with context and counter)
|
|
126
|
+
> is specified generically in the [Spoken Token Protocol](https://github.com/forgesworn/spoken-token/blob/main/PROTOCOL.md)
|
|
127
|
+
> as SPOKEN-DERIVE. CANARY-DERIVE is identical to SPOKEN-DERIVE — this section
|
|
128
|
+
> documents it in CANARY's context for completeness. The `spoken-token` npm package
|
|
129
|
+
> provides a standalone implementation of the generic layer.
|
|
130
|
+
|
|
99
131
|
### Algorithm
|
|
100
132
|
|
|
101
133
|
```
|
|
@@ -163,6 +195,12 @@ re-sync messages) MUST enforce the following rules:
|
|
|
163
195
|
|
|
164
196
|
## CANARY-SYNC: Transport-Agnostic Synchronisation
|
|
165
197
|
|
|
198
|
+
> **Generic layer:** The core group management protocol (creation, member management,
|
|
199
|
+
> seed rotation, counter sync, replay protection) is specified generically in
|
|
200
|
+
> [Simple Shared Secret Groups](GROUPS.md). CANARY-SYNC extends it with
|
|
201
|
+
> application-specific message types: `beacon`, `duress-alert`, `duress-clear`,
|
|
202
|
+
> and `liveness-checkin`.
|
|
203
|
+
|
|
166
204
|
CANARY-SYNC is the protocol layer for propagating group state mutations and telemetry
|
|
167
205
|
across any transport without depending on Nostr or any specific relay infrastructure.
|
|
168
206
|
It operates over any channel capable of delivering authenticated, ordered or unordered
|
|
@@ -1062,4 +1100,4 @@ import {
|
|
|
1062
1100
|
} from 'canary-kit/encoding'
|
|
1063
1101
|
```
|
|
1064
1102
|
|
|
1065
|
-
Source: `https://github.com/
|
|
1103
|
+
Source: `https://github.com/forgesworn/canary-kit`
|
package/INTEGRATION.md
CHANGED
|
@@ -12,6 +12,9 @@ help derive the correct word. Only knowledge of the shared secret does.
|
|
|
12
12
|
This guide covers seed establishment patterns and call centre integration for
|
|
13
13
|
insurance, banking, and enterprise use cases.
|
|
14
14
|
|
|
15
|
+
For regulatory alignment analysis — including FCA, RBI, UAE TDRA, EU AI Act,
|
|
16
|
+
eIDAS, and W3C Confidence Method — see [REGULATORY.md](REGULATORY.md).
|
|
17
|
+
|
|
15
18
|
## Seed Establishment Patterns
|
|
16
19
|
|
|
17
20
|
The shared seed is the foundation of CANARY verification. How it gets to both
|
|
@@ -209,6 +212,152 @@ if (result.status === 'duress') {
|
|
|
209
212
|
| Social engineering | Yes | Bidirectional — attacker must know the secret |
|
|
210
213
|
| Coercion / duress | Yes | Distinct duress token triggers silent alert |
|
|
211
214
|
|
|
215
|
+
## Regulatory Considerations
|
|
216
|
+
|
|
217
|
+
The deployment patterns above align with specific regulatory frameworks. This
|
|
218
|
+
section summarises the alignment; see [REGULATORY.md](REGULATORY.md) for the
|
|
219
|
+
full analysis including gap assessments.
|
|
220
|
+
|
|
221
|
+
### FCA Strong Customer Authentication (UK)
|
|
222
|
+
|
|
223
|
+
Pattern 1 (App-Derived Seed) provides two SCA factors for voice-channel payment
|
|
224
|
+
authorisation:
|
|
225
|
+
|
|
226
|
+
- **Knowledge factor** — the shared seed, known only to the customer and institution
|
|
227
|
+
- **Possession factor** — the seed stored in device secure storage (Keychain / KeyStore) behind biometrics or PIN
|
|
228
|
+
|
|
229
|
+
CANARY tokens rotate on a time-based counter (P4: Replay Resistance). For
|
|
230
|
+
transaction-specific dynamic linking (required by FCA for remote electronic
|
|
231
|
+
payments), construct the session namespace or counter from transaction parameters:
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
const session = createSession({
|
|
235
|
+
secret: seed,
|
|
236
|
+
namespace: `aviva:payment:${payeeId}:${amountPence}`,
|
|
237
|
+
roles: ['caller', 'agent'],
|
|
238
|
+
myRole: 'agent',
|
|
239
|
+
preset: 'call',
|
|
240
|
+
theirIdentity: customerId,
|
|
241
|
+
})
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### RBI Digital Payment Authentication (India)
|
|
245
|
+
|
|
246
|
+
Pattern 1 satisfies the RBI's two-factor authentication requirement for digital
|
|
247
|
+
payment transactions (effective 1 April 2026). The CANARY token serves as a
|
|
248
|
+
dynamic factor — unique per time window, computed locally, and not transmitted
|
|
249
|
+
over SMS.
|
|
250
|
+
|
|
251
|
+
For voice-channel payment authorisation, CANARY replaces SMS OTP with a spoken
|
|
252
|
+
dynamic factor that does not require the customer to read digits aloud — reducing
|
|
253
|
+
interception and shoulder-surfing risk.
|
|
254
|
+
|
|
255
|
+
### UAE TDRA SMS-OTP Phase-Out
|
|
256
|
+
|
|
257
|
+
CBUAE Circular 3057 discontinues SMS and email OTP for financial transactions
|
|
258
|
+
(effective 31 March 2026). Pattern 1 provides a direct replacement:
|
|
259
|
+
|
|
260
|
+
- No SMS dependency — seeds are derived server-side and delivered over TLS during app login
|
|
261
|
+
- Offline derivation — tokens computed locally after initial sync
|
|
262
|
+
- Phishing resistance — tokens are HMAC-derived from a secret unavailable to phishing sites
|
|
263
|
+
|
|
264
|
+
Pattern 3 (SMS/Email OTP Bootstrap) should be treated as a transitional step to
|
|
265
|
+
Pattern 1, not as a long-term authentication mechanism in UAE-regulated contexts.
|
|
266
|
+
|
|
267
|
+
### EU AI Act Article 50 (Deepfake Transparency)
|
|
268
|
+
|
|
269
|
+
CANARY is complementary to Article 50 obligations (effective 2 August 2026).
|
|
270
|
+
Article 50 requires labelling of AI-generated content. CANARY verifies caller
|
|
271
|
+
identity at the point of interaction — a different concern. Organisations
|
|
272
|
+
deploying both achieve defence-in-depth:
|
|
273
|
+
|
|
274
|
+
- The AI system labels synthetic outputs (Article 50 compliance)
|
|
275
|
+
- CANARY verifies the human on the call is authenticated (caller integrity)
|
|
276
|
+
|
|
277
|
+
"Labelling tells you the content was AI-generated. CANARY tells you the person
|
|
278
|
+
on the phone is who they claim to be."
|
|
279
|
+
|
|
280
|
+
## Cold-Call Verification (Signet)
|
|
281
|
+
|
|
282
|
+
The patterns above require a prior relationship — the customer must have the
|
|
283
|
+
institution's app installed and a seed provisioned. For the scenario where an
|
|
284
|
+
institution calls a customer who has no prior enrolment, the
|
|
285
|
+
[Signet protocol](https://github.com/forgesworn/signet) provides cold-call
|
|
286
|
+
verification.
|
|
287
|
+
|
|
288
|
+
### How it works
|
|
289
|
+
|
|
290
|
+
The institution publishes a secp256k1 public key on its domain:
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
GET https://example-bank.co.uk/.well-known/signet.json
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
```json
|
|
297
|
+
{
|
|
298
|
+
"version": 1,
|
|
299
|
+
"name": "Example Bank",
|
|
300
|
+
"pubkeys": [
|
|
301
|
+
{
|
|
302
|
+
"id": "fraud-team",
|
|
303
|
+
"pubkey": "64-char-hex-secp256k1-x-only-pubkey",
|
|
304
|
+
"label": "Fraud & Security Team",
|
|
305
|
+
"created": "2026-01-15T00:00:00Z"
|
|
306
|
+
}
|
|
307
|
+
],
|
|
308
|
+
"relay": "https://verify.example-bank.co.uk/signet",
|
|
309
|
+
"policy": {
|
|
310
|
+
"rotation": "quarterly",
|
|
311
|
+
"contact": "security@example-bank.co.uk"
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
When the institution calls a customer:
|
|
317
|
+
|
|
318
|
+
1. Agent: "I'm calling from Example Bank. Can you Signet me?"
|
|
319
|
+
2. Customer opens the Signet app, types `example-bank.co.uk`
|
|
320
|
+
3. App fetches the institution's public key from `.well-known/signet.json`
|
|
321
|
+
4. App generates an ephemeral keypair, computes ECDH with the institution's key
|
|
322
|
+
5. App shows a short session code (e.g. `BRAVO-7742`) and 3 verification words
|
|
323
|
+
6. Customer reads the session code to the agent
|
|
324
|
+
7. Agent's system resolves the session code, performs ECDH, derives the same words
|
|
325
|
+
8. Agent reads the words — customer confirms they match
|
|
326
|
+
|
|
327
|
+
No prior enrolment. No shared secret. The trust anchor is DNS domain ownership.
|
|
328
|
+
|
|
329
|
+
### Deployment for institutions
|
|
330
|
+
|
|
331
|
+
Minimum deployment is a single static JSON file at `/.well-known/signet.json`
|
|
332
|
+
on the institution's domain. Requirements:
|
|
333
|
+
|
|
334
|
+
- HTTPS only (no HTTP fallback)
|
|
335
|
+
- Max 20 pubkeys per file, max 10 KB
|
|
336
|
+
- Pubkeys as 64-character hex (secp256k1 x-only public keys)
|
|
337
|
+
- Key rotation policy recommended (quarterly minimum)
|
|
338
|
+
- Private keys MUST be stored in an HSM for regulated institutions
|
|
339
|
+
|
|
340
|
+
For session code resolution, the institution hosts a lightweight HTTPS endpoint
|
|
341
|
+
(specified in the `relay` field). See the
|
|
342
|
+
[Signet protocol spec §27](https://github.com/forgesworn/signet) for the full
|
|
343
|
+
specification.
|
|
344
|
+
|
|
345
|
+
### Relationship to CANARY
|
|
346
|
+
|
|
347
|
+
Cold-call verification and CANARY are complementary:
|
|
348
|
+
|
|
349
|
+
| | Cold-Call (Signet) | CANARY Session |
|
|
350
|
+
|---|---|---|
|
|
351
|
+
| Prior relationship | Not required | Required (shared seed) |
|
|
352
|
+
| Duress detection | No | Yes |
|
|
353
|
+
| Liveness monitoring | No | Yes |
|
|
354
|
+
| Offline / mesh | No | Yes |
|
|
355
|
+
| Use case | "Is this my bank calling?" | "Am I safe? Is my family safe?" |
|
|
356
|
+
|
|
357
|
+
For institutions: deploy `.well-known/signet.json` for cold-call verification,
|
|
358
|
+
and Pattern 1 (App-Derived Seed) for enrolled customers. Both use spoken-token
|
|
359
|
+
HMAC-SHA256 derivation under the hood.
|
|
360
|
+
|
|
212
361
|
## Example: Insurance Phone Verification
|
|
213
362
|
|
|
214
363
|
End-to-end walkthrough using Aviva as the example:
|
package/LICENSE
CHANGED
package/NIP-CANARY.md
CHANGED
|
@@ -13,6 +13,32 @@ providing group management, seed distribution, and counter synchronisation over
|
|
|
13
13
|
Nostr relays. The core protocol (CANARY-DERIVE, CANARY-DURESS, CANARY-WORDLIST)
|
|
14
14
|
is defined in the transport-agnostic [CANARY specification](CANARY.md).
|
|
15
15
|
|
|
16
|
+
## Protocol Layering
|
|
17
|
+
|
|
18
|
+
NIP-CANARY is an **application profile** of [NIP-XX: Simple Shared Secret Groups](NIP-XX.md).
|
|
19
|
+
|
|
20
|
+
The generic group transport (NIP-XX) defines how to manage shared-secret groups over
|
|
21
|
+
Nostr using existing event kinds:
|
|
22
|
+
- **Kind 30078** (NIP-78) for durable group state
|
|
23
|
+
- **NIP-17 gift wraps** for secret distribution
|
|
24
|
+
- **Kind 20078** (ephemeral) for real-time signals
|
|
25
|
+
|
|
26
|
+
NIP-CANARY extends NIP-XX with CANARY-specific features:
|
|
27
|
+
- **Duress signal semantics** in kind 20078 payloads (`duress-alert`, `duress-clear`)
|
|
28
|
+
- **Encrypted location beacons** in kind 20078 payloads
|
|
29
|
+
- **Liveness check-in signals** for dead man's switch
|
|
30
|
+
- **Meshtastic fallback transport** for offline/mesh operation
|
|
31
|
+
|
|
32
|
+
The six custom event kinds defined below (38800–20800) represent the **current
|
|
33
|
+
implementation**. A future version of this NIP will migrate to NIP-XX's transport
|
|
34
|
+
mapping (zero new kinds). The custom kinds are documented here for compatibility
|
|
35
|
+
with existing deployments.
|
|
36
|
+
|
|
37
|
+
> **Migration path:** New implementations SHOULD use NIP-XX transport (kind 30078,
|
|
38
|
+
> NIP-17, kind 20078) with the `ssg/` tag prefix and CANARY-specific signal types.
|
|
39
|
+
> Existing implementations using kinds 38800–20800 will continue to work — clients
|
|
40
|
+
> MAY support both during the transition period.
|
|
41
|
+
|
|
16
42
|
## Nostr Canary Groups
|
|
17
43
|
|
|
18
44
|
This section defines a Nostr application layer built on the CANARY protocol, providing
|
|
@@ -608,7 +634,7 @@ and distributed with the `canary-kit` npm package. Implementations MUST use this
|
|
|
608
634
|
list without modification. The wordlist file contains exactly 2048 entries, one word per
|
|
609
635
|
line, ordered alphabetically, UTF-8 encoding, Unix line endings.
|
|
610
636
|
|
|
611
|
-
Reference: `https://github.com/
|
|
637
|
+
Reference: `https://github.com/forgesworn/canary-kit` — `src/wordlists/en-v1.txt`
|
|
612
638
|
|
|
613
639
|
## Reference Implementation
|
|
614
640
|
|
|
@@ -621,4 +647,4 @@ import {
|
|
|
621
647
|
} from 'canary-kit'
|
|
622
648
|
```
|
|
623
649
|
|
|
624
|
-
Source: `https://github.com/
|
|
650
|
+
Source: `https://github.com/forgesworn/canary-kit`
|
package/README.md
CHANGED
|
@@ -3,13 +3,39 @@
|
|
|
3
3
|
> Deepfake-proof identity verification. Open protocol, minimal dependencies.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/canary-kit)
|
|
6
|
-
[](https://github.com/forgesworn/canary-kit/actions)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://www.typescriptlang.org/)
|
|
9
9
|
[](vitest.config.ts)
|
|
10
10
|
|
|
11
11
|
**[Interactive Demo](https://canary.trotters.cc/)** · [Protocol Spec](CANARY.md) · [Nostr Binding](NIP-CANARY.md) · [Integration Guide](INTEGRATION.md)
|
|
12
12
|
|
|
13
|
+
## Why Now
|
|
14
|
+
|
|
15
|
+
Regulators and criminals arrived at the same inflection point simultaneously. In
|
|
16
|
+
March 2023 the UN Office on Drugs and Crime formally linked AI synthetic voice to
|
|
17
|
+
organised criminal networks operating cross-border fraud at institutional scale.
|
|
18
|
+
Voice cloning tools are now available as a service for under $400/month; vishing
|
|
19
|
+
surged 442% in 2025. The same week, the UAE Central Bank set a 31 March 2026
|
|
20
|
+
deadline banning SMS OTP across all licensed financial institutions — the first
|
|
21
|
+
national regulator to mandate its replacement. India's RBI follows on 1 April 2026
|
|
22
|
+
with mandatory two-factor authentication for all digital payment transactions. The
|
|
23
|
+
EU AI Act's deepfake transparency obligation (Article 50) takes effect in August
|
|
24
|
+
2026; EUDI Wallets must be available across all 27 Member States by December 2026.
|
|
25
|
+
FCA Strong Customer Authentication technical standards were updated in March 2026.
|
|
26
|
+
|
|
27
|
+
CANARY is positioned where these pressures converge: the voice channel, where
|
|
28
|
+
authentication is weakest and the regulatory gap is largest. For a detailed mapping
|
|
29
|
+
of CANARY's security properties against each regulation, see
|
|
30
|
+
[REGULATORY.md](REGULATORY.md).
|
|
31
|
+
|
|
32
|
+
The full verification stack covers four caller scenarios: known person, known
|
|
33
|
+
institution (CANARY handles this), unknown person, and unknown institution
|
|
34
|
+
cold-calling — the last via [Signet](https://github.com/forgesworn/signet)
|
|
35
|
+
cold-call verification (forthcoming). Deepfake labelling tools and CANARY are
|
|
36
|
+
complementary: one labels AI-generated content after the fact; CANARY verifies
|
|
37
|
+
the caller's identity in real time at the point of interaction.
|
|
38
|
+
|
|
13
39
|
## The Problem
|
|
14
40
|
|
|
15
41
|
Voice phishing surged 442% in 2025. AI can clone a voice from three seconds of
|
|
@@ -175,7 +201,7 @@ Content is encrypted with **NIP-44**. Events may carry a **NIP-40** `expiration`
|
|
|
175
201
|
|
|
176
202
|
## Support
|
|
177
203
|
|
|
178
|
-
For issues and feature requests, see [GitHub Issues](https://github.com/
|
|
204
|
+
For issues and feature requests, see [GitHub Issues](https://github.com/forgesworn/canary-kit/issues).
|
|
179
205
|
|
|
180
206
|
If you find canary-kit useful, consider sending a tip:
|
|
181
207
|
|
package/SECURITY.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
**Please report security vulnerabilities through GitHub Security Advisories only.**
|
|
13
13
|
|
|
14
|
-
1. Go to [Security Advisories](https://github.com/
|
|
14
|
+
1. Go to [Security Advisories](https://github.com/forgesworn/canary-kit/security/advisories)
|
|
15
15
|
2. Click **"New draft security advisory"**
|
|
16
16
|
3. Fill in the details of the vulnerability
|
|
17
17
|
|
package/dist/beacon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../src/beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../src/beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAG3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAG3D;AA2CD,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAMD,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;IAC9C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,QAAQ,GAAG,UAAU,CAAA;CACtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,cAAc,GAAG,IAAI,GAC9B,WAAW,CA+Bb;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
|
package/dist/beacon.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { hmacSha256, hexToBytes, bytesToBase64, base64ToBytes } from './crypto.js';
|
|
12
12
|
const HEX_64_RE = /^[0-9a-f]{64}$/;
|
|
13
|
+
const GEOHASH_RE = /^[0-9b-hjkmnp-z]+$/;
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
// Key Derivation (sync)
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -87,6 +88,15 @@ async function aesGcmDecrypt(key, content) {
|
|
|
87
88
|
* @throws {Error} If key is not 32 bytes.
|
|
88
89
|
*/
|
|
89
90
|
export async function encryptBeacon(key, geohash, precision) {
|
|
91
|
+
if (typeof geohash !== 'string' || geohash.length === 0 || geohash.length > 11) {
|
|
92
|
+
throw new Error('geohash must be a non-empty string of at most 11 characters');
|
|
93
|
+
}
|
|
94
|
+
if (!GEOHASH_RE.test(geohash)) {
|
|
95
|
+
throw new Error('geohash contains invalid characters (valid: 0-9, b-h, j-k, m-n, p-z)');
|
|
96
|
+
}
|
|
97
|
+
if (!Number.isInteger(precision) || precision < 1 || precision > 11) {
|
|
98
|
+
throw new Error('precision must be an integer between 1 and 11');
|
|
99
|
+
}
|
|
90
100
|
const payload = {
|
|
91
101
|
geohash,
|
|
92
102
|
precision,
|
|
@@ -116,7 +126,13 @@ export async function decryptBeacon(key, content) {
|
|
|
116
126
|
if (typeof obj.geohash !== 'string' || typeof obj.precision !== 'number' || typeof obj.timestamp !== 'number') {
|
|
117
127
|
throw new Error('Invalid beacon payload: missing or malformed required fields');
|
|
118
128
|
}
|
|
119
|
-
|
|
129
|
+
if (obj.geohash.length > 11 || (obj.geohash.length > 0 && !GEOHASH_RE.test(obj.geohash))) {
|
|
130
|
+
throw new Error('Invalid beacon payload: geohash contains invalid characters or exceeds max length');
|
|
131
|
+
}
|
|
132
|
+
if (!Number.isInteger(obj.precision) || obj.precision < 0 || obj.precision > 11) {
|
|
133
|
+
throw new Error('Invalid beacon payload: precision must be an integer between 0 and 11');
|
|
134
|
+
}
|
|
135
|
+
return { geohash: obj.geohash, precision: obj.precision, timestamp: obj.timestamp };
|
|
120
136
|
}
|
|
121
137
|
/**
|
|
122
138
|
* Construct a duress alert payload.
|
|
@@ -135,6 +151,15 @@ export function buildDuressAlert(memberPubkey, location) {
|
|
|
135
151
|
throw new Error(`Invalid member pubkey: expected 64 lowercase hex characters, got ${memberPubkey.length} chars`);
|
|
136
152
|
}
|
|
137
153
|
if (location) {
|
|
154
|
+
if (typeof location.geohash !== 'string' || location.geohash.length === 0 || location.geohash.length > 11) {
|
|
155
|
+
throw new Error('location.geohash must be a non-empty string of at most 11 characters');
|
|
156
|
+
}
|
|
157
|
+
if (!GEOHASH_RE.test(location.geohash)) {
|
|
158
|
+
throw new Error('location.geohash contains invalid characters (valid: 0-9, b-h, j-k, m-n, p-z)');
|
|
159
|
+
}
|
|
160
|
+
if (!Number.isInteger(location.precision) || location.precision < 1 || location.precision > 11) {
|
|
161
|
+
throw new Error('location.precision must be an integer between 1 and 11');
|
|
162
|
+
}
|
|
138
163
|
return {
|
|
139
164
|
type: 'duress',
|
|
140
165
|
member: memberPubkey,
|
|
@@ -192,6 +217,22 @@ export async function decryptDuressAlert(key, content) {
|
|
|
192
217
|
!VALID_SOURCES.has(obj.locationSource)) {
|
|
193
218
|
throw new Error('Invalid duress alert payload: missing or malformed required fields');
|
|
194
219
|
}
|
|
195
|
-
|
|
220
|
+
if (!HEX_64_RE.test(obj.member)) {
|
|
221
|
+
throw new Error('Invalid duress alert payload: member must be a 64-character lowercase hex string');
|
|
222
|
+
}
|
|
223
|
+
if (obj.geohash.length > 11 || (obj.geohash.length > 0 && !GEOHASH_RE.test(obj.geohash))) {
|
|
224
|
+
throw new Error('Invalid duress alert payload: geohash contains invalid characters or exceeds max length');
|
|
225
|
+
}
|
|
226
|
+
if (!Number.isInteger(obj.precision) || obj.precision < 0 || obj.precision > 11) {
|
|
227
|
+
throw new Error('Invalid duress alert payload: precision must be an integer between 0 and 11');
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
type: 'duress',
|
|
231
|
+
member: obj.member,
|
|
232
|
+
geohash: obj.geohash,
|
|
233
|
+
precision: obj.precision,
|
|
234
|
+
locationSource: obj.locationSource,
|
|
235
|
+
timestamp: obj.timestamp,
|
|
236
|
+
};
|
|
196
237
|
}
|
|
197
238
|
//# sourceMappingURL=beacon.js.map
|
package/dist/beacon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../src/beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAElF,MAAM,SAAS,GAAG,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../src/beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAElF,MAAM,SAAS,GAAG,gBAAgB,CAAA;AAClC,MAAM,UAAU,GAAG,oBAAoB,CAAA;AAEvC,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,eAAe,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;AACrE,MAAM,eAAe,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;AAErE,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IACnF,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAe;IACrC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,OAAO,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAA;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,OAAO,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAA;AACzD,CAAC;AAED,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,GAAe,EAAE,SAAqB;IACjE,cAAc,CAAC,GAAG,CAAC,CAAA;IACnB,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC7C,KAAK,EAAE,GAA8B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAC/E,CAAA;IACD,MAAM,UAAU,GAAG,IAAI,UAAU,CAC/B,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAoC,CAAC,CACtG,CAAA;IACD,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC5B,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAe,EAAE,OAAe;IAC3D,cAAc,CAAC,GAAG,CAAC,CAAA;IACnB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,kBAAkB,GAAG,EAAE,CAAA,CAAC,oCAAoC;IAClE,IAAI,QAAQ,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAA;IACnG,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC7C,KAAK,EAAE,GAA8B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAC/E,CAAA;IACD,OAAO,IAAI,UAAU,CACnB,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAC5E,CAAA;AACH,CAAC;AAaD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAe,EACf,OAAe,EACf,SAAiB;IAEjB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;IACzF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IACD,MAAM,OAAO,GAAkB;QAC7B,OAAO;QACP,SAAS;QACT,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KACzC,CAAA;IACD,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAe,EACf,OAAe;IAEf,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACnD,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAA;IAC7C,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC9G,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtG,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;AACrF,CAAC;AAuBD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAAoB,EACpB,QAA+B;IAE/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,oEAAoE,YAAY,CAAC,MAAM,QAAQ,CAAC,CAAA;IAClH,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1G,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACzF,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAA;QAClG,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SACzC,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,MAAM;QACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KACzC,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAe,EACf,KAAkB;IAElB,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAe,EACf,OAAe;IAEf,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACnD,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IACtF,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAA;IAC7C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7D,IACE,GAAG,CAAC,IAAI,KAAK,QAAQ;QACrB,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,cAAwB,CAAC,EAChD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;IACvF,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;IAC5G,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;IAChG,CAAC;IACD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,cAAc,EAAE,GAAG,CAAC,cAA+C;QACnE,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAA;AACH,CAAC"}
|
package/dist/group.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../src/group.ts"],"names":[],"mappings":"AAIA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAcvD,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uGAAuG;IACvG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAA;IACvB,iEAAiE;IACjE,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,8HAA8H;IAC9H,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../src/group.ts"],"names":[],"mappings":"AAIA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAcvD,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uGAAuG;IACvG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAA;IACvB,iEAAiE;IACjE,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,8HAA8H;IAC9H,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CA+E3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAIpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAU5D;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAOvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAG1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAGnF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAU3D;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,MAAsC,GAC7C,UAAU,CAIZ"}
|
package/dist/group.js
CHANGED
|
@@ -40,6 +40,9 @@ export function createGroup(config) {
|
|
|
40
40
|
if (typeof config.name !== 'string' || config.name.length === 0) {
|
|
41
41
|
throw new Error('name must be a non-empty string');
|
|
42
42
|
}
|
|
43
|
+
if (config.name.length > 256) {
|
|
44
|
+
throw new Error('name must be at most 256 characters');
|
|
45
|
+
}
|
|
43
46
|
if (config.preset !== undefined) {
|
|
44
47
|
if (typeof config.preset !== 'string' || !Object.hasOwn(PRESETS, config.preset)) {
|
|
45
48
|
throw new Error(`Unknown preset: "${config.preset}". Valid presets: ${Object.keys(PRESETS).join(', ')}`);
|
|
@@ -244,6 +247,7 @@ export function dissolveGroup(state) {
|
|
|
244
247
|
admins: [],
|
|
245
248
|
usageOffset: 0,
|
|
246
249
|
consumedOps: [],
|
|
250
|
+
consumedOpsFloor: undefined,
|
|
247
251
|
};
|
|
248
252
|
}
|
|
249
253
|
/**
|
package/dist/group.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sourceRoot":"","sources":["../src/group.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../src/group.ts"],"names":[],"mappings":"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"}
|