@tinycloud/node-sdk 3.5.0-beta.0 → 3.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/dist/core.cjs +40 -7
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +52 -15
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +40 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +58 -21
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -17430,7 +17430,7 @@ __export(authority_exports, {
|
|
|
17430
17430
|
});
|
|
17431
17431
|
import { SiweMessage as SiweMessage4 } from "siwe";
|
|
17432
17432
|
import {
|
|
17433
|
-
actionContains,
|
|
17433
|
+
actionContains as actionContains2,
|
|
17434
17434
|
KV as KV4,
|
|
17435
17435
|
canonicalizeRecapCaveats as canonicalizeRecapCaveats3,
|
|
17436
17436
|
isCapabilitySubset as isCapabilitySubset3,
|
|
@@ -17546,7 +17546,7 @@ function ucanAttCovers(att, space, prefix, ability, options) {
|
|
|
17546
17546
|
const path = kvPathInResource(resource, space);
|
|
17547
17547
|
if (path === void 0) continue;
|
|
17548
17548
|
for (const [granted, caveats] of Object.entries(abilities)) {
|
|
17549
|
-
if (!
|
|
17549
|
+
if (!actionContains2(granted, ability)) continue;
|
|
17550
17550
|
if (!isCapabilitySubset3(
|
|
17551
17551
|
[{ service: KV_SERVICE2, space, path: prefix, actions: [ability] }],
|
|
17552
17552
|
[{ service: KV_SERVICE2, space, path, actions: [granted] }]
|
|
@@ -18708,7 +18708,7 @@ import {
|
|
|
18708
18708
|
KV as KV3,
|
|
18709
18709
|
SQL as SQL2,
|
|
18710
18710
|
DUCKDB as DUCKDB2,
|
|
18711
|
-
ENCRYPTION as
|
|
18711
|
+
ENCRYPTION as ENCRYPTION3,
|
|
18712
18712
|
EXPIRY as EXPIRY3,
|
|
18713
18713
|
canonicalHashHex,
|
|
18714
18714
|
canonicalizeEncryptionJson,
|
|
@@ -18720,7 +18720,7 @@ import {
|
|
|
18720
18720
|
createInMemoryRegistrySequenceStore as createInMemoryRegistrySequenceStore2,
|
|
18721
18721
|
publishLocationRecord,
|
|
18722
18722
|
principalDidEquals as principalDidEquals3,
|
|
18723
|
-
parseNetworkId as
|
|
18723
|
+
parseNetworkId as parseNetworkId3,
|
|
18724
18724
|
resolveSecretPath as resolveSecretPath2,
|
|
18725
18725
|
registerPolicyV3,
|
|
18726
18726
|
CREDENTIAL_INVITATION_REQUEST_DOMAIN,
|
|
@@ -20775,7 +20775,11 @@ function createWasmKeyProvider(sessionManager) {
|
|
|
20775
20775
|
|
|
20776
20776
|
// src/delegateToHelpers.ts
|
|
20777
20777
|
import {
|
|
20778
|
+
actionContains,
|
|
20779
|
+
ENCRYPTION as ENCRYPTION2,
|
|
20778
20780
|
parseExpiry,
|
|
20781
|
+
isNetworkId,
|
|
20782
|
+
parseNetworkId as parseNetworkId2,
|
|
20779
20783
|
SiweMessage as SiweMessage2,
|
|
20780
20784
|
EXPIRY as EXPIRY2
|
|
20781
20785
|
} from "@tinycloud/sdk-core";
|
|
@@ -20810,6 +20814,16 @@ function legacyParamsToPermissionEntries(actions, path, spaceIdOverride) {
|
|
|
20810
20814
|
return entries;
|
|
20811
20815
|
}
|
|
20812
20816
|
var DEFAULT_DELEGATION_EXPIRY_MS = EXPIRY2.SESSION_MS;
|
|
20817
|
+
var SHARE_NETWORK_NAME_RE = /^share-[a-z0-9][a-z0-9-]{15,35}$/;
|
|
20818
|
+
function grantsCappedDecrypt(path, actions) {
|
|
20819
|
+
if (!actions.some((action) => actionContains(action, ENCRYPTION2.DECRYPT))) {
|
|
20820
|
+
return false;
|
|
20821
|
+
}
|
|
20822
|
+
return !(isNetworkId(path) && SHARE_NETWORK_NAME_RE.test(parseNetworkId2(path).name));
|
|
20823
|
+
}
|
|
20824
|
+
function includesDecrypt(entries) {
|
|
20825
|
+
return entries.some((entry) => grantsCappedDecrypt(entry.path, entry.actions));
|
|
20826
|
+
}
|
|
20813
20827
|
function resolveExpiryMs(expiry) {
|
|
20814
20828
|
if (expiry === void 0) {
|
|
20815
20829
|
return DEFAULT_DELEGATION_EXPIRY_MS;
|
|
@@ -20983,6 +20997,15 @@ var NodeSecretsService = class {
|
|
|
20983
20997
|
if (this.hasPermission(permissionEntries)) {
|
|
20984
20998
|
return ok();
|
|
20985
20999
|
}
|
|
21000
|
+
let escalation;
|
|
21001
|
+
try {
|
|
21002
|
+
escalation = this.config.uncoveredEntries?.(permissionEntries) ?? permissionEntries;
|
|
21003
|
+
} catch (error) {
|
|
21004
|
+
return this.escalationError(action, target, error);
|
|
21005
|
+
}
|
|
21006
|
+
if (this.config.uncoveredEntries !== void 0 && escalation.length === 0) {
|
|
21007
|
+
return ok();
|
|
21008
|
+
}
|
|
20986
21009
|
if (!this.config.canEscalate()) {
|
|
20987
21010
|
return secretsError(
|
|
20988
21011
|
ErrorCodes.PERMISSION_DENIED,
|
|
@@ -20990,16 +21013,20 @@ var NodeSecretsService = class {
|
|
|
20990
21013
|
);
|
|
20991
21014
|
}
|
|
20992
21015
|
try {
|
|
20993
|
-
|
|
21016
|
+
const grant = action === "get" && this.config.grantGetPermissions !== void 0 ? this.config.grantGetPermissions : this.config.grantPermissions;
|
|
21017
|
+
await grant(escalation);
|
|
20994
21018
|
return this.restoreUnlockAfterEscalation();
|
|
20995
21019
|
} catch (error) {
|
|
20996
|
-
return
|
|
20997
|
-
ErrorCodes.PERMISSION_DENIED,
|
|
20998
|
-
error instanceof Error ? error.message : `Autosign escalation for ${displayActionUrn(action)} on ${target} failed.`,
|
|
20999
|
-
error instanceof Error ? error : void 0
|
|
21000
|
-
);
|
|
21020
|
+
return this.escalationError(action, target, error);
|
|
21001
21021
|
}
|
|
21002
21022
|
}
|
|
21023
|
+
escalationError(action, target, error) {
|
|
21024
|
+
return secretsError(
|
|
21025
|
+
ErrorCodes.PERMISSION_DENIED,
|
|
21026
|
+
error instanceof Error ? error.message : `Autosign escalation for ${displayActionUrn(action)} on ${target} failed.`,
|
|
21027
|
+
error instanceof Error ? error : void 0
|
|
21028
|
+
);
|
|
21029
|
+
}
|
|
21003
21030
|
async restoreUnlockAfterEscalation() {
|
|
21004
21031
|
if (!this.shouldRestoreUnlock) {
|
|
21005
21032
|
return ok();
|
|
@@ -21034,8 +21061,8 @@ var NodeSecretsService = class {
|
|
|
21034
21061
|
// src/TinyCloudNode.ts
|
|
21035
21062
|
var DEFAULT_HOST = "https://node.tinycloud.xyz";
|
|
21036
21063
|
var DEFAULT_ENCRYPTION_NETWORK_NAME = "default";
|
|
21037
|
-
var NETWORK_CREATE_ACTION2 =
|
|
21038
|
-
var DECRYPT_ACTION2 =
|
|
21064
|
+
var NETWORK_CREATE_ACTION2 = ENCRYPTION3.NETWORK_CREATE;
|
|
21065
|
+
var DECRYPT_ACTION2 = ENCRYPTION3.DECRYPT;
|
|
21039
21066
|
var BOOTSTRAP_COMPLETION_MARKER_KEY = "system/bootstrap/complete";
|
|
21040
21067
|
var BOOTSTRAP_COMPLETION_MARKER_VERSION = 1;
|
|
21041
21068
|
var ACCEPTED_MARKER_VERSIONS = [BOOTSTRAP_COMPLETION_MARKER_VERSION];
|
|
@@ -21382,7 +21409,7 @@ function ownerDelegationPermissions(params) {
|
|
|
21382
21409
|
}
|
|
21383
21410
|
if (permission.service === ENCRYPTION_PERMISSION_SERVICE2) {
|
|
21384
21411
|
try {
|
|
21385
|
-
|
|
21412
|
+
parseNetworkId3(permission.path);
|
|
21386
21413
|
} catch {
|
|
21387
21414
|
throw new Error("Owner delegation encryption permission requires a canonical network URN");
|
|
21388
21415
|
}
|
|
@@ -21405,6 +21432,8 @@ function ownerPermissionsToAbilities(permissions) {
|
|
|
21405
21432
|
return { abilities, rawAbilities };
|
|
21406
21433
|
}
|
|
21407
21434
|
var TERMINAL_DELEGATION_REQUIRES_SESSION_KEY = "disableSubDelegation requires a session-key delegation to a did:key (not did:pkh); use the session-key DID or drop the flag";
|
|
21435
|
+
var DECRYPT_GRANT_MAX_EXPIRY_MS = 60 * 60 * 1e3;
|
|
21436
|
+
var SECRET_GET_GRANT_EXPIRY_MS = 59 * 60 * 1e3;
|
|
21408
21437
|
function base64UrlEncode(bytes) {
|
|
21409
21438
|
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
21410
21439
|
let output = "";
|
|
@@ -23313,7 +23342,7 @@ var _TinyCloudNode = class _TinyCloudNode {
|
|
|
23313
23342
|
return;
|
|
23314
23343
|
}
|
|
23315
23344
|
for (const networkId of this.requestedEncryptionNetworkIds()) {
|
|
23316
|
-
const parsed =
|
|
23345
|
+
const parsed = parseNetworkId3(networkId);
|
|
23317
23346
|
if (!didPrincipalMatches2(parsed.ownerDid, this.did)) {
|
|
23318
23347
|
continue;
|
|
23319
23348
|
}
|
|
@@ -25132,7 +25161,7 @@ var _TinyCloudNode = class _TinyCloudNode {
|
|
|
25132
25161
|
if (!session) throw new Error("Owner session is required");
|
|
25133
25162
|
const ownerDid = pkhDid2(session.address, session.chainId);
|
|
25134
25163
|
for (const permission of permissions) {
|
|
25135
|
-
if (permission.service === ENCRYPTION_PERMISSION_SERVICE2 && !principalDidEquals3(
|
|
25164
|
+
if (permission.service === ENCRYPTION_PERMISSION_SERVICE2 && !principalDidEquals3(parseNetworkId3(permission.path).ownerDid, ownerDid)) {
|
|
25136
25165
|
throw new Error("Owner delegation cannot grant a foreign encryption network");
|
|
25137
25166
|
}
|
|
25138
25167
|
}
|
|
@@ -25494,7 +25523,7 @@ var _TinyCloudNode = class _TinyCloudNode {
|
|
|
25494
25523
|
return existing;
|
|
25495
25524
|
}
|
|
25496
25525
|
}
|
|
25497
|
-
const parsed =
|
|
25526
|
+
const parsed = parseNetworkId3(networkId);
|
|
25498
25527
|
if (!didPrincipalMatches2(parsed.ownerDid, this.did)) {
|
|
25499
25528
|
throw new Error(
|
|
25500
25529
|
`Cannot create encryption network ${networkId}: owner ${parsed.ownerDid} does not match signed-in DID ${this.did}`
|
|
@@ -25527,6 +25556,8 @@ var _TinyCloudNode = class _TinyCloudNode {
|
|
|
25527
25556
|
getManifest: () => this.manifest,
|
|
25528
25557
|
hasPermissions: (permissions) => this.hasRuntimePermissions(permissions),
|
|
25529
25558
|
grantPermissions: (additional) => this.grantRuntimePermissions(additional),
|
|
25559
|
+
grantGetPermissions: (additional) => this.grantRuntimePermissions(additional, { expiry: SECRET_GET_GRANT_EXPIRY_MS }),
|
|
25560
|
+
uncoveredEntries: (permissions) => permissions.filter((entry) => !this.hasRuntimePermissions([entry])),
|
|
25530
25561
|
canEscalate: () => this.signer !== void 0 && this.tc !== void 0,
|
|
25531
25562
|
getEncryptionNetworkId: () => this.getEncryptionNetworkIdForSpace(resolvedSpace),
|
|
25532
25563
|
resolveSpace: (space) => space.startsWith("tinycloud:") ? space : this.ownedSpaceId(space),
|
|
@@ -25874,6 +25905,13 @@ var _TinyCloudNode = class _TinyCloudNode {
|
|
|
25874
25905
|
}
|
|
25875
25906
|
}
|
|
25876
25907
|
const expanded = this.expandPermissionEntries(permissions);
|
|
25908
|
+
const requestsDecrypt = includesDecrypt(expanded);
|
|
25909
|
+
const requestedExpiryMs = requestsDecrypt && options?.expiry === void 0 ? DECRYPT_GRANT_MAX_EXPIRY_MS : resolveExpiryMs(options?.expiry);
|
|
25910
|
+
if (requestsDecrypt && requestedExpiryMs > DECRYPT_GRANT_MAX_EXPIRY_MS) {
|
|
25911
|
+
throw Object.assign(new Error("decrypt grants last at most one hour"), {
|
|
25912
|
+
code: "DECRYPT_EXPIRY_TOO_LONG"
|
|
25913
|
+
});
|
|
25914
|
+
}
|
|
25877
25915
|
if (this.sessionCoversPermissionEntries(session, expanded)) {
|
|
25878
25916
|
return [];
|
|
25879
25917
|
}
|
|
@@ -25904,7 +25942,6 @@ var _TinyCloudNode = class _TinyCloudNode {
|
|
|
25904
25942
|
bySpace.set(session.spaceId, []);
|
|
25905
25943
|
}
|
|
25906
25944
|
const now = /* @__PURE__ */ new Date();
|
|
25907
|
-
const requestedExpiryMs = resolveExpiryMs(options?.expiry);
|
|
25908
25945
|
let expiresAt = new Date(now.getTime() + requestedExpiryMs);
|
|
25909
25946
|
if (sessionExpiry !== void 0 && sessionExpiry < expiresAt) {
|
|
25910
25947
|
expiresAt = sessionExpiry;
|
|
@@ -27955,9 +27992,9 @@ import {
|
|
|
27955
27992
|
import {
|
|
27956
27993
|
EncryptionService as EncryptionService2,
|
|
27957
27994
|
DecryptTransportResponseError as DecryptTransportResponseError2,
|
|
27958
|
-
parseNetworkId as
|
|
27995
|
+
parseNetworkId as parseNetworkId4,
|
|
27959
27996
|
buildNetworkId,
|
|
27960
|
-
isNetworkId,
|
|
27997
|
+
isNetworkId as isNetworkId2,
|
|
27961
27998
|
networkDiscoveryKey,
|
|
27962
27999
|
NetworkIdError,
|
|
27963
28000
|
ENCRYPTION_NETWORK_URN_PREFIX,
|
|
@@ -30676,7 +30713,7 @@ export {
|
|
|
30676
30713
|
installTinyCloudDebugGlobals,
|
|
30677
30714
|
isCapabilitySubset4 as isCapabilitySubset,
|
|
30678
30715
|
isEvmAddress,
|
|
30679
|
-
isNetworkId,
|
|
30716
|
+
isNetworkId2 as isNetworkId,
|
|
30680
30717
|
isStorageFullError2 as isStorageFullError,
|
|
30681
30718
|
loadManifest,
|
|
30682
30719
|
logoutPrincipalDigest,
|
|
@@ -30686,7 +30723,7 @@ export {
|
|
|
30686
30723
|
openWrappedKey,
|
|
30687
30724
|
parseCanonicalNetworkId,
|
|
30688
30725
|
parseExpiry2 as parseExpiry,
|
|
30689
|
-
|
|
30726
|
+
parseNetworkId4 as parseNetworkId,
|
|
30690
30727
|
parsePkhDid,
|
|
30691
30728
|
parseSecretCatalogKey,
|
|
30692
30729
|
parseSpaceUri3 as parseSpaceUri,
|