@tinycloud/sdk-services 3.1.0-beta.1 → 3.1.0-beta.6
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/dist/encryption/index.cjs +106 -97
- package/dist/encryption/index.cjs.map +1 -1
- package/dist/encryption/index.js +106 -97
- package/dist/encryption/index.js.map +1 -1
- package/dist/index.cjs +344 -227
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +53 -1
- package/dist/index.d.ts +53 -1
- package/dist/index.js +319 -209
- package/dist/index.js.map +1 -1
- package/dist/kv/index.cjs +236 -58
- package/dist/kv/index.cjs.map +1 -1
- package/dist/kv/index.d.cts +5 -2
- package/dist/kv/index.d.ts +5 -2
- package/dist/kv/index.js +236 -58
- package/dist/kv/index.js.map +1 -1
- package/dist/sql/index.cjs +77 -26
- package/dist/sql/index.cjs.map +1 -1
- package/dist/sql/index.js +68 -17
- package/dist/sql/index.js.map +1 -1
- package/package.json +1 -1
package/dist/encryption/index.js
CHANGED
|
@@ -58,6 +58,106 @@ function err(error) {
|
|
|
58
58
|
return { ok: false, error };
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
// src/errors.ts
|
|
62
|
+
import { CAPABILITY_REGISTRY } from "@tinycloud/bootstrap";
|
|
63
|
+
|
|
64
|
+
// src/encryption/networkId.ts
|
|
65
|
+
var URN_PREFIX = "urn:tinycloud:encryption:";
|
|
66
|
+
var NETWORK_NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
67
|
+
var PKH_EIP155_DID_RE = /^did:pkh:eip155:(\d+):(0x[a-fA-F0-9]{40})$/;
|
|
68
|
+
var NetworkIdError = class extends Error {
|
|
69
|
+
constructor(message) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.name = "NetworkIdError";
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
function parseNetworkId(networkId) {
|
|
75
|
+
if (typeof networkId !== "string" || networkId.length === 0) {
|
|
76
|
+
throw new NetworkIdError("networkId must be a non-empty string");
|
|
77
|
+
}
|
|
78
|
+
if (!networkId.startsWith(URN_PREFIX)) {
|
|
79
|
+
throw new NetworkIdError(
|
|
80
|
+
`networkId must start with ${URN_PREFIX} (got ${JSON.stringify(networkId)})`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
const body = networkId.slice(URN_PREFIX.length);
|
|
84
|
+
const lastColon = body.lastIndexOf(":");
|
|
85
|
+
if (lastColon <= 0 || lastColon === body.length - 1) {
|
|
86
|
+
throw new NetworkIdError(
|
|
87
|
+
`networkId missing ownerDid or name segment (got ${JSON.stringify(networkId)})`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
const ownerDid = body.slice(0, lastColon);
|
|
91
|
+
const name = body.slice(lastColon + 1);
|
|
92
|
+
if (!ownerDid.startsWith("did:")) {
|
|
93
|
+
throw new NetworkIdError(
|
|
94
|
+
`networkId ownerDid must be a DID (got ${JSON.stringify(ownerDid)})`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
const didParts = ownerDid.split(":");
|
|
98
|
+
if (didParts.length < 3 || didParts.some((p) => p.length === 0)) {
|
|
99
|
+
throw new NetworkIdError(
|
|
100
|
+
`networkId ownerDid is not a well-formed DID (got ${JSON.stringify(ownerDid)})`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (!NETWORK_NAME_RE.test(name)) {
|
|
104
|
+
throw new NetworkIdError(
|
|
105
|
+
`networkId name ${JSON.stringify(name)} must match ${NETWORK_NAME_RE.source}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
return { networkId, ownerDid, name };
|
|
109
|
+
}
|
|
110
|
+
function buildNetworkId(ownerDid, name) {
|
|
111
|
+
if (typeof ownerDid !== "string" || !ownerDid.startsWith("did:")) {
|
|
112
|
+
throw new NetworkIdError("ownerDid must be a DID");
|
|
113
|
+
}
|
|
114
|
+
if (typeof name !== "string" || !NETWORK_NAME_RE.test(name)) {
|
|
115
|
+
throw new NetworkIdError(
|
|
116
|
+
`network name ${JSON.stringify(name)} must match ${NETWORK_NAME_RE.source}`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
const networkId = `${URN_PREFIX}${ownerDid}:${name}`;
|
|
120
|
+
parseNetworkId(networkId);
|
|
121
|
+
return networkId;
|
|
122
|
+
}
|
|
123
|
+
function isNetworkId(networkId) {
|
|
124
|
+
if (typeof networkId !== "string") {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
parseNetworkId(networkId);
|
|
129
|
+
return true;
|
|
130
|
+
} catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function parsePkhOwnerDid(ownerDid) {
|
|
135
|
+
const match = ownerDid.match(PKH_EIP155_DID_RE);
|
|
136
|
+
if (!match) return null;
|
|
137
|
+
return {
|
|
138
|
+
chainId: match[1],
|
|
139
|
+
address: match[2].toLowerCase()
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function ownerDidMatches(a, b) {
|
|
143
|
+
const aPkh = parsePkhOwnerDid(a);
|
|
144
|
+
const bPkh = parsePkhOwnerDid(b);
|
|
145
|
+
if (aPkh && bPkh) {
|
|
146
|
+
return aPkh.chainId === bPkh.chainId && aPkh.address === bPkh.address;
|
|
147
|
+
}
|
|
148
|
+
return a === b;
|
|
149
|
+
}
|
|
150
|
+
function networkDiscoveryKey(name) {
|
|
151
|
+
if (!NETWORK_NAME_RE.test(name)) {
|
|
152
|
+
throw new NetworkIdError(
|
|
153
|
+
`network name ${JSON.stringify(name)} must match ${NETWORK_NAME_RE.source}`
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
return `.well-known/encryption/network/${name}`;
|
|
157
|
+
}
|
|
158
|
+
var ENCRYPTION_NETWORK_URN_PREFIX = URN_PREFIX;
|
|
159
|
+
var NETWORK_NAME_PATTERN = NETWORK_NAME_RE;
|
|
160
|
+
|
|
61
161
|
// src/errors.ts
|
|
62
162
|
function timeoutError(service) {
|
|
63
163
|
return {
|
|
@@ -73,6 +173,12 @@ function abortedError(service) {
|
|
|
73
173
|
service
|
|
74
174
|
};
|
|
75
175
|
}
|
|
176
|
+
var grantableActions = new Set(
|
|
177
|
+
CAPABILITY_REGISTRY.map(({ urn }) => urn).filter((urn) => !urn.endsWith("/*"))
|
|
178
|
+
);
|
|
179
|
+
var capabilityServices = new Set(
|
|
180
|
+
CAPABILITY_REGISTRY.map(({ service }) => service.slice("tinycloud.".length))
|
|
181
|
+
);
|
|
76
182
|
function wrapError(service, error, defaultCode = ErrorCodes.NETWORK_ERROR) {
|
|
77
183
|
if (error instanceof Error) {
|
|
78
184
|
if (error.name === "AbortError") {
|
|
@@ -415,103 +521,6 @@ function canonicalHashHex(sha256, value) {
|
|
|
415
521
|
return hexEncode(sha256(utf8Encode(canonical)));
|
|
416
522
|
}
|
|
417
523
|
|
|
418
|
-
// src/encryption/networkId.ts
|
|
419
|
-
var URN_PREFIX = "urn:tinycloud:encryption:";
|
|
420
|
-
var NETWORK_NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
421
|
-
var PKH_EIP155_DID_RE = /^did:pkh:eip155:(\d+):(0x[a-fA-F0-9]{40})$/;
|
|
422
|
-
var NetworkIdError = class extends Error {
|
|
423
|
-
constructor(message) {
|
|
424
|
-
super(message);
|
|
425
|
-
this.name = "NetworkIdError";
|
|
426
|
-
}
|
|
427
|
-
};
|
|
428
|
-
function parseNetworkId(networkId) {
|
|
429
|
-
if (typeof networkId !== "string" || networkId.length === 0) {
|
|
430
|
-
throw new NetworkIdError("networkId must be a non-empty string");
|
|
431
|
-
}
|
|
432
|
-
if (!networkId.startsWith(URN_PREFIX)) {
|
|
433
|
-
throw new NetworkIdError(
|
|
434
|
-
`networkId must start with ${URN_PREFIX} (got ${JSON.stringify(networkId)})`
|
|
435
|
-
);
|
|
436
|
-
}
|
|
437
|
-
const body = networkId.slice(URN_PREFIX.length);
|
|
438
|
-
const lastColon = body.lastIndexOf(":");
|
|
439
|
-
if (lastColon <= 0 || lastColon === body.length - 1) {
|
|
440
|
-
throw new NetworkIdError(
|
|
441
|
-
`networkId missing ownerDid or name segment (got ${JSON.stringify(networkId)})`
|
|
442
|
-
);
|
|
443
|
-
}
|
|
444
|
-
const ownerDid = body.slice(0, lastColon);
|
|
445
|
-
const name = body.slice(lastColon + 1);
|
|
446
|
-
if (!ownerDid.startsWith("did:")) {
|
|
447
|
-
throw new NetworkIdError(
|
|
448
|
-
`networkId ownerDid must be a DID (got ${JSON.stringify(ownerDid)})`
|
|
449
|
-
);
|
|
450
|
-
}
|
|
451
|
-
const didParts = ownerDid.split(":");
|
|
452
|
-
if (didParts.length < 3 || didParts.some((p) => p.length === 0)) {
|
|
453
|
-
throw new NetworkIdError(
|
|
454
|
-
`networkId ownerDid is not a well-formed DID (got ${JSON.stringify(ownerDid)})`
|
|
455
|
-
);
|
|
456
|
-
}
|
|
457
|
-
if (!NETWORK_NAME_RE.test(name)) {
|
|
458
|
-
throw new NetworkIdError(
|
|
459
|
-
`networkId name ${JSON.stringify(name)} must match ${NETWORK_NAME_RE.source}`
|
|
460
|
-
);
|
|
461
|
-
}
|
|
462
|
-
return { networkId, ownerDid, name };
|
|
463
|
-
}
|
|
464
|
-
function buildNetworkId(ownerDid, name) {
|
|
465
|
-
if (typeof ownerDid !== "string" || !ownerDid.startsWith("did:")) {
|
|
466
|
-
throw new NetworkIdError("ownerDid must be a DID");
|
|
467
|
-
}
|
|
468
|
-
if (typeof name !== "string" || !NETWORK_NAME_RE.test(name)) {
|
|
469
|
-
throw new NetworkIdError(
|
|
470
|
-
`network name ${JSON.stringify(name)} must match ${NETWORK_NAME_RE.source}`
|
|
471
|
-
);
|
|
472
|
-
}
|
|
473
|
-
const networkId = `${URN_PREFIX}${ownerDid}:${name}`;
|
|
474
|
-
parseNetworkId(networkId);
|
|
475
|
-
return networkId;
|
|
476
|
-
}
|
|
477
|
-
function isNetworkId(networkId) {
|
|
478
|
-
if (typeof networkId !== "string") {
|
|
479
|
-
return false;
|
|
480
|
-
}
|
|
481
|
-
try {
|
|
482
|
-
parseNetworkId(networkId);
|
|
483
|
-
return true;
|
|
484
|
-
} catch {
|
|
485
|
-
return false;
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
function parsePkhOwnerDid(ownerDid) {
|
|
489
|
-
const match = ownerDid.match(PKH_EIP155_DID_RE);
|
|
490
|
-
if (!match) return null;
|
|
491
|
-
return {
|
|
492
|
-
chainId: match[1],
|
|
493
|
-
address: match[2].toLowerCase()
|
|
494
|
-
};
|
|
495
|
-
}
|
|
496
|
-
function ownerDidMatches(a, b) {
|
|
497
|
-
const aPkh = parsePkhOwnerDid(a);
|
|
498
|
-
const bPkh = parsePkhOwnerDid(b);
|
|
499
|
-
if (aPkh && bPkh) {
|
|
500
|
-
return aPkh.chainId === bPkh.chainId && aPkh.address === bPkh.address;
|
|
501
|
-
}
|
|
502
|
-
return a === b;
|
|
503
|
-
}
|
|
504
|
-
function networkDiscoveryKey(name) {
|
|
505
|
-
if (!NETWORK_NAME_RE.test(name)) {
|
|
506
|
-
throw new NetworkIdError(
|
|
507
|
-
`network name ${JSON.stringify(name)} must match ${NETWORK_NAME_RE.source}`
|
|
508
|
-
);
|
|
509
|
-
}
|
|
510
|
-
return `.well-known/encryption/network/${name}`;
|
|
511
|
-
}
|
|
512
|
-
var ENCRYPTION_NETWORK_URN_PREFIX = URN_PREFIX;
|
|
513
|
-
var NETWORK_NAME_PATTERN = NETWORK_NAME_RE;
|
|
514
|
-
|
|
515
524
|
// src/encryption/types.ts
|
|
516
525
|
var DEFAULT_ENCRYPTION_ALG = "x25519-aes256gcm/v1";
|
|
517
526
|
var ENVELOPE_VERSION = 1;
|