@labacacia/nps-sdk 1.0.0-alpha.5 → 1.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.cn.md +29 -5
- package/CHANGELOG.md +29 -5
- package/LICENSE +0 -0
- package/NOTICE +0 -0
- package/README.cn.md +8 -13
- package/README.md +8 -13
- package/dist/nip/index.d.ts +1 -0
- package/dist/nip/index.d.ts.map +1 -1
- package/dist/nip/index.js +2 -0
- package/dist/nip/index.js.map +1 -1
- package/dist/nip/reputation-client.d.ts +116 -0
- package/dist/nip/reputation-client.d.ts.map +1 -0
- package/dist/nip/reputation-client.js +261 -0
- package/dist/nip/reputation-client.js.map +1 -0
- package/dist/nip/x509/oids.d.ts +9 -10
- package/dist/nip/x509/oids.d.ts.map +1 -1
- package/dist/nip/x509/oids.js +3 -4
- package/dist/nip/x509/oids.js.map +1 -1
- package/dist/nwp/anchor-client.d.ts +109 -0
- package/dist/nwp/anchor-client.d.ts.map +1 -0
- package/dist/nwp/anchor-client.js +279 -0
- package/dist/nwp/anchor-client.js.map +1 -0
- package/dist/nwp/index.d.ts +1 -1
- package/dist/nwp/index.d.ts.map +1 -1
- package/dist/nwp/index.js +1 -1
- package/dist/nwp/index.js.map +1 -1
- package/doc/nps-sdk.core.cn.md +0 -0
- package/doc/nps-sdk.core.md +0 -0
- package/doc/nps-sdk.ncp.cn.md +0 -0
- package/doc/nps-sdk.ncp.md +0 -0
- package/doc/nps-sdk.ndp.cn.md +0 -0
- package/doc/nps-sdk.ndp.md +0 -0
- package/doc/nps-sdk.nop.cn.md +0 -0
- package/doc/nps-sdk.nop.md +0 -0
- package/doc/overview.cn.md +0 -0
- package/doc/overview.md +0 -0
- package/package.json +12 -1
- package/CONTRIBUTING.cn.md +0 -35
- package/CONTRIBUTING.md +0 -35
- package/dist/nwp/error-codes.d.ts +0 -42
- package/dist/nwp/error-codes.d.ts.map +0 -1
- package/dist/nwp/error-codes.js +0 -53
- package/dist/nwp/error-codes.js.map +0 -1
- package/nip-ca-server/Dockerfile +0 -27
- package/nip-ca-server/README.md +0 -45
- package/nip-ca-server/db/001_init.sql +0 -25
- package/nip-ca-server/docker-compose.yml +0 -29
- package/nip-ca-server/package.json +0 -23
- package/nip-ca-server/src/ca.ts +0 -155
- package/nip-ca-server/src/db.ts +0 -104
- package/nip-ca-server/src/index.ts +0 -157
- package/nip-ca-server/tsconfig.json +0 -13
- package/src/core/anchor-cache.ts +0 -129
- package/src/core/cache.ts +0 -93
- package/src/core/canonical-json.ts +0 -50
- package/src/core/codec.ts +0 -158
- package/src/core/codecs/index.ts +0 -5
- package/src/core/codecs/ncp-codec.ts +0 -170
- package/src/core/codecs/tier1-json-codec.ts +0 -33
- package/src/core/codecs/tier2-msgpack-codec.ts +0 -30
- package/src/core/crypto-provider.ts +0 -47
- package/src/core/exceptions.ts +0 -57
- package/src/core/frame-header.ts +0 -282
- package/src/core/frame-registry.ts +0 -91
- package/src/core/frames.ts +0 -184
- package/src/core/index.ts +0 -42
- package/src/core/registry.ts +0 -28
- package/src/core/status-codes.ts +0 -47
- package/src/index.ts +0 -10
- package/src/ncp/frames/anchor-frame.ts +0 -87
- package/src/ncp/frames/caps-frame.ts +0 -59
- package/src/ncp/frames/diff-frame.ts +0 -69
- package/src/ncp/frames/error-frame.ts +0 -26
- package/src/ncp/frames/hello-frame.ts +0 -50
- package/src/ncp/frames/stream-frame.ts +0 -35
- package/src/ncp/frames.ts +0 -251
- package/src/ncp/handshake.ts +0 -95
- package/src/ncp/index.ts +0 -13
- package/src/ncp/ncp-error-codes.ts +0 -36
- package/src/ncp/ncp-patch-format.ts +0 -16
- package/src/ncp/preamble.ts +0 -79
- package/src/ncp/registry.ts +0 -15
- package/src/ncp/stream-manager.ts +0 -212
- package/src/ndp/dns-txt.ts +0 -86
- package/src/ndp/frames.ts +0 -124
- package/src/ndp/index.ts +0 -8
- package/src/ndp/ndp-registry.ts +0 -116
- package/src/ndp/registry.ts +0 -12
- package/src/ndp/validator.ts +0 -64
- package/src/nip/acme/client.ts +0 -185
- package/src/nip/acme/index.ts +0 -8
- package/src/nip/acme/jws.ts +0 -109
- package/src/nip/acme/messages.ts +0 -85
- package/src/nip/acme/server.ts +0 -480
- package/src/nip/acme/wire.ts +0 -24
- package/src/nip/assurance-level.ts +0 -40
- package/src/nip/cert-format.ts +0 -9
- package/src/nip/error-codes.ts +0 -38
- package/src/nip/frames.ts +0 -138
- package/src/nip/identity.ts +0 -113
- package/src/nip/index.ts +0 -14
- package/src/nip/registry.ts +0 -12
- package/src/nip/verifier.ts +0 -122
- package/src/nip/x509/builder.ts +0 -91
- package/src/nip/x509/index.ts +0 -6
- package/src/nip/x509/oids.ts +0 -28
- package/src/nip/x509/verifier.ts +0 -214
- package/src/nop/client.ts +0 -103
- package/src/nop/frames.ts +0 -181
- package/src/nop/index.ts +0 -7
- package/src/nop/models.ts +0 -79
- package/src/nop/nop-types.ts +0 -208
- package/src/nop/registry.ts +0 -13
- package/src/nwp/client.ts +0 -114
- package/src/nwp/error-codes.ts +0 -62
- package/src/nwp/frames.ts +0 -116
- package/src/nwp/index.ts +0 -7
- package/src/nwp/registry.ts +0 -11
- package/src/setup.ts +0 -32
- package/tests/_rfc0002-keys.ts +0 -57
- package/tests/core/anchor-cache.test.ts +0 -242
- package/tests/core/codec.test.ts +0 -205
- package/tests/core/frame-registry.test.ts +0 -46
- package/tests/core.test.ts +0 -327
- package/tests/ncp/diff-binary-bitset.test.ts +0 -107
- package/tests/ncp/e2e-enc-reject.test.ts +0 -93
- package/tests/ncp/err-error-frame.test.ts +0 -152
- package/tests/ncp/frames.test.ts +0 -359
- package/tests/ncp/framing.test.ts +0 -233
- package/tests/ncp/hello-frame.test.ts +0 -122
- package/tests/ncp/inline-anchor.test.ts +0 -88
- package/tests/ncp/preamble.test.ts +0 -93
- package/tests/ncp/security.test.ts +0 -184
- package/tests/ncp/stream-window.test.ts +0 -167
- package/tests/ncp/stream.test.ts +0 -242
- package/tests/ncp/version-negotiation.test.ts +0 -123
- package/tests/ndp.test.ts +0 -377
- package/tests/nip-acme-agent01.test.ts +0 -192
- package/tests/nip-x509.test.ts +0 -280
- package/tests/nip.test.ts +0 -184
- package/tests/nop.test.ts +0 -344
- package/tests/nwp.test.ts +0 -237
- package/tsconfig.json +0 -20
- package/tsup.config.ts +0 -20
- package/vitest.config.ts +0 -10
package/dist/nip/x509/oids.js
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* OID constants for NPS X.509 certificates per NPS-RFC-0002 §4.
|
|
5
5
|
*
|
|
6
|
-
* The 1.3.6.1.4.1.
|
|
7
|
-
* Number
|
|
8
|
-
* these constants when the official PEN is granted.
|
|
6
|
+
* The 1.3.6.1.4.1.65715 arc is the LabAcacia IANA-assigned Private Enterprise
|
|
7
|
+
* Number (PEN 65715, NPS-CR-0004, 2026-05-08).
|
|
9
8
|
*/
|
|
10
|
-
export const LAB_ACACIA_PEN_ARC = "1.3.6.1.4.1.
|
|
9
|
+
export const LAB_ACACIA_PEN_ARC = "1.3.6.1.4.1.65715";
|
|
11
10
|
export const EKU_ARC = `${LAB_ACACIA_PEN_ARC}.1`;
|
|
12
11
|
export const EXTENSION_ARC = `${LAB_ACACIA_PEN_ARC}.2`;
|
|
13
12
|
// ── EKUs (NPS-RFC-0002 §4.1) ─────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oids.js","sourceRoot":"","sources":["../../../src/nip/x509/oids.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC
|
|
1
|
+
{"version":3,"file":"oids.js","sourceRoot":"","sources":["../../../src/nip/x509/oids.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,OAAO,GAAc,GAAG,kBAAkB,IAAI,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAQ,GAAG,kBAAkB,IAAI,CAAC;AAE5D,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAU,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAW,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,OAAO,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,aAAa,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export interface MemberInfo {
|
|
2
|
+
nid: string;
|
|
3
|
+
node_roles: string[];
|
|
4
|
+
activation_mode: string;
|
|
5
|
+
child_anchor?: boolean;
|
|
6
|
+
member_count?: number;
|
|
7
|
+
tags?: string[];
|
|
8
|
+
joined_at?: string;
|
|
9
|
+
last_seen?: string;
|
|
10
|
+
capabilities?: unknown;
|
|
11
|
+
metrics?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface TopologySnapshot {
|
|
14
|
+
version: number;
|
|
15
|
+
anchor_nid: string;
|
|
16
|
+
cluster_size: number;
|
|
17
|
+
members: MemberInfo[];
|
|
18
|
+
truncated?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface TopologyFilter {
|
|
21
|
+
tags_any?: string[];
|
|
22
|
+
tags_all?: string[];
|
|
23
|
+
node_roles?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface MemberChanges {
|
|
26
|
+
node_roles?: string[];
|
|
27
|
+
activation_mode?: string;
|
|
28
|
+
tags?: string[];
|
|
29
|
+
member_count?: number;
|
|
30
|
+
last_seen?: string;
|
|
31
|
+
capabilities?: unknown;
|
|
32
|
+
metrics?: unknown;
|
|
33
|
+
}
|
|
34
|
+
/** Discriminated union for topology stream events (NPS-2 §12.2). */
|
|
35
|
+
export type TopologyEvent = {
|
|
36
|
+
kind: "member_joined";
|
|
37
|
+
version: number;
|
|
38
|
+
member: MemberInfo;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "member_left";
|
|
41
|
+
version: number;
|
|
42
|
+
nid: string;
|
|
43
|
+
} | {
|
|
44
|
+
kind: "member_updated";
|
|
45
|
+
version: number;
|
|
46
|
+
nid: string;
|
|
47
|
+
changes: MemberChanges;
|
|
48
|
+
} | {
|
|
49
|
+
kind: "anchor_state";
|
|
50
|
+
version: number;
|
|
51
|
+
field: string;
|
|
52
|
+
details?: unknown;
|
|
53
|
+
} | {
|
|
54
|
+
kind: "resync_required";
|
|
55
|
+
version: 0;
|
|
56
|
+
reason: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Surfaces an Anchor-side topology error to the caller. `nwpErrorCode` matches
|
|
60
|
+
* one of the NWP-TOPOLOGY-* codes; `npsStatus` is the NPS status code.
|
|
61
|
+
*/
|
|
62
|
+
export declare class AnchorTopologyError extends Error {
|
|
63
|
+
readonly nwpErrorCode: string;
|
|
64
|
+
readonly npsStatus: string;
|
|
65
|
+
constructor(nwpErrorCode: string, npsStatus: string, message?: string);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Typed client for an Anchor Node's reserved query endpoints.
|
|
69
|
+
*
|
|
70
|
+
* ```ts
|
|
71
|
+
* const client = new AnchorNodeClient("http://anchor.local:8080", "/anchor");
|
|
72
|
+
*
|
|
73
|
+
* const snap = await client.getSnapshot({ scope: "cluster" });
|
|
74
|
+
* for await (const ev of client.subscribe({ sinceVersion: snap.version })) {
|
|
75
|
+
* console.log(ev);
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare class AnchorNodeClient {
|
|
80
|
+
private readonly baseUrl;
|
|
81
|
+
private readonly pathPrefix;
|
|
82
|
+
constructor(baseUrl: string, pathPrefix?: string);
|
|
83
|
+
/**
|
|
84
|
+
* Fetch the current cluster topology (NPS-2 §12.1).
|
|
85
|
+
*
|
|
86
|
+
* POSTs a `topology.snapshot` query and returns the first `data` element of
|
|
87
|
+
* the response CapsFrame.
|
|
88
|
+
*/
|
|
89
|
+
getSnapshot(options?: {
|
|
90
|
+
scope?: "cluster" | "member";
|
|
91
|
+
include?: string[];
|
|
92
|
+
depth?: number;
|
|
93
|
+
targetNid?: string;
|
|
94
|
+
}): Promise<TopologySnapshot>;
|
|
95
|
+
/**
|
|
96
|
+
* Subscribe to live topology changes (NPS-2 §12.2).
|
|
97
|
+
*
|
|
98
|
+
* The first NDJSON line (subscription ack) is automatically skipped. Each
|
|
99
|
+
* subsequent line is parsed into a `TopologyEvent`. The generator stops after
|
|
100
|
+
* a `resync_required` event — callers MUST issue a fresh `getSnapshot` before
|
|
101
|
+
* resubscribing.
|
|
102
|
+
*/
|
|
103
|
+
subscribe(options?: {
|
|
104
|
+
filter?: TopologyFilter;
|
|
105
|
+
sinceVersion?: number;
|
|
106
|
+
scope?: "cluster" | "member";
|
|
107
|
+
}): AsyncGenerator<TopologyEvent>;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=anchor-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-client.d.ts","sourceRoot":"","sources":["../../src/nwp/anchor-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// Copyright 2026 INNO LOTUS PTY LTD
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* AnchorNodeClient — typed HTTP client for an Anchor Node's reserved query
|
|
5
|
+
* types (NPS-2 §12 — `topology.snapshot` and `topology.stream`).
|
|
6
|
+
*
|
|
7
|
+
* Uses `fetch` only; no extra dependencies.
|
|
8
|
+
*/
|
|
9
|
+
// ── Wire constants ────────────────────────────────────────────────────────────
|
|
10
|
+
const SCOPE_CLUSTER = "cluster";
|
|
11
|
+
const SCOPE_MEMBER = "member";
|
|
12
|
+
const TYPE_SNAPSHOT = "topology.snapshot";
|
|
13
|
+
const TYPE_STREAM = "topology.stream";
|
|
14
|
+
const EVENT_MEMBER_JOINED = "member_joined";
|
|
15
|
+
const EVENT_MEMBER_LEFT = "member_left";
|
|
16
|
+
const EVENT_MEMBER_UPDATED = "member_updated";
|
|
17
|
+
const EVENT_ANCHOR_STATE = "anchor_state";
|
|
18
|
+
const EVENT_RESYNC_REQUIRED = "resync_required";
|
|
19
|
+
/**
|
|
20
|
+
* Surfaces an Anchor-side topology error to the caller. `nwpErrorCode` matches
|
|
21
|
+
* one of the NWP-TOPOLOGY-* codes; `npsStatus` is the NPS status code.
|
|
22
|
+
*/
|
|
23
|
+
export class AnchorTopologyError extends Error {
|
|
24
|
+
nwpErrorCode;
|
|
25
|
+
npsStatus;
|
|
26
|
+
constructor(nwpErrorCode, npsStatus, message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.nwpErrorCode = nwpErrorCode;
|
|
29
|
+
this.npsStatus = npsStatus;
|
|
30
|
+
this.name = "AnchorTopologyError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ── AnchorNodeClient ──────────────────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Typed client for an Anchor Node's reserved query endpoints.
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* const client = new AnchorNodeClient("http://anchor.local:8080", "/anchor");
|
|
39
|
+
*
|
|
40
|
+
* const snap = await client.getSnapshot({ scope: "cluster" });
|
|
41
|
+
* for await (const ev of client.subscribe({ sinceVersion: snap.version })) {
|
|
42
|
+
* console.log(ev);
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export class AnchorNodeClient {
|
|
47
|
+
baseUrl;
|
|
48
|
+
pathPrefix;
|
|
49
|
+
constructor(baseUrl, pathPrefix = "") {
|
|
50
|
+
// Normalise trailing slashes once.
|
|
51
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
52
|
+
this.pathPrefix = pathPrefix.replace(/\/$/, "");
|
|
53
|
+
}
|
|
54
|
+
// ── topology.snapshot ──────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Fetch the current cluster topology (NPS-2 §12.1).
|
|
57
|
+
*
|
|
58
|
+
* POSTs a `topology.snapshot` query and returns the first `data` element of
|
|
59
|
+
* the response CapsFrame.
|
|
60
|
+
*/
|
|
61
|
+
async getSnapshot(options) {
|
|
62
|
+
const scope = options?.scope ?? "cluster";
|
|
63
|
+
const include = options?.include ?? ["members"];
|
|
64
|
+
const depth = options?.depth;
|
|
65
|
+
const targetNid = options?.targetNid;
|
|
66
|
+
const topology = {
|
|
67
|
+
scope: scope === "cluster" ? SCOPE_CLUSTER : SCOPE_MEMBER,
|
|
68
|
+
include,
|
|
69
|
+
};
|
|
70
|
+
if (depth !== undefined)
|
|
71
|
+
topology["depth"] = depth;
|
|
72
|
+
if (targetNid !== undefined)
|
|
73
|
+
topology["target_nid"] = targetNid;
|
|
74
|
+
const body = { type: TYPE_SNAPSHOT, topology };
|
|
75
|
+
const url = `${this.baseUrl}${this.pathPrefix}/query`;
|
|
76
|
+
const res = await fetch(url, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: { "Content-Type": "application/json", "Accept": "application/json" },
|
|
79
|
+
body: JSON.stringify(body),
|
|
80
|
+
});
|
|
81
|
+
if (!res.ok) {
|
|
82
|
+
throw await buildFetchError("topology.snapshot", res);
|
|
83
|
+
}
|
|
84
|
+
const caps = await res.json();
|
|
85
|
+
const rows = caps.data;
|
|
86
|
+
if (!Array.isArray(rows) || rows.length !== 1) {
|
|
87
|
+
throw new Error(`topology.snapshot expected exactly 1 data row; got ${Array.isArray(rows) ? rows.length : "non-array"}.`);
|
|
88
|
+
}
|
|
89
|
+
return rows[0];
|
|
90
|
+
}
|
|
91
|
+
// ── topology.stream ────────────────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Subscribe to live topology changes (NPS-2 §12.2).
|
|
94
|
+
*
|
|
95
|
+
* The first NDJSON line (subscription ack) is automatically skipped. Each
|
|
96
|
+
* subsequent line is parsed into a `TopologyEvent`. The generator stops after
|
|
97
|
+
* a `resync_required` event — callers MUST issue a fresh `getSnapshot` before
|
|
98
|
+
* resubscribing.
|
|
99
|
+
*/
|
|
100
|
+
async *subscribe(options) {
|
|
101
|
+
const scope = options?.scope ?? "cluster";
|
|
102
|
+
const filter = options?.filter;
|
|
103
|
+
const sinceVersion = options?.sinceVersion;
|
|
104
|
+
const topology = {
|
|
105
|
+
scope: scope === "cluster" ? SCOPE_CLUSTER : SCOPE_MEMBER,
|
|
106
|
+
};
|
|
107
|
+
if (filter !== undefined)
|
|
108
|
+
topology["filter"] = filter;
|
|
109
|
+
if (sinceVersion !== undefined)
|
|
110
|
+
topology["since_version"] = sinceVersion;
|
|
111
|
+
const body = {
|
|
112
|
+
type: TYPE_STREAM,
|
|
113
|
+
action: "subscribe",
|
|
114
|
+
stream_id: crypto.randomUUID(),
|
|
115
|
+
topology,
|
|
116
|
+
};
|
|
117
|
+
const url = `${this.baseUrl}${this.pathPrefix}/subscribe`;
|
|
118
|
+
const res = await fetch(url, {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: {
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
"Accept": "application/x-ndjson",
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify(body),
|
|
125
|
+
});
|
|
126
|
+
if (!res.ok) {
|
|
127
|
+
throw await buildFetchError("topology.stream", res);
|
|
128
|
+
}
|
|
129
|
+
if (res.body === null)
|
|
130
|
+
return;
|
|
131
|
+
let ackSkipped = false;
|
|
132
|
+
for await (const line of readNdjsonLines(res.body)) {
|
|
133
|
+
// Skip the first non-empty line (subscription ack).
|
|
134
|
+
if (!ackSkipped) {
|
|
135
|
+
ackSkipped = true;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Mid-stream protocol error: { status, error } with no event_type.
|
|
139
|
+
const maybeErr = tryParseStreamError(line);
|
|
140
|
+
if (maybeErr !== null)
|
|
141
|
+
throw maybeErr;
|
|
142
|
+
const ev = parseTopologyEvent(line);
|
|
143
|
+
if (ev === null)
|
|
144
|
+
continue;
|
|
145
|
+
yield ev;
|
|
146
|
+
if (ev.kind === EVENT_RESYNC_REQUIRED)
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// ── NDJSON line reader ────────────────────────────────────────────────────────
|
|
152
|
+
/**
|
|
153
|
+
* Reads a `ReadableStream<Uint8Array>` and yields complete, non-empty lines.
|
|
154
|
+
* Lines are split on `\n`; trailing `\r` is stripped.
|
|
155
|
+
*/
|
|
156
|
+
async function* readNdjsonLines(body) {
|
|
157
|
+
const decoder = new TextDecoder();
|
|
158
|
+
let buffer = "";
|
|
159
|
+
const reader = body.getReader();
|
|
160
|
+
try {
|
|
161
|
+
while (true) {
|
|
162
|
+
const { done, value } = await reader.read();
|
|
163
|
+
if (done)
|
|
164
|
+
break;
|
|
165
|
+
buffer += decoder.decode(value, { stream: true });
|
|
166
|
+
let newlineIdx;
|
|
167
|
+
while ((newlineIdx = buffer.indexOf("\n")) !== -1) {
|
|
168
|
+
const raw = buffer.slice(0, newlineIdx);
|
|
169
|
+
buffer = buffer.slice(newlineIdx + 1);
|
|
170
|
+
const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
|
|
171
|
+
if (line.length > 0)
|
|
172
|
+
yield line;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Flush decoder.
|
|
176
|
+
buffer += decoder.decode();
|
|
177
|
+
const remaining = buffer.endsWith("\r") ? buffer.slice(0, -1) : buffer;
|
|
178
|
+
if (remaining.length > 0)
|
|
179
|
+
yield remaining;
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
reader.releaseLock();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// ── Parsing helpers ───────────────────────────────────────────────────────────
|
|
186
|
+
/** Returns an `AnchorTopologyError` if the line is an error frame, else null. */
|
|
187
|
+
function tryParseStreamError(line) {
|
|
188
|
+
try {
|
|
189
|
+
const obj = JSON.parse(line);
|
|
190
|
+
if (typeof obj !== "object" || obj === null)
|
|
191
|
+
return null;
|
|
192
|
+
if ("event_type" in obj)
|
|
193
|
+
return null; // It's a regular event line.
|
|
194
|
+
if (typeof obj["error"] !== "string")
|
|
195
|
+
return null;
|
|
196
|
+
if (typeof obj["status"] !== "string")
|
|
197
|
+
return null;
|
|
198
|
+
const msg = typeof obj["message"] === "string" ? obj["message"] : undefined;
|
|
199
|
+
return new AnchorTopologyError(obj["error"], obj["status"], msg);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** Parses one NDJSON event line into a `TopologyEvent`, or null if unrecognised. */
|
|
206
|
+
function parseTopologyEvent(line) {
|
|
207
|
+
let obj;
|
|
208
|
+
try {
|
|
209
|
+
obj = JSON.parse(line);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
if (typeof obj !== "object" || obj === null)
|
|
215
|
+
return null;
|
|
216
|
+
const eventType = obj["event_type"];
|
|
217
|
+
if (typeof eventType !== "string")
|
|
218
|
+
return null;
|
|
219
|
+
const version = typeof obj["seq"] === "number" ? obj["seq"] : 0;
|
|
220
|
+
const payload = (obj["payload"] ?? {});
|
|
221
|
+
switch (eventType) {
|
|
222
|
+
case EVENT_MEMBER_JOINED:
|
|
223
|
+
return {
|
|
224
|
+
kind: "member_joined",
|
|
225
|
+
version,
|
|
226
|
+
member: payload,
|
|
227
|
+
};
|
|
228
|
+
case EVENT_MEMBER_LEFT:
|
|
229
|
+
return {
|
|
230
|
+
kind: "member_left",
|
|
231
|
+
version,
|
|
232
|
+
nid: typeof payload["nid"] === "string" ? payload["nid"] : "",
|
|
233
|
+
};
|
|
234
|
+
case EVENT_MEMBER_UPDATED:
|
|
235
|
+
return {
|
|
236
|
+
kind: "member_updated",
|
|
237
|
+
version,
|
|
238
|
+
nid: typeof payload["nid"] === "string" ? payload["nid"] : "",
|
|
239
|
+
changes: (payload["changes"] ?? {}),
|
|
240
|
+
};
|
|
241
|
+
case EVENT_ANCHOR_STATE:
|
|
242
|
+
return {
|
|
243
|
+
kind: "anchor_state",
|
|
244
|
+
version,
|
|
245
|
+
field: typeof payload["field"] === "string" ? payload["field"] : "",
|
|
246
|
+
details: payload["details"],
|
|
247
|
+
};
|
|
248
|
+
case EVENT_RESYNC_REQUIRED:
|
|
249
|
+
return {
|
|
250
|
+
kind: "resync_required",
|
|
251
|
+
version: 0,
|
|
252
|
+
reason: typeof payload["reason"] === "string" ? payload["reason"] : "unknown",
|
|
253
|
+
};
|
|
254
|
+
default:
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/** Builds an `AnchorTopologyError` from a non-ok HTTP response. */
|
|
259
|
+
async function buildFetchError(operation, res) {
|
|
260
|
+
let body;
|
|
261
|
+
try {
|
|
262
|
+
body = await res.text();
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
body = "";
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
const obj = JSON.parse(body);
|
|
269
|
+
if (typeof obj === "object" && obj !== null &&
|
|
270
|
+
typeof obj["error"] === "string" &&
|
|
271
|
+
typeof obj["status"] === "string") {
|
|
272
|
+
const msg = typeof obj["message"] === "string" ? obj["message"] : body;
|
|
273
|
+
return new AnchorTopologyError(obj["error"], obj["status"], msg);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch { /* fall through */ }
|
|
277
|
+
return new AnchorTopologyError("UNKNOWN", `HTTP-${res.status}`, `${operation} returned ${res.status}: ${body}`);
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=anchor-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-client.js","sourceRoot":"","sources":["../../src/nwp/anchor-client.ts"],"names":[],"mappings":"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"}
|
package/dist/nwp/index.d.ts
CHANGED
package/dist/nwp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
package/dist/nwp/index.js
CHANGED
package/dist/nwp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
package/doc/nps-sdk.core.cn.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.core.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.ncp.cn.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.ncp.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.ndp.cn.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.ndp.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.nop.cn.md
CHANGED
|
File without changes
|
package/doc/nps-sdk.nop.md
CHANGED
|
File without changes
|
package/doc/overview.cn.md
CHANGED
|
File without changes
|
package/doc/overview.md
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@labacacia/nps-sdk",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.7",
|
|
4
4
|
"description": "TypeScript SDK for the Neural Protocol Suite (NPS) — NCP, NWP, NIP, NDP, NOP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,10 +37,21 @@
|
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "tsc",
|
|
40
|
+
"prepack": "npm run build && node scripts/verify-pack.mjs",
|
|
40
41
|
"test": "vitest run",
|
|
41
42
|
"test:watch": "vitest",
|
|
42
43
|
"typecheck": "tsc --noEmit"
|
|
43
44
|
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist/",
|
|
47
|
+
"doc/",
|
|
48
|
+
"README.md",
|
|
49
|
+
"README.cn.md",
|
|
50
|
+
"CHANGELOG.md",
|
|
51
|
+
"CHANGELOG.cn.md",
|
|
52
|
+
"LICENSE",
|
|
53
|
+
"NOTICE"
|
|
54
|
+
],
|
|
44
55
|
"repository": {
|
|
45
56
|
"type": "git",
|
|
46
57
|
"url": "https://github.com/labacacia/NPS-sdk-ts.git"
|
package/CONTRIBUTING.cn.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
[English Version](./CONTRIBUTING.md) | 中文版
|
|
2
|
-
|
|
3
|
-
# 为 NPS 贡献代码
|
|
4
|
-
|
|
5
|
-
感谢你有兴趣为 Neural Protocol Suite 做出贡献。
|
|
6
|
-
|
|
7
|
-
## Issue 前缀
|
|
8
|
-
|
|
9
|
-
| 前缀 | 用途 |
|
|
10
|
-
|------|------|
|
|
11
|
-
| `spec:` | 规范问题与设计讨论 |
|
|
12
|
-
| `impl:` | 实现 Bug 与修复 |
|
|
13
|
-
| `sdk:` | SDK 相关(Python / TypeScript 等) |
|
|
14
|
-
| `docs:` | 文档改进 |
|
|
15
|
-
|
|
16
|
-
## 工作流
|
|
17
|
-
|
|
18
|
-
1. 任何非平凡的变更先开 Issue
|
|
19
|
-
2. Fork 仓库并创建分支:`feature/your-feature` 或 `fix/your-fix`
|
|
20
|
-
3. 提交 Pull Request 并关联对应的 Issue
|
|
21
|
-
|
|
22
|
-
## 规范变更
|
|
23
|
-
|
|
24
|
-
对 `spec/` 目录下文件的变更必须先开讨论 Issue 才能接受 PR。
|
|
25
|
-
涉及线缆格式或帧结构的规范变更必须同时做版本号升级。
|
|
26
|
-
|
|
27
|
-
## 代码风格
|
|
28
|
-
|
|
29
|
-
- **C# / .NET**:遵循 Microsoft 标准 C# 约定,开启 Nullable
|
|
30
|
-
- **Python**:PEP 8,必须带类型标注
|
|
31
|
-
- **TypeScript**:开启严格模式
|
|
32
|
-
|
|
33
|
-
## 许可证
|
|
34
|
-
|
|
35
|
-
一旦提交贡献,你即同意贡献内容按 Apache 2.0 许可证授权。
|
package/CONTRIBUTING.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
English | [中文版](./CONTRIBUTING.cn.md)
|
|
2
|
-
|
|
3
|
-
# Contributing to NPS
|
|
4
|
-
|
|
5
|
-
Thank you for your interest in contributing to the Neural Protocol Suite.
|
|
6
|
-
|
|
7
|
-
## Issue Prefixes
|
|
8
|
-
|
|
9
|
-
| Prefix | Usage |
|
|
10
|
-
|--------|-------|
|
|
11
|
-
| `spec:` | Specification questions and design discussions |
|
|
12
|
-
| `impl:` | Implementation bugs and fixes |
|
|
13
|
-
| `sdk:` | SDK (Python / TypeScript) related |
|
|
14
|
-
| `docs:` | Documentation improvements |
|
|
15
|
-
|
|
16
|
-
## Workflow
|
|
17
|
-
|
|
18
|
-
1. Open an Issue first for any non-trivial change
|
|
19
|
-
2. Fork the repo and create a branch: `feature/your-feature` or `fix/your-fix`
|
|
20
|
-
3. Submit a Pull Request referencing the Issue
|
|
21
|
-
|
|
22
|
-
## Spec Changes
|
|
23
|
-
|
|
24
|
-
Changes to files under `spec/` require a discussion Issue before a PR is accepted.
|
|
25
|
-
Spec changes that affect wire format or frame structure require a version bump.
|
|
26
|
-
|
|
27
|
-
## Code Style
|
|
28
|
-
|
|
29
|
-
- **C# / .NET**: Follow standard Microsoft C# conventions, nullable enabled
|
|
30
|
-
- **Python**: PEP 8, type hints required
|
|
31
|
-
- **TypeScript**: Strict mode enabled
|
|
32
|
-
|
|
33
|
-
## License
|
|
34
|
-
|
|
35
|
-
By contributing, you agree your contributions will be licensed under Apache 2.0.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/** NWP error code wire constants — mirror of `spec/error-codes.md` NWP section. */
|
|
2
|
-
export declare const AUTH_NID_SCOPE_VIOLATION = "NWP-AUTH-NID-SCOPE-VIOLATION";
|
|
3
|
-
export declare const AUTH_NID_EXPIRED = "NWP-AUTH-NID-EXPIRED";
|
|
4
|
-
export declare const AUTH_NID_REVOKED = "NWP-AUTH-NID-REVOKED";
|
|
5
|
-
export declare const AUTH_NID_UNTRUSTED_ISSUER = "NWP-AUTH-NID-UNTRUSTED-ISSUER";
|
|
6
|
-
export declare const AUTH_NID_CAPABILITY_MISSING = "NWP-AUTH-NID-CAPABILITY-MISSING";
|
|
7
|
-
export declare const AUTH_ASSURANCE_TOO_LOW = "NWP-AUTH-ASSURANCE-TOO-LOW";
|
|
8
|
-
export declare const AUTH_REPUTATION_BLOCKED = "NWP-AUTH-REPUTATION-BLOCKED";
|
|
9
|
-
export declare const QUERY_FILTER_INVALID = "NWP-QUERY-FILTER-INVALID";
|
|
10
|
-
export declare const QUERY_FIELD_UNKNOWN = "NWP-QUERY-FIELD-UNKNOWN";
|
|
11
|
-
export declare const QUERY_CURSOR_INVALID = "NWP-QUERY-CURSOR-INVALID";
|
|
12
|
-
export declare const QUERY_REGEX_UNSAFE = "NWP-QUERY-REGEX-UNSAFE";
|
|
13
|
-
export declare const QUERY_VECTOR_UNSUPPORTED = "NWP-QUERY-VECTOR-UNSUPPORTED";
|
|
14
|
-
export declare const QUERY_AGGREGATE_UNSUPPORTED = "NWP-QUERY-AGGREGATE-UNSUPPORTED";
|
|
15
|
-
export declare const QUERY_AGGREGATE_INVALID = "NWP-QUERY-AGGREGATE-INVALID";
|
|
16
|
-
export declare const QUERY_STREAM_UNSUPPORTED = "NWP-QUERY-STREAM-UNSUPPORTED";
|
|
17
|
-
export declare const ACTION_NOT_FOUND = "NWP-ACTION-NOT-FOUND";
|
|
18
|
-
export declare const ACTION_PARAMS_INVALID = "NWP-ACTION-PARAMS-INVALID";
|
|
19
|
-
export declare const ACTION_IDEMPOTENCY_CONFLICT = "NWP-ACTION-IDEMPOTENCY-CONFLICT";
|
|
20
|
-
export declare const TASK_NOT_FOUND = "NWP-TASK-NOT-FOUND";
|
|
21
|
-
export declare const TASK_ALREADY_CANCELLED = "NWP-TASK-ALREADY-CANCELLED";
|
|
22
|
-
export declare const TASK_ALREADY_COMPLETED = "NWP-TASK-ALREADY-COMPLETED";
|
|
23
|
-
export declare const TASK_ALREADY_FAILED = "NWP-TASK-ALREADY-FAILED";
|
|
24
|
-
export declare const SUBSCRIBE_STREAM_NOT_FOUND = "NWP-SUBSCRIBE-STREAM-NOT-FOUND";
|
|
25
|
-
export declare const SUBSCRIBE_LIMIT_EXCEEDED = "NWP-SUBSCRIBE-LIMIT-EXCEEDED";
|
|
26
|
-
export declare const SUBSCRIBE_FILTER_UNSUPPORTED = "NWP-SUBSCRIBE-FILTER-UNSUPPORTED";
|
|
27
|
-
export declare const SUBSCRIBE_INTERRUPTED = "NWP-SUBSCRIBE-INTERRUPTED";
|
|
28
|
-
export declare const SUBSCRIBE_SEQ_TOO_OLD = "NWP-SUBSCRIBE-SEQ-TOO-OLD";
|
|
29
|
-
export declare const BUDGET_EXCEEDED = "NWP-BUDGET-EXCEEDED";
|
|
30
|
-
export declare const DEPTH_EXCEEDED = "NWP-DEPTH-EXCEEDED";
|
|
31
|
-
export declare const GRAPH_CYCLE = "NWP-GRAPH-CYCLE";
|
|
32
|
-
export declare const NODE_UNAVAILABLE = "NWP-NODE-UNAVAILABLE";
|
|
33
|
-
export declare const RATE_LIMIT_EXCEEDED = "NWP-RATE-LIMIT-EXCEEDED";
|
|
34
|
-
export declare const MANIFEST_VERSION_UNSUPPORTED = "NWP-MANIFEST-VERSION-UNSUPPORTED";
|
|
35
|
-
export declare const MANIFEST_NODE_TYPE_REMOVED = "NWP-MANIFEST-NODE-TYPE-REMOVED";
|
|
36
|
-
export declare const MANIFEST_NODE_TYPE_UNKNOWN = "NWP-MANIFEST-NODE-TYPE-UNKNOWN";
|
|
37
|
-
export declare const TOPOLOGY_UNAUTHORIZED = "NWP-TOPOLOGY-UNAUTHORIZED";
|
|
38
|
-
export declare const TOPOLOGY_UNSUPPORTED_SCOPE = "NWP-TOPOLOGY-UNSUPPORTED-SCOPE";
|
|
39
|
-
export declare const TOPOLOGY_DEPTH_UNSUPPORTED = "NWP-TOPOLOGY-DEPTH-UNSUPPORTED";
|
|
40
|
-
export declare const TOPOLOGY_FILTER_UNSUPPORTED = "NWP-TOPOLOGY-FILTER-UNSUPPORTED";
|
|
41
|
-
export declare const RESERVED_TYPE_UNSUPPORTED = "NWP-RESERVED-TYPE-UNSUPPORTED";
|
|
42
|
-
//# sourceMappingURL=error-codes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/nwp/error-codes.ts"],"names":[],"mappings":"AAGA,mFAAmF;AAGnF,eAAO,MAAM,wBAAwB,iCAAoC,CAAC;AAC1E,eAAO,MAAM,gBAAgB,yBAAoC,CAAC;AAClE,eAAO,MAAM,gBAAgB,yBAAoC,CAAC;AAClE,eAAO,MAAM,yBAAyB,kCAAoC,CAAC;AAC3E,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAC7E,eAAO,MAAM,sBAAsB,+BAAoC,CAAC;AACxE,eAAO,MAAM,uBAAuB,gCAAoC,CAAC;AAGzE,eAAO,MAAM,oBAAoB,6BAAoC,CAAC;AACtE,eAAO,MAAM,mBAAmB,4BAAoC,CAAC;AACrE,eAAO,MAAM,oBAAoB,6BAAoC,CAAC;AACtE,eAAO,MAAM,kBAAkB,2BAAoC,CAAC;AACpE,eAAO,MAAM,wBAAwB,iCAAoC,CAAC;AAC1E,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAC7E,eAAO,MAAM,uBAAuB,gCAAoC,CAAC;AACzE,eAAO,MAAM,wBAAwB,iCAAoC,CAAC;AAG1E,eAAO,MAAM,gBAAgB,yBAAoC,CAAC;AAClE,eAAO,MAAM,qBAAqB,8BAAoC,CAAC;AACvE,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAG7E,eAAO,MAAM,cAAc,uBAA+B,CAAC;AAC3D,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,mBAAmB,4BAA+B,CAAC;AAGhE,eAAO,MAAM,0BAA0B,mCAAqC,CAAC;AAC7E,eAAO,MAAM,wBAAwB,iCAAqC,CAAC;AAC3E,eAAO,MAAM,4BAA4B,qCAAqC,CAAC;AAC/E,eAAO,MAAM,qBAAqB,8BAAqC,CAAC;AACxE,eAAO,MAAM,qBAAqB,8BAAqC,CAAC;AAGxE,eAAO,MAAM,eAAe,wBAA6B,CAAC;AAC1D,eAAO,MAAM,cAAc,uBAA6B,CAAC;AACzD,eAAO,MAAM,WAAW,oBAA6B,CAAC;AACtD,eAAO,MAAM,gBAAgB,yBAA6B,CAAC;AAC3D,eAAO,MAAM,mBAAmB,4BAA6B,CAAC;AAG9D,eAAO,MAAM,4BAA4B,qCAAqC,CAAC;AAC/E,eAAO,MAAM,0BAA0B,mCAAqC,CAAC;AAC7E,eAAO,MAAM,0BAA0B,mCAAqC,CAAC;AAG7E,eAAO,MAAM,qBAAqB,8BAAoC,CAAC;AACvE,eAAO,MAAM,0BAA0B,mCAAoC,CAAC;AAC5E,eAAO,MAAM,0BAA0B,mCAAoC,CAAC;AAC5E,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAG7E,eAAO,MAAM,yBAAyB,kCAAkC,CAAC"}
|