@drakkar.software/octobot-client 0.4.0 → 0.5.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/README.md +1 -1
- package/dist/identity/index.d.ts +1 -1
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +1 -1
- package/dist/identity/index.js.map +1 -1
- package/dist/identity/pairingRequest.d.ts +20 -0
- package/dist/identity/pairingRequest.d.ts.map +1 -1
- package/dist/identity/pairingRequest.js +28 -9
- package/dist/identity/pairingRequest.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol/index.d.ts +1 -0
- package/dist/protocol/index.d.ts.map +1 -1
- package/dist/protocol/index.js +1 -0
- package/dist/protocol/index.js.map +1 -1
- package/dist/protocol/qrFrames.d.ts +146 -0
- package/dist/protocol/qrFrames.d.ts.map +1 -0
- package/dist/protocol/qrFrames.js +307 -0
- package/dist/protocol/qrFrames.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -129,7 +129,7 @@ Full detail: [Escape hatches](https://docs.octobot.cloud/client-sdk/escape-hatch
|
|
|
129
129
|
|
|
130
130
|
| This package | `@drakkar.software/octobot-protocol` | Minimum node |
|
|
131
131
|
|---|---|---|
|
|
132
|
-
| `0.
|
|
132
|
+
| `0.5.0` | `^0.6.0` | protocol 0.4.0 |
|
|
133
133
|
|
|
134
134
|
## More
|
|
135
135
|
|
package/dist/identity/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { entropyToMnemonic, generateSeedPhrase, validateSeedPhrase, } from './mn
|
|
|
4
4
|
export { classifySecret, classifyBareSecret, readSecretEnvelope, type ClassifiedSecret, } from './secret.js';
|
|
5
5
|
export { WalletCapProvider, deriveRoot, BOOTSTRAP_CHALLENGE, type KeyDerivation } from './capProvider.js';
|
|
6
6
|
export { createReadOnlyPairing, parseReadOnlyPairing, type ReadOnlyPairingPayload } from './pairing.js';
|
|
7
|
-
export { createPairingRequest, parsePairingRequest, type PairingRequestPayload } from './pairingRequest.js';
|
|
7
|
+
export { createPairingRequest, parsePairingRequest, parsePairingCode, PAIRING_CODE_ALPHABET, PAIRING_CODE_LENGTH, type PairingRequestPayload, } from './pairingRequest.js';
|
|
8
8
|
export { createKeyCache, type KeyCache } from './keys.js';
|
|
9
9
|
export { registerDerivationScheme, getDerivationScheme, listDerivationSchemeIds, DEFAULT_DERIVATION_SCHEME_ID, type DerivationScheme, type DeriveKeyFn, } from './derivationSchemes.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACvG,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACvG,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAA"}
|
package/dist/identity/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { entropyToMnemonic, generateSeedPhrase, validateSeedPhrase, } from './mn
|
|
|
4
4
|
export { classifySecret, classifyBareSecret, readSecretEnvelope, } from './secret.js';
|
|
5
5
|
export { WalletCapProvider, deriveRoot, BOOTSTRAP_CHALLENGE } from './capProvider.js';
|
|
6
6
|
export { createReadOnlyPairing, parseReadOnlyPairing } from './pairing.js';
|
|
7
|
-
export { createPairingRequest, parsePairingRequest } from './pairingRequest.js';
|
|
7
|
+
export { createPairingRequest, parsePairingRequest, parsePairingCode, PAIRING_CODE_ALPHABET, PAIRING_CODE_LENGTH, } from './pairingRequest.js';
|
|
8
8
|
export { createKeyCache } from './keys.js';
|
|
9
9
|
export { registerDerivationScheme, getDerivationScheme, listDerivationSchemeIds, DEFAULT_DERIVATION_SCHEME_ID, } from './derivationSchemes.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,cAAc,CAAA;AACvG,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,cAAc,CAAA;AACvG,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,GAEpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAiB,MAAM,WAAW,CAAA;AACzD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,GAG7B,MAAM,wBAAwB,CAAA"}
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import { type GeneratedDeviceKeys } from '@drakkar.software/starfish-identities';
|
|
2
2
|
import type { NodeCollectionKey } from '../collections/nodeCollections.js';
|
|
3
|
+
/** Excludes visually-ambiguous characters (0/O, 1/I/L) — Crockford-style,
|
|
4
|
+
* meant to be read off one screen and typed on another. 31 symbols
|
|
5
|
+
* (23 letters + 8 digits), 8 characters ⇒ 8·log2(31) ≈ 39.63 bits of
|
|
6
|
+
* entropy, well above RFC 8628's device-flow `user_code` minimum, and
|
|
7
|
+
* bounded further by the rendezvous collection's short TTL and per-IP
|
|
8
|
+
* rate limit (not something this package controls). `randomCode()` uses
|
|
9
|
+
* rejection sampling (see `CODE_REJECT_THRESHOLD`) so this figure is the
|
|
10
|
+
* real, uniform entropy — not a biased approximation of it. */
|
|
11
|
+
export declare const PAIRING_CODE_ALPHABET = "ABCDEFGHJKMNPQRSTUVWXYZ23456789";
|
|
12
|
+
export declare const PAIRING_CODE_LENGTH = 8;
|
|
13
|
+
/** Normalize and validate a pairing code a user typed or a scanner read.
|
|
14
|
+
* Returns the canonical (trimmed, upper-cased) code, or `null` if the input
|
|
15
|
+
* is not one.
|
|
16
|
+
*
|
|
17
|
+
* Exported because a pairing code is a bare human-typeable string, not JSON:
|
|
18
|
+
* `classifyScannedCode` has no shape to match it against and would report
|
|
19
|
+
* `'unknown'`, so a client scanning both codes and payloads has to test for
|
|
20
|
+
* one itself. Without this, that client ends up re-deriving the alphabet and
|
|
21
|
+
* length by hand and silently drifts the day either changes here. */
|
|
22
|
+
export declare function parsePairingCode(value: string): string | null;
|
|
3
23
|
/** A website's device-code pairing request, published to the `joinsessions`
|
|
4
24
|
* rendezvous collection (`Infra/sync/server/drakkar_sync/apps/dk_spaces/collections.py`,
|
|
5
25
|
* `_pairing/session/{code}`) so the phone app can look it up by the short
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairingRequest.d.ts","sourceRoot":"","sources":["../../src/identity/pairingRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAIpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"pairingRequest.d.ts","sourceRoot":"","sources":["../../src/identity/pairingRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAIpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAE1E;;;;;;;gEAOgE;AAChE,eAAO,MAAM,qBAAqB,oCAAoC,CAAA;AACtE,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAyCpC;;;;;;;;sEAQsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7D;AAeD;;;;;;;;;;;;qCAYqC;AACrC,MAAM,WAAW,qBAAqB;IACpC,CAAC,EAAE,CAAC,CAAA;IACJ,IAAI,EAAE,yBAAyB,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;;yEAQqE;IACrE,aAAa,EAAE,SAAS,GAAG,QAAQ,CAAA;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB;;;qCAGiC;IACjC,MAAM,EAAE,MAAM,CAAA;IACd;;;;;;;;;4BASwB;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB;;kCAE8B;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CACnD;AAED;;;;mCAImC;AACnC,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;6EAEyE;IACzE,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;CACrC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,qBAAqB,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BzF;AAgCD;;;;;;;;;;;;;iEAaiE;AACjE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA2EhG"}
|
|
@@ -10,15 +10,15 @@ import { toHex, hexToBytes } from '../internal/bytes.js';
|
|
|
10
10
|
* rate limit (not something this package controls). `randomCode()` uses
|
|
11
11
|
* rejection sampling (see `CODE_REJECT_THRESHOLD`) so this figure is the
|
|
12
12
|
* real, uniform entropy — not a biased approximation of it. */
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
// 256 is not a multiple of
|
|
13
|
+
export const PAIRING_CODE_ALPHABET = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
|
|
14
|
+
export const PAIRING_CODE_LENGTH = 8;
|
|
15
|
+
// 256 is not a multiple of PAIRING_CODE_ALPHABET.length (31) — a plain `byte %
|
|
16
16
|
// length` would over-represent the first `256 % 31 = 8` symbols (A-H) by
|
|
17
17
|
// 12.5% in every character position. Reject any byte at or above the
|
|
18
18
|
// largest multiple of the alphabet length that still fits in a byte
|
|
19
19
|
// (Math.floor(256 / 31) * 31 = 248) and draw a replacement — the remaining
|
|
20
20
|
// range [0, 248) maps onto the 31 symbols with exactly uniform probability.
|
|
21
|
-
const CODE_REJECT_THRESHOLD = Math.floor(256 /
|
|
21
|
+
const CODE_REJECT_THRESHOLD = Math.floor(256 / PAIRING_CODE_ALPHABET.length) * PAIRING_CODE_ALPHABET.length;
|
|
22
22
|
const DEFAULT_REQUEST_TTL_SEC = 5 * 60;
|
|
23
23
|
// `expiresAt`/`createdAt` are NOT covered by popSig — anyone with the code
|
|
24
24
|
// can rewrite them, and the ONLY thing that kept the code's live window
|
|
@@ -37,20 +37,39 @@ function randomCode() {
|
|
|
37
37
|
const chars = [];
|
|
38
38
|
// Pull a batch at a time (rather than one byte per iteration) so a run of
|
|
39
39
|
// rejected bytes doesn't turn into a syscall-per-byte loop — rejection
|
|
40
|
-
// hits ~3% of bytes, so a fresh
|
|
40
|
+
// hits ~3% of bytes, so a fresh PAIRING_CODE_LENGTH-sized batch almost always
|
|
41
41
|
// finishes the code outright, with a further batch only on the rare tail.
|
|
42
|
-
while (chars.length <
|
|
43
|
-
const batch = randomBytes(
|
|
42
|
+
while (chars.length < PAIRING_CODE_LENGTH) {
|
|
43
|
+
const batch = randomBytes(PAIRING_CODE_LENGTH);
|
|
44
44
|
for (const b of batch) {
|
|
45
45
|
if (b >= CODE_REJECT_THRESHOLD)
|
|
46
46
|
continue;
|
|
47
|
-
chars.push(
|
|
48
|
-
if (chars.length ===
|
|
47
|
+
chars.push(PAIRING_CODE_ALPHABET[b % PAIRING_CODE_ALPHABET.length]);
|
|
48
|
+
if (chars.length === PAIRING_CODE_LENGTH)
|
|
49
49
|
break;
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
return chars.join('');
|
|
53
53
|
}
|
|
54
|
+
/** Normalize and validate a pairing code a user typed or a scanner read.
|
|
55
|
+
* Returns the canonical (trimmed, upper-cased) code, or `null` if the input
|
|
56
|
+
* is not one.
|
|
57
|
+
*
|
|
58
|
+
* Exported because a pairing code is a bare human-typeable string, not JSON:
|
|
59
|
+
* `classifyScannedCode` has no shape to match it against and would report
|
|
60
|
+
* `'unknown'`, so a client scanning both codes and payloads has to test for
|
|
61
|
+
* one itself. Without this, that client ends up re-deriving the alphabet and
|
|
62
|
+
* length by hand and silently drifts the day either changes here. */
|
|
63
|
+
export function parsePairingCode(value) {
|
|
64
|
+
const normalized = value.trim().toUpperCase();
|
|
65
|
+
if (normalized.length !== PAIRING_CODE_LENGTH)
|
|
66
|
+
return null;
|
|
67
|
+
for (const ch of normalized) {
|
|
68
|
+
if (!PAIRING_CODE_ALPHABET.includes(ch))
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return normalized;
|
|
72
|
+
}
|
|
54
73
|
/** What binds `code`/`devEdPub`/`devKemPub` together and proves the
|
|
55
74
|
* requester holds `devEdPriv` — without this, a request record's public
|
|
56
75
|
* keys could be swapped in transit with no way to detect it, and binding
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairingRequest.js","sourceRoot":"","sources":["../../src/identity/pairingRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,uCAAuC,CAAA;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGxD;;;;;;;gEAOgE;AAChE,MAAM,
|
|
1
|
+
{"version":3,"file":"pairingRequest.js","sourceRoot":"","sources":["../../src/identity/pairingRequest.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,9 @@ export { connectOctoBot, type OctoBotClient, type ConnectOptions, type SeedDeriv
|
|
|
2
2
|
export { MIRROR_COLLECTIONS, DEFAULT_MIRROR_COLLECTIONS, THIRD_PARTY_ELIGIBLE_MIRROR_COLLECTIONS, MIRROR_SPACE_NAME, isIsolatedMirrorCollection, isKnownMirrorCollection, isPublicMirrorCollection, isThirdPartyEligible, mirrorVisibilityFor, type MirrorCollection, type MirrorCollectionId, type MirrorVisibility, syncCloudMirror, type SyncCloudMirrorOptions, type SyncCloudMirrorResult, } from './client/mirror/index.js';
|
|
3
3
|
export { strategy, type StrategyBuilders } from './client/strategy.js';
|
|
4
4
|
export { createReadOnlyPairing, parseReadOnlyPairing, type ReadOnlyPairingPayload } from './identity/pairing.js';
|
|
5
|
-
export { createPairingRequest, parsePairingRequest, type PairingRequestPayload } from './identity/pairingRequest.js';
|
|
5
|
+
export { createPairingRequest, parsePairingRequest, parsePairingCode, PAIRING_CODE_ALPHABET, PAIRING_CODE_LENGTH, type PairingRequestPayload, } from './identity/pairingRequest.js';
|
|
6
6
|
export { createRendezvousClient, pullRendezvousDoc, pushRendezvousDoc, clearRendezvousDoc, joinSessionPath, type RendezvousDoc, } from './transport/rendezvous.js';
|
|
7
7
|
export { encodeActionProposal, decodeActionProposal, type ActionProposal, type ProposedActionEntry } from './protocol/proposal.js';
|
|
8
|
+
export { encodeQrFrames, isQrFrame, parseQrFrame, createQrFrameAccumulator, QrPayloadTooLargeError, QR_FRAME_CODEC, QR_FRAME_HEADER_LENGTH, QR_FRAME_INTERVAL_MS, QR_FRAME_STALE_MS, QR_FRAME_MAX_BYTES, QR_FRAME_BODY_MAX_BYTES, QR_SINGLE_FRAME_MAX_BYTES, QR_MAX_FRAMES, QR_FRAME_KIND_UNSPECIFIED, QR_FRAME_KIND_ACTION_PROPOSAL, QR_FRAME_KIND_READ_ONLY_PAIRING, type QrFrame, type QrFrameProgress, type QrFrameAcceptResult, type QrFrameAccumulator, } from './protocol/qrFrames.js';
|
|
8
9
|
export type { Strategy as ProtocolStrategy, Account as ProtocolAccount, AccountState, AccountAuthentication, ExchangeConfig, AutomationState, WorkflowStatus, DetailedAsset, UserAction, UserActionConfiguration, DslKeywordsState, MarketMakingConfiguration, AccountTrading, AccountTradingWithAccountId, DetailedAssetsForTradingType, CreateAutomationConfiguration, } from '@drakkar.software/octobot-protocol';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,KAAK,gBAAgB,EACrB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,uCAAuC,EACvC,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAChH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,8 @@ export { connectOctoBot, OctoBotError, OctoBotConfigError, OctoBotConnectionErro
|
|
|
12
12
|
export { MIRROR_COLLECTIONS, DEFAULT_MIRROR_COLLECTIONS, THIRD_PARTY_ELIGIBLE_MIRROR_COLLECTIONS, MIRROR_SPACE_NAME, isIsolatedMirrorCollection, isKnownMirrorCollection, isPublicMirrorCollection, isThirdPartyEligible, mirrorVisibilityFor, syncCloudMirror, } from './client/mirror/index.js';
|
|
13
13
|
export { strategy } from './client/strategy.js';
|
|
14
14
|
export { createReadOnlyPairing, parseReadOnlyPairing } from './identity/pairing.js';
|
|
15
|
-
export { createPairingRequest, parsePairingRequest } from './identity/pairingRequest.js';
|
|
15
|
+
export { createPairingRequest, parsePairingRequest, parsePairingCode, PAIRING_CODE_ALPHABET, PAIRING_CODE_LENGTH, } from './identity/pairingRequest.js';
|
|
16
16
|
export { createRendezvousClient, pullRendezvousDoc, pushRendezvousDoc, clearRendezvousDoc, joinSessionPath, } from './transport/rendezvous.js';
|
|
17
17
|
export { encodeActionProposal, decodeActionProposal } from './protocol/proposal.js';
|
|
18
|
+
export { encodeQrFrames, isQrFrame, parseQrFrame, createQrFrameAccumulator, QrPayloadTooLargeError, QR_FRAME_CODEC, QR_FRAME_HEADER_LENGTH, QR_FRAME_INTERVAL_MS, QR_FRAME_STALE_MS, QR_FRAME_MAX_BYTES, QR_FRAME_BODY_MAX_BYTES, QR_SINGLE_FRAME_MAX_BYTES, QR_MAX_FRAMES, QR_FRAME_KIND_UNSPECIFIED, QR_FRAME_KIND_ACTION_PROPOSAL, QR_FRAME_KIND_READ_ONLY_PAIRING, } from './protocol/qrFrames.js';
|
|
18
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yEAAyE;AACzE,4CAA4C;AAC5C,EAAE;AACF,qEAAqE;AACrE,0EAA0E;AAC1E,wEAAwE;AACxE,wDAAwD;AACxD,4EAA4E;AAC5E,+BAA+B;AAE/B,OAAO,EACL,cAAc,EAoBd,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EAEd,qBAAqB,EAOrB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EAIzB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EAEnB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EAKxB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,uCAAuC,EACvC,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EAInB,eAAe,GAGhB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAyB,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,uBAAuB,CAAA;AAChH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yEAAyE;AACzE,4CAA4C;AAC5C,EAAE;AACF,qEAAqE;AACrE,0EAA0E;AAC1E,wEAAwE;AACxE,wDAAwD;AACxD,4EAA4E;AAC5E,+BAA+B;AAE/B,OAAO,EACL,cAAc,EAoBd,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EAEd,qBAAqB,EAOrB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EAIzB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EAEnB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EAKxB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,uCAAuC,EACvC,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EAInB,eAAe,GAGhB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAyB,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,uBAAuB,CAAA;AAChH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,GAEpB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAEhB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAiD,MAAM,wBAAwB,CAAA;AAClI,OAAO,EACL,cAAc,EACd,SAAS,EACT,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,yBAAyB,EACzB,6BAA6B,EAC7B,+BAA+B,GAKhC,MAAM,wBAAwB,CAAA"}
|
package/dist/protocol/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export { sleep, pollDelay } from './poll.js';
|
|
|
7
7
|
export { type UserDataState, type AccountsState, type UserActionsDocument, type AccountTradingDocument, } from './documents.js';
|
|
8
8
|
export { runCreateAutomation, AutomationActionFailedError, AutomationTimeoutError, type ActionEmitter, type CreateAutomationInput, type CreateAutomationProgress, } from './orchestration/createAutomation.js';
|
|
9
9
|
export { encodeActionProposal, decodeActionProposal, type ActionProposal, type ProposedActionEntry, } from './proposal.js';
|
|
10
|
+
export { encodeQrFrames, isQrFrame, parseQrFrame, createQrFrameAccumulator, QrPayloadTooLargeError, QR_FRAME_CODEC, QR_FRAME_HEADER_LENGTH, QR_FRAME_MAX_BYTES, QR_FRAME_BODY_MAX_BYTES, QR_SINGLE_FRAME_MAX_BYTES, QR_MAX_FRAMES, QR_FRAME_INTERVAL_MS, QR_FRAME_STALE_MS, QR_FRAME_KIND_UNSPECIFIED, QR_FRAME_KIND_ACTION_PROPOSAL, QR_FRAME_KIND_READ_ONLY_PAIRING, type QrFrame, type QrFrameProgress, type QrFrameAcceptResult, type QrFrameAccumulator, } from './qrFrames.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAI/C,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,EAC/B,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAI/C,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,SAAS,EACT,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,+BAA+B,EAC/B,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAA"}
|
package/dist/protocol/index.js
CHANGED
|
@@ -9,4 +9,5 @@ export { baseCurrencyOf } from './symbols.js';
|
|
|
9
9
|
export { sleep, pollDelay } from './poll.js';
|
|
10
10
|
export { runCreateAutomation, AutomationActionFailedError, AutomationTimeoutError, } from './orchestration/createAutomation.js';
|
|
11
11
|
export { encodeActionProposal, decodeActionProposal, } from './proposal.js';
|
|
12
|
+
export { encodeQrFrames, isQrFrame, parseQrFrame, createQrFrameAccumulator, QrPayloadTooLargeError, QR_FRAME_CODEC, QR_FRAME_HEADER_LENGTH, QR_FRAME_MAX_BYTES, QR_FRAME_BODY_MAX_BYTES, QR_SINGLE_FRAME_MAX_BYTES, QR_MAX_FRAMES, QR_FRAME_INTERVAL_MS, QR_FRAME_STALE_MS, QR_FRAME_KIND_UNSPECIFIED, QR_FRAME_KIND_ACTION_PROPOSAL, QR_FRAME_KIND_READ_ONLY_PAIRING, } from './qrFrames.js';
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,EACR,WAAW,GAIZ,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,GAEhC,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,6EAA6E;AAC7E,gEAAgE;AAChE,iCAAiC;AACjC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAO5C,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,GAIvB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAGrB,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,EACR,WAAW,GAIZ,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,GAEhC,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,6EAA6E;AAC7E,gEAAgE;AAChE,iCAAiC;AACjC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAO5C,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,GAIvB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAGrB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,SAAS,EACT,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,+BAA+B,GAKhC,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/** Generic multi-frame QR transport: splits an oversized string payload into
|
|
2
|
+
* scannable QR frames and reassembles them on the other end. Deliberately
|
|
3
|
+
* payload-agnostic (plain string in, plain string out) — it knows nothing
|
|
4
|
+
* about action proposals or pairing payloads specifically, which is what
|
|
5
|
+
* lets a reassembled payload flow back through whatever generic classifier
|
|
6
|
+
* the caller already uses (`classifyScannedCode`) instead of a
|
|
7
|
+
* codec-specific one.
|
|
8
|
+
*
|
|
9
|
+
* This package never renders a QR image itself, here as everywhere else: it
|
|
10
|
+
* returns the strings to encode and consumes the strings a scanner read. */
|
|
11
|
+
export declare const QR_FRAME_CODEC = "OBQR2";
|
|
12
|
+
/** `OBQR2|<kind>|<8 hex>|<2-digit index>|<2-digit total>|` — constant width,
|
|
13
|
+
* so the body can always be recovered with a fixed `slice`, never a
|
|
14
|
+
* `split('|')` (the body is itself often JSON and freely contains `|`). */
|
|
15
|
+
export declare const QR_FRAME_HEADER_LENGTH = 23;
|
|
16
|
+
/** v11 @ ECL M (a typical QR library default) holds 251 bytes; 11 bytes of
|
|
17
|
+
* slack against a different segmentation choice or a future header field.
|
|
18
|
+
* 61 modules at a ~220pt display box stays comfortably scannable. */
|
|
19
|
+
export declare const QR_FRAME_MAX_BYTES = 240;
|
|
20
|
+
export declare const QR_FRAME_BODY_MAX_BYTES: number;
|
|
21
|
+
/** At or below this, `encodeQrFrames` returns the payload UNFRAMED — no
|
|
22
|
+
* prefix, byte-identical to what a caller would have rendered directly.
|
|
23
|
+
* Keeps every single-frame payload on the exact same path it uses without
|
|
24
|
+
* this module at all. */
|
|
25
|
+
export declare const QR_SINGLE_FRAME_MAX_BYTES = 300;
|
|
26
|
+
/** ~21.4 KB ceiling (99 * 217 body bytes). */
|
|
27
|
+
export declare const QR_MAX_FRAMES = 99;
|
|
28
|
+
/** Recommended display cadence for a producer cycling frames: ~4 fps, well
|
|
29
|
+
* above the ~65-130ms a phone camera needs to lock a code, and below the
|
|
30
|
+
* 500ms identical-event throttle scanner libraries commonly apply (which
|
|
31
|
+
* only ever compares against the immediately previous event, so distinct
|
|
32
|
+
* cycling frames are never throttled). */
|
|
33
|
+
export declare const QR_FRAME_INTERVAL_MS = 250;
|
|
34
|
+
/** How long a partially-collected transfer survives without a new frame
|
|
35
|
+
* before the accumulator drops it, so a walked-away-from transfer cannot
|
|
36
|
+
* poison the next one. Exported, not just defaulted, because a consumer
|
|
37
|
+
* typically needs the same window a second time for its own UI timer (the
|
|
38
|
+
* accumulator only re-checks staleness on the next `accept()` call, so
|
|
39
|
+
* nothing clears a progress indicator that has simply stopped moving) —
|
|
40
|
+
* and a consumer that hardcodes its own copy silently keeps the old window
|
|
41
|
+
* the day this one is retuned. */
|
|
42
|
+
export declare const QR_FRAME_STALE_MS = 8000;
|
|
43
|
+
/** A frame's kind tag is ADVISORY and opaque to this module: nothing here
|
|
44
|
+
* parses the body or checks that it matches the tag. It exists so a scanner
|
|
45
|
+
* that accepts framed transfers of one kind can drop another kind's
|
|
46
|
+
* transfer at its FIRST frame, instead of collecting every frame and only
|
|
47
|
+
* discovering the mismatch after reassembly. A scanner that accepts
|
|
48
|
+
* everything, or that refuses frames outright, can ignore it entirely. */
|
|
49
|
+
export declare const QR_FRAME_KIND_UNSPECIFIED = "-";
|
|
50
|
+
export declare const QR_FRAME_KIND_ACTION_PROPOSAL = "p";
|
|
51
|
+
export declare const QR_FRAME_KIND_READ_ONLY_PAIRING = "r";
|
|
52
|
+
export declare class QrPayloadTooLargeError extends Error {
|
|
53
|
+
readonly requiredFrames: number;
|
|
54
|
+
readonly maxFrames: number;
|
|
55
|
+
constructor(requiredFrames: number, maxFrames: number);
|
|
56
|
+
}
|
|
57
|
+
export type QrFrame = {
|
|
58
|
+
kind: string;
|
|
59
|
+
transferId: string;
|
|
60
|
+
index: number;
|
|
61
|
+
total: number;
|
|
62
|
+
body: string;
|
|
63
|
+
};
|
|
64
|
+
export type QrFrameProgress = {
|
|
65
|
+
kind: string;
|
|
66
|
+
transferId: string;
|
|
67
|
+
received: number;
|
|
68
|
+
total: number;
|
|
69
|
+
};
|
|
70
|
+
export type QrFrameAcceptResult =
|
|
71
|
+
/** Not a frame of this codec, or a frame whose kind `acceptKind` refused —
|
|
72
|
+
* state untouched, caller should classify it (or drop it) as it would any
|
|
73
|
+
* other unrecognized scan. */
|
|
74
|
+
{
|
|
75
|
+
status: 'ignored';
|
|
76
|
+
}
|
|
77
|
+
/** Prefix matched but the frame was malformed — state untouched, caller
|
|
78
|
+
* should drop it silently and stay armed. */
|
|
79
|
+
| {
|
|
80
|
+
status: 'discarded';
|
|
81
|
+
}
|
|
82
|
+
/** Accepted (new frame, or a duplicate of one already held). */
|
|
83
|
+
| {
|
|
84
|
+
status: 'progress';
|
|
85
|
+
progress: QrFrameProgress;
|
|
86
|
+
}
|
|
87
|
+
/** A different transfer (new transferId/kind/total, or the prior collection
|
|
88
|
+
* went stale) interrupted an in-progress one — prior buffer dropped,
|
|
89
|
+
* collection restarted from this frame. */
|
|
90
|
+
| {
|
|
91
|
+
status: 'restarted';
|
|
92
|
+
progress: QrFrameProgress;
|
|
93
|
+
}
|
|
94
|
+
/** All frames in and the payload hashes back to the transfer id. Emitted
|
|
95
|
+
* exactly once: internal state resets before returning. */
|
|
96
|
+
| {
|
|
97
|
+
status: 'complete';
|
|
98
|
+
payload: string;
|
|
99
|
+
}
|
|
100
|
+
/** All frames in but the hash check failed — state reset, start over. */
|
|
101
|
+
| {
|
|
102
|
+
status: 'corrupt';
|
|
103
|
+
};
|
|
104
|
+
export type QrFrameAccumulator = {
|
|
105
|
+
accept(data: string): QrFrameAcceptResult;
|
|
106
|
+
progress(): QrFrameProgress | null;
|
|
107
|
+
reset(): void;
|
|
108
|
+
};
|
|
109
|
+
/** Split an already-encoded string payload into scannable QR frames. Returns
|
|
110
|
+
* `[payload]` UNCHANGED when it fits `QR_SINGLE_FRAME_MAX_BYTES`, so a short
|
|
111
|
+
* payload never gains a prefix and `opts.kind` is simply unused. Throws
|
|
112
|
+
* `QrPayloadTooLargeError` above `QR_MAX_FRAMES`.
|
|
113
|
+
*
|
|
114
|
+
* `opts.kind` is the advisory tag described on `QR_FRAME_KIND_UNSPECIFIED`;
|
|
115
|
+
* it must be a single `[A-Za-z-]` character, because the header is
|
|
116
|
+
* fixed-width. Anything else throws rather than emitting frames that would
|
|
117
|
+
* not re-parse. */
|
|
118
|
+
export declare function encodeQrFrames(payload: string, opts?: {
|
|
119
|
+
kind?: string;
|
|
120
|
+
}): string[];
|
|
121
|
+
/** Cheap prefix test — no parse, no throw. A string that passes this but
|
|
122
|
+
* fails `parseQrFrame` is OUR garbage, not an unknown code, so the caller
|
|
123
|
+
* must drop it silently rather than fall through to generic classification. */
|
|
124
|
+
export declare function isQrFrame(data: string): boolean;
|
|
125
|
+
/** Parse one frame. `null` on any malformed header, bad kind, bad hex,
|
|
126
|
+
* non-numeric index/total, `index >= total`, `total === 0`, or empty body.
|
|
127
|
+
* The body is returned verbatim — it is recovered by fixed offset, never
|
|
128
|
+
* `split('|')`, so it may itself contain `|`. */
|
|
129
|
+
export declare function parseQrFrame(data: string): QrFrame | null;
|
|
130
|
+
/** Stateful reassembly buffer, one per scanner instance (never a module
|
|
131
|
+
* singleton — several screens may each hold their own scanner). Duplicate
|
|
132
|
+
* frames are the common case (a ~30fps camera reads the same displayed
|
|
133
|
+
* frame several times before it cycles), so duplicate detection is an O(1)
|
|
134
|
+
* `buf[i] !== undefined` check, not an allocation.
|
|
135
|
+
*
|
|
136
|
+
* `acceptKind`, when given, is consulted on every frame BEFORE any state is
|
|
137
|
+
* touched: a refused kind returns `{status:'ignored'}` and buffers nothing,
|
|
138
|
+
* which is what lets a single-purpose scanner sit in front of a producer
|
|
139
|
+
* cycling some other kind without ever filling its buffer. Defaults to
|
|
140
|
+
* accepting every kind. */
|
|
141
|
+
export declare function createQrFrameAccumulator(opts?: {
|
|
142
|
+
staleMs?: number;
|
|
143
|
+
now?: () => number;
|
|
144
|
+
acceptKind?: (kind: string) => boolean;
|
|
145
|
+
}): QrFrameAccumulator;
|
|
146
|
+
//# sourceMappingURL=qrFrames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrFrames.d.ts","sourceRoot":"","sources":["../../src/protocol/qrFrames.ts"],"names":[],"mappings":"AAGA;;;;;;;;;6EAS6E;AAE7E,eAAO,MAAM,cAAc,UAAU,CAAA;AACrC;;4EAE4E;AAC5E,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC;;sEAEsE;AACtE,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,uBAAuB,QAA8C,CAAA;AAClF;;;0BAG0B;AAC1B,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAC5C,8CAA8C;AAC9C,eAAO,MAAM,aAAa,KAAK,CAAA;AAC/B;;;;2CAI2C;AAC3C,eAAO,MAAM,oBAAoB,MAAM,CAAA;AAEvC;;;;;;;mCAOmC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAA;AAErC;;;;;2EAK2E;AAC3E,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAC5C,eAAO,MAAM,6BAA6B,MAAM,CAAA;AAChD,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAKlD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBACd,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAMtD;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AACtG,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnG,MAAM,MAAM,mBAAmB;AAC7B;;+BAE+B;AAC7B;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE;AACvB;8CAC8C;GAC5C;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE;AACzB,gEAAgE;GAC9D;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE;AACnD;;4CAE4C;GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE;AACpD;4DAC4D;GAC1D;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACzC,yEAAyE;GACvE;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAEzB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAA;IACzC,QAAQ,IAAI,eAAe,GAAG,IAAI,CAAA;IAClC,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAmGD;;;;;;;;oBAQoB;AACpB,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAqBlF;AAED;;gFAEgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;;kDAGkD;AAClD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAgBzD;AAWD;;;;;;;;;;4BAU4B;AAC5B,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACvC,GAAG,kBAAkB,CA6ErB"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
2
|
+
import { toHex } from '../internal/bytes.js';
|
|
3
|
+
/** Generic multi-frame QR transport: splits an oversized string payload into
|
|
4
|
+
* scannable QR frames and reassembles them on the other end. Deliberately
|
|
5
|
+
* payload-agnostic (plain string in, plain string out) — it knows nothing
|
|
6
|
+
* about action proposals or pairing payloads specifically, which is what
|
|
7
|
+
* lets a reassembled payload flow back through whatever generic classifier
|
|
8
|
+
* the caller already uses (`classifyScannedCode`) instead of a
|
|
9
|
+
* codec-specific one.
|
|
10
|
+
*
|
|
11
|
+
* This package never renders a QR image itself, here as everywhere else: it
|
|
12
|
+
* returns the strings to encode and consumes the strings a scanner read. */
|
|
13
|
+
export const QR_FRAME_CODEC = 'OBQR2';
|
|
14
|
+
/** `OBQR2|<kind>|<8 hex>|<2-digit index>|<2-digit total>|` — constant width,
|
|
15
|
+
* so the body can always be recovered with a fixed `slice`, never a
|
|
16
|
+
* `split('|')` (the body is itself often JSON and freely contains `|`). */
|
|
17
|
+
export const QR_FRAME_HEADER_LENGTH = 23;
|
|
18
|
+
/** v11 @ ECL M (a typical QR library default) holds 251 bytes; 11 bytes of
|
|
19
|
+
* slack against a different segmentation choice or a future header field.
|
|
20
|
+
* 61 modules at a ~220pt display box stays comfortably scannable. */
|
|
21
|
+
export const QR_FRAME_MAX_BYTES = 240;
|
|
22
|
+
export const QR_FRAME_BODY_MAX_BYTES = QR_FRAME_MAX_BYTES - QR_FRAME_HEADER_LENGTH;
|
|
23
|
+
/** At or below this, `encodeQrFrames` returns the payload UNFRAMED — no
|
|
24
|
+
* prefix, byte-identical to what a caller would have rendered directly.
|
|
25
|
+
* Keeps every single-frame payload on the exact same path it uses without
|
|
26
|
+
* this module at all. */
|
|
27
|
+
export const QR_SINGLE_FRAME_MAX_BYTES = 300;
|
|
28
|
+
/** ~21.4 KB ceiling (99 * 217 body bytes). */
|
|
29
|
+
export const QR_MAX_FRAMES = 99;
|
|
30
|
+
/** Recommended display cadence for a producer cycling frames: ~4 fps, well
|
|
31
|
+
* above the ~65-130ms a phone camera needs to lock a code, and below the
|
|
32
|
+
* 500ms identical-event throttle scanner libraries commonly apply (which
|
|
33
|
+
* only ever compares against the immediately previous event, so distinct
|
|
34
|
+
* cycling frames are never throttled). */
|
|
35
|
+
export const QR_FRAME_INTERVAL_MS = 250;
|
|
36
|
+
/** How long a partially-collected transfer survives without a new frame
|
|
37
|
+
* before the accumulator drops it, so a walked-away-from transfer cannot
|
|
38
|
+
* poison the next one. Exported, not just defaulted, because a consumer
|
|
39
|
+
* typically needs the same window a second time for its own UI timer (the
|
|
40
|
+
* accumulator only re-checks staleness on the next `accept()` call, so
|
|
41
|
+
* nothing clears a progress indicator that has simply stopped moving) —
|
|
42
|
+
* and a consumer that hardcodes its own copy silently keeps the old window
|
|
43
|
+
* the day this one is retuned. */
|
|
44
|
+
export const QR_FRAME_STALE_MS = 8000;
|
|
45
|
+
/** A frame's kind tag is ADVISORY and opaque to this module: nothing here
|
|
46
|
+
* parses the body or checks that it matches the tag. It exists so a scanner
|
|
47
|
+
* that accepts framed transfers of one kind can drop another kind's
|
|
48
|
+
* transfer at its FIRST frame, instead of collecting every frame and only
|
|
49
|
+
* discovering the mismatch after reassembly. A scanner that accepts
|
|
50
|
+
* everything, or that refuses frames outright, can ignore it entirely. */
|
|
51
|
+
export const QR_FRAME_KIND_UNSPECIFIED = '-';
|
|
52
|
+
export const QR_FRAME_KIND_ACTION_PROPOSAL = 'p';
|
|
53
|
+
export const QR_FRAME_KIND_READ_ONLY_PAIRING = 'r';
|
|
54
|
+
/** One character, so the header stays fixed-width. */
|
|
55
|
+
const KIND_RE = /^[A-Za-z-]$/;
|
|
56
|
+
export class QrPayloadTooLargeError extends Error {
|
|
57
|
+
requiredFrames;
|
|
58
|
+
maxFrames;
|
|
59
|
+
constructor(requiredFrames, maxFrames) {
|
|
60
|
+
super(`Payload requires ${requiredFrames} QR frames, exceeding the ${maxFrames}-frame limit`);
|
|
61
|
+
this.name = 'QrPayloadTooLargeError';
|
|
62
|
+
this.requiredFrames = requiredFrames;
|
|
63
|
+
this.maxFrames = maxFrames;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const FRAME_PREFIX_RE = /^OBQR2\|([A-Za-z-])\|([0-9a-f]{8})\|(\d{2})\|(\d{2})\|/;
|
|
67
|
+
/** First 4 bytes of keccak256(payload) — deterministic (no RNG to stub in
|
|
68
|
+
* tests), and doubles as a free integrity check on reassembly. */
|
|
69
|
+
function transferIdFor(payload) {
|
|
70
|
+
return toHex(keccak_256(new TextEncoder().encode(payload)).slice(0, 4));
|
|
71
|
+
}
|
|
72
|
+
/** UTF-8 byte length of one code point. A lone surrogate (never produced by
|
|
73
|
+
* well-formed `JSON.stringify` output, but handled defensively) is mapped to
|
|
74
|
+
* 3 bytes — the correct WTF-8 length, not just a safety margin. */
|
|
75
|
+
function utf8ByteLengthOfCodePoint(ch) {
|
|
76
|
+
const cp = ch.codePointAt(0) ?? 0;
|
|
77
|
+
if (cp <= 0x7f)
|
|
78
|
+
return 1;
|
|
79
|
+
if (cp <= 0x7ff)
|
|
80
|
+
return 2;
|
|
81
|
+
if (cp <= 0xffff)
|
|
82
|
+
return 3;
|
|
83
|
+
return 4;
|
|
84
|
+
}
|
|
85
|
+
function utf8ByteLength(payload) {
|
|
86
|
+
let n = 0;
|
|
87
|
+
for (const ch of payload)
|
|
88
|
+
n += utf8ByteLengthOfCodePoint(ch);
|
|
89
|
+
return n;
|
|
90
|
+
}
|
|
91
|
+
/** Split by a UTF-8 BYTE budget, iterating with `for...of` — which yields
|
|
92
|
+
* whole code points, so a cut can never land inside a surrogate pair. Byte
|
|
93
|
+
* (not character) budgeting matters too: QR byte-mode capacity is bytes, so
|
|
94
|
+
* a character budget would pass every ASCII test and silently overflow on a
|
|
95
|
+
* French- or CJK-language payload. Only used to find the MINIMUM frame
|
|
96
|
+
* count (a tight greedy pack); the actual split for that count is
|
|
97
|
+
* `splitIntoFrameCount` below, which balances sizes instead of dumping
|
|
98
|
+
* everything short into a near-empty last frame. */
|
|
99
|
+
function splitByUtf8Budget(payload, budgetBytes) {
|
|
100
|
+
const out = [];
|
|
101
|
+
let cur = '';
|
|
102
|
+
let curBytes = 0;
|
|
103
|
+
for (const ch of payload) {
|
|
104
|
+
const n = utf8ByteLengthOfCodePoint(ch);
|
|
105
|
+
if (curBytes + n > budgetBytes) {
|
|
106
|
+
out.push(cur);
|
|
107
|
+
cur = '';
|
|
108
|
+
curBytes = 0;
|
|
109
|
+
}
|
|
110
|
+
cur += ch;
|
|
111
|
+
curBytes += n;
|
|
112
|
+
}
|
|
113
|
+
if (cur)
|
|
114
|
+
out.push(cur);
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/** Split into exactly `frameCount` frames, each carrying as near an equal
|
|
118
|
+
* byte share as code-point boundaries allow. Keeps every frame at the same
|
|
119
|
+
* QR version/density: a code that visibly gets sparser on its last frame
|
|
120
|
+
* sends a scanner's autofocus hunting.
|
|
121
|
+
*
|
|
122
|
+
* The target is recomputed from the bytes and frames still OUTSTANDING after
|
|
123
|
+
* each flush, rather than precomputed once per index. That distinction is
|
|
124
|
+
* load-bearing, not a refactor. A frame can only end on a code-point
|
|
125
|
+
* boundary, so it undershoots its target by up to one code point's width;
|
|
126
|
+
* with a fixed target array that shortfall is never reclaimed and every
|
|
127
|
+
* frame repeats it, so the accumulated slack eventually spills past the last
|
|
128
|
+
* planned frame and opens another one. On multi-byte payloads that was the
|
|
129
|
+
* normal outcome, not an edge case: `'日'.repeat(121)` (363 bytes, 2 frames'
|
|
130
|
+
* worth) came out as three frames of 180/180/3 bytes, i.e. exactly the
|
|
131
|
+
* near-empty trailing frame this function exists to avoid, and a 20,996-byte
|
|
132
|
+
* emoji payload was rejected as needing 100 frames when 98 sufficed.
|
|
133
|
+
* Recomputing lets each frame absorb the previous one's shortfall, so the
|
|
134
|
+
* split lands in `frameCount` frames and stays balanced. */
|
|
135
|
+
function splitIntoFrameCount(payload, frameCount) {
|
|
136
|
+
let remainingBytes = utf8ByteLength(payload);
|
|
137
|
+
let remainingFrames = frameCount;
|
|
138
|
+
const targetFor = () => (remainingFrames > 0
|
|
139
|
+
? Math.min(Math.ceil(remainingBytes / remainingFrames), QR_FRAME_BODY_MAX_BYTES)
|
|
140
|
+
: QR_FRAME_BODY_MAX_BYTES);
|
|
141
|
+
const out = [];
|
|
142
|
+
let cur = '';
|
|
143
|
+
let curBytes = 0;
|
|
144
|
+
let target = targetFor();
|
|
145
|
+
for (const ch of payload) {
|
|
146
|
+
const n = utf8ByteLengthOfCodePoint(ch);
|
|
147
|
+
if (curBytes + n > target) {
|
|
148
|
+
out.push(cur);
|
|
149
|
+
remainingBytes -= curBytes;
|
|
150
|
+
remainingFrames -= 1;
|
|
151
|
+
target = targetFor();
|
|
152
|
+
cur = '';
|
|
153
|
+
curBytes = 0;
|
|
154
|
+
}
|
|
155
|
+
cur += ch;
|
|
156
|
+
curBytes += n;
|
|
157
|
+
}
|
|
158
|
+
if (cur)
|
|
159
|
+
out.push(cur);
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
/** Split an already-encoded string payload into scannable QR frames. Returns
|
|
163
|
+
* `[payload]` UNCHANGED when it fits `QR_SINGLE_FRAME_MAX_BYTES`, so a short
|
|
164
|
+
* payload never gains a prefix and `opts.kind` is simply unused. Throws
|
|
165
|
+
* `QrPayloadTooLargeError` above `QR_MAX_FRAMES`.
|
|
166
|
+
*
|
|
167
|
+
* `opts.kind` is the advisory tag described on `QR_FRAME_KIND_UNSPECIFIED`;
|
|
168
|
+
* it must be a single `[A-Za-z-]` character, because the header is
|
|
169
|
+
* fixed-width. Anything else throws rather than emitting frames that would
|
|
170
|
+
* not re-parse. */
|
|
171
|
+
export function encodeQrFrames(payload, opts) {
|
|
172
|
+
const kind = opts?.kind ?? QR_FRAME_KIND_UNSPECIFIED;
|
|
173
|
+
if (!KIND_RE.test(kind)) {
|
|
174
|
+
throw new Error(`invalid QR frame kind ${JSON.stringify(kind)}: expected a single [A-Za-z-] character`);
|
|
175
|
+
}
|
|
176
|
+
if (utf8ByteLength(payload) <= QR_SINGLE_FRAME_MAX_BYTES)
|
|
177
|
+
return [payload];
|
|
178
|
+
const minFrames = splitByUtf8Budget(payload, QR_FRAME_BODY_MAX_BYTES).length;
|
|
179
|
+
if (minFrames > QR_MAX_FRAMES)
|
|
180
|
+
throw new QrPayloadTooLargeError(minFrames, QR_MAX_FRAMES);
|
|
181
|
+
const bodies = splitIntoFrameCount(payload, minFrames);
|
|
182
|
+
// The balancing split can rarely run one or two frames longer than
|
|
183
|
+
// `minFrames` (see splitIntoFrameCount) — re-check the ceiling against the
|
|
184
|
+
// actual result rather than trusting the estimate.
|
|
185
|
+
if (bodies.length > QR_MAX_FRAMES)
|
|
186
|
+
throw new QrPayloadTooLargeError(bodies.length, QR_MAX_FRAMES);
|
|
187
|
+
const transferId = transferIdFor(payload);
|
|
188
|
+
const total = bodies.length;
|
|
189
|
+
return bodies.map((body, index) => (`${QR_FRAME_CODEC}|${kind}|${transferId}|${String(index).padStart(2, '0')}|${String(total).padStart(2, '0')}|${body}`));
|
|
190
|
+
}
|
|
191
|
+
/** Cheap prefix test — no parse, no throw. A string that passes this but
|
|
192
|
+
* fails `parseQrFrame` is OUR garbage, not an unknown code, so the caller
|
|
193
|
+
* must drop it silently rather than fall through to generic classification. */
|
|
194
|
+
export function isQrFrame(data) {
|
|
195
|
+
return data.startsWith(`${QR_FRAME_CODEC}|`);
|
|
196
|
+
}
|
|
197
|
+
/** Parse one frame. `null` on any malformed header, bad kind, bad hex,
|
|
198
|
+
* non-numeric index/total, `index >= total`, `total === 0`, or empty body.
|
|
199
|
+
* The body is returned verbatim — it is recovered by fixed offset, never
|
|
200
|
+
* `split('|')`, so it may itself contain `|`. */
|
|
201
|
+
export function parseQrFrame(data) {
|
|
202
|
+
const m = FRAME_PREFIX_RE.exec(data);
|
|
203
|
+
if (!m)
|
|
204
|
+
return null;
|
|
205
|
+
const [, kind, transferId, indexStr, totalStr] = m;
|
|
206
|
+
const index = Number(indexStr);
|
|
207
|
+
const total = Number(totalStr);
|
|
208
|
+
if (total === 0 || index >= total)
|
|
209
|
+
return null;
|
|
210
|
+
const body = data.slice(QR_FRAME_HEADER_LENGTH);
|
|
211
|
+
if (!body)
|
|
212
|
+
return null;
|
|
213
|
+
// The encoder never emits a body over this, so one that exceeds it did not
|
|
214
|
+
// come from `encodeQrFrames`. Rejecting here rather than buffering it keeps
|
|
215
|
+
// the ceiling a property of the FORMAT instead of only of the encoder: an
|
|
216
|
+
// accumulator fed from something other than a camera (a deep link, a paste,
|
|
217
|
+
// an NFC read) would otherwise retain an unbounded body per frame slot.
|
|
218
|
+
if (utf8ByteLength(body) > QR_FRAME_BODY_MAX_BYTES)
|
|
219
|
+
return null;
|
|
220
|
+
return { kind, transferId, index, total, body };
|
|
221
|
+
}
|
|
222
|
+
/** Stateful reassembly buffer, one per scanner instance (never a module
|
|
223
|
+
* singleton — several screens may each hold their own scanner). Duplicate
|
|
224
|
+
* frames are the common case (a ~30fps camera reads the same displayed
|
|
225
|
+
* frame several times before it cycles), so duplicate detection is an O(1)
|
|
226
|
+
* `buf[i] !== undefined` check, not an allocation.
|
|
227
|
+
*
|
|
228
|
+
* `acceptKind`, when given, is consulted on every frame BEFORE any state is
|
|
229
|
+
* touched: a refused kind returns `{status:'ignored'}` and buffers nothing,
|
|
230
|
+
* which is what lets a single-purpose scanner sit in front of a producer
|
|
231
|
+
* cycling some other kind without ever filling its buffer. Defaults to
|
|
232
|
+
* accepting every kind. */
|
|
233
|
+
export function createQrFrameAccumulator(opts) {
|
|
234
|
+
const staleMs = opts?.staleMs ?? QR_FRAME_STALE_MS;
|
|
235
|
+
const now = opts?.now ?? Date.now;
|
|
236
|
+
const acceptKind = opts?.acceptKind;
|
|
237
|
+
let state = null;
|
|
238
|
+
return {
|
|
239
|
+
accept(data) {
|
|
240
|
+
if (!isQrFrame(data))
|
|
241
|
+
return { status: 'ignored' };
|
|
242
|
+
const frame = parseQrFrame(data);
|
|
243
|
+
if (!frame)
|
|
244
|
+
return { status: 'discarded' };
|
|
245
|
+
if (acceptKind && !acceptKind(frame.kind))
|
|
246
|
+
return { status: 'ignored' };
|
|
247
|
+
// Captured before the stale-drop below: a timed-out collection still
|
|
248
|
+
// counts as "there was a prior collection being interrupted" for the
|
|
249
|
+
// 'restarted' vs 'progress' distinction.
|
|
250
|
+
const hadPriorState = state !== null;
|
|
251
|
+
if (state && now() - state.lastAcceptedAt > staleMs)
|
|
252
|
+
state = null;
|
|
253
|
+
// `kind` participates in transfer identity even though `transferId` is
|
|
254
|
+
// a hash of the payload alone: the same payload framed under two kinds
|
|
255
|
+
// shares a transferId, and treating those as one transfer would
|
|
256
|
+
// interleave two producers' frames into a single buffer.
|
|
257
|
+
const isSameTransfer = state !== null
|
|
258
|
+
&& state.transferId === frame.transferId
|
|
259
|
+
&& state.kind === frame.kind
|
|
260
|
+
&& state.total === frame.total;
|
|
261
|
+
let s;
|
|
262
|
+
if (isSameTransfer && state) {
|
|
263
|
+
s = state;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
s = {
|
|
267
|
+
kind: frame.kind,
|
|
268
|
+
transferId: frame.transferId,
|
|
269
|
+
total: frame.total,
|
|
270
|
+
buf: new Array(frame.total).fill(undefined),
|
|
271
|
+
received: 0,
|
|
272
|
+
lastAcceptedAt: now(),
|
|
273
|
+
};
|
|
274
|
+
state = s;
|
|
275
|
+
}
|
|
276
|
+
if (s.buf[frame.index] === undefined) {
|
|
277
|
+
s.buf[frame.index] = frame.body;
|
|
278
|
+
s.received += 1;
|
|
279
|
+
}
|
|
280
|
+
s.lastAcceptedAt = now();
|
|
281
|
+
if (s.received < s.total) {
|
|
282
|
+
const progress = {
|
|
283
|
+
kind: s.kind,
|
|
284
|
+
transferId: s.transferId,
|
|
285
|
+
received: s.received,
|
|
286
|
+
total: s.total,
|
|
287
|
+
};
|
|
288
|
+
return { status: hadPriorState && !isSameTransfer ? 'restarted' : 'progress', progress };
|
|
289
|
+
}
|
|
290
|
+
// Complete — emitted exactly once: state resets before returning,
|
|
291
|
+
// whether the integrity check passes or not.
|
|
292
|
+
const payload = s.buf.join('');
|
|
293
|
+
const intact = transferIdFor(payload) === s.transferId;
|
|
294
|
+
state = null;
|
|
295
|
+
return intact ? { status: 'complete', payload } : { status: 'corrupt' };
|
|
296
|
+
},
|
|
297
|
+
progress() {
|
|
298
|
+
return state
|
|
299
|
+
? { kind: state.kind, transferId: state.transferId, received: state.received, total: state.total }
|
|
300
|
+
: null;
|
|
301
|
+
},
|
|
302
|
+
reset() {
|
|
303
|
+
state = null;
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=qrFrames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrFrames.js","sourceRoot":"","sources":["../../src/protocol/qrFrames.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drakkar.software/octobot-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "TypeScript client for the OctoBot node protocol: wallet auth, accounts, automations, strategies, and user actions over the Starfish sync transport.",
|
|
5
|
-
"license": "
|
|
5
|
+
"license": "LGPL-3.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/Drakkar-Software/OctoBot.git",
|