@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/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 (!actionContains(granted, ability)) continue;
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 ENCRYPTION2,
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 parseNetworkId2,
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
- await this.config.grantPermissions(permissionEntries);
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 secretsError(
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 = ENCRYPTION2.NETWORK_CREATE;
21038
- var DECRYPT_ACTION2 = ENCRYPTION2.DECRYPT;
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
- parseNetworkId2(permission.path);
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 = parseNetworkId2(networkId);
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(parseNetworkId2(permission.path).ownerDid, ownerDid)) {
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 = parseNetworkId2(networkId);
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 parseNetworkId3,
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
- parseNetworkId3 as parseNetworkId,
30726
+ parseNetworkId4 as parseNetworkId,
30690
30727
  parsePkhDid,
30691
30728
  parseSecretCatalogKey,
30692
30729
  parseSpaceUri3 as parseSpaceUri,