@tinycloud/sdk-services 2.6.3 → 2.7.0-beta.4

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.
Files changed (35) hide show
  1. package/dist/BaseService-BwBU5CQ4.d.cts +158 -0
  2. package/dist/BaseService-CnPTKR5G.d.ts +158 -0
  3. package/dist/encryption/index.cjs +46 -6
  4. package/dist/encryption/index.cjs.map +1 -1
  5. package/dist/encryption/index.d.cts +9 -1
  6. package/dist/encryption/index.d.ts +9 -1
  7. package/dist/encryption/index.js +45 -6
  8. package/dist/encryption/index.js.map +1 -1
  9. package/dist/index.cjs +299 -21
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +58 -9
  12. package/dist/index.d.ts +58 -9
  13. package/dist/index.js +293 -18
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/decrypt-transport-response-error.cjs +38 -0
  16. package/dist/internal/decrypt-transport-response-error.cjs.map +1 -0
  17. package/dist/internal/decrypt-transport-response-error.d.cts +10 -0
  18. package/dist/internal/decrypt-transport-response-error.d.ts +10 -0
  19. package/dist/internal/decrypt-transport-response-error.js +13 -0
  20. package/dist/internal/decrypt-transport-response-error.js.map +1 -0
  21. package/dist/kv/index.cjs +46 -4
  22. package/dist/kv/index.cjs.map +1 -1
  23. package/dist/kv/index.d.cts +2 -1
  24. package/dist/kv/index.d.ts +2 -1
  25. package/dist/kv/index.js +46 -4
  26. package/dist/kv/index.js.map +1 -1
  27. package/dist/sql/index.cjs +6 -2
  28. package/dist/sql/index.cjs.map +1 -1
  29. package/dist/sql/index.d.cts +2 -1
  30. package/dist/sql/index.d.ts +2 -1
  31. package/dist/sql/index.js +6 -2
  32. package/dist/sql/index.js.map +1 -1
  33. package/dist/{BaseService-BdRvNm2s.d.cts → types-DAY1O1kW.d.cts} +14 -156
  34. package/dist/{BaseService-BdRvNm2s.d.ts → types-DAY1O1kW.d.ts} +14 -156
  35. package/package.json +11 -3
@@ -1,4 +1,6 @@
1
- import { c as IService, e as Result, B as BaseService } from '../BaseService-BdRvNm2s.cjs';
1
+ import { B as BaseService } from '../BaseService-BwBU5CQ4.cjs';
2
+ import { P as PermissionHint, I as IService, R as Result } from '../types-DAY1O1kW.cjs';
3
+ export { DecryptTransportResponseError } from '@tinycloud/sdk-services/internal/decrypt-transport-response-error';
2
4
 
3
5
  /**
4
6
  * Canonical JSON serialization and content hashing for TinyCloud
@@ -298,6 +300,7 @@ type EncryptionErrorInput = {
298
300
  } | {
299
301
  code: "DECRYPT_DENIED";
300
302
  message: string;
303
+ permissionHint?: PermissionHint;
301
304
  } | {
302
305
  code: "INVALID_RESPONSE";
303
306
  message: string;
@@ -481,14 +484,18 @@ interface DecryptTransport {
481
484
  networkId: string;
482
485
  authorization: string;
483
486
  canonicalBody: string;
487
+ signal?: AbortSignal;
484
488
  }): Promise<DecryptResponseBody>;
485
489
  }
490
+
486
491
  interface EncryptionServiceConfig {
487
492
  crypto: EncryptionCrypto;
488
493
  signer: DecryptInvocationSigner;
489
494
  transport: DecryptTransport;
490
495
  node?: NodeDescriptorFetcher;
491
496
  wellKnown?: WellKnownDescriptorFetcher;
497
+ /** Bound by an owning service graph to prevent cross-session authority use. */
498
+ assertActive?: () => void;
492
499
  [key: string]: unknown;
493
500
  }
494
501
  declare class EncryptionService extends BaseService implements IEncryptionService {
@@ -500,6 +507,7 @@ declare class EncryptionService extends BaseService implements IEncryptionServic
500
507
  discoverNetwork(identifier: string, ownerDid?: string): Promise<Result<NetworkDescriptor, EncryptionError>>;
501
508
  encryptToNetwork(networkId: string, plaintext: Uint8Array, options?: EncryptToNetworkOptions): Promise<Result<InlineEncryptedEnvelope, EncryptionError>>;
502
509
  decryptEnvelope(envelope: InlineEncryptedEnvelope, capabilityProof: DecryptCapabilityProof, options?: DecryptEnvelopeOptions): Promise<Result<Uint8Array, EncryptionError>>;
510
+ private assertActive;
503
511
  }
504
512
 
505
513
  /**
@@ -1,4 +1,6 @@
1
- import { c as IService, e as Result, B as BaseService } from '../BaseService-BdRvNm2s.js';
1
+ import { B as BaseService } from '../BaseService-CnPTKR5G.js';
2
+ import { P as PermissionHint, I as IService, R as Result } from '../types-DAY1O1kW.js';
3
+ export { DecryptTransportResponseError } from '@tinycloud/sdk-services/internal/decrypt-transport-response-error';
2
4
 
3
5
  /**
4
6
  * Canonical JSON serialization and content hashing for TinyCloud
@@ -298,6 +300,7 @@ type EncryptionErrorInput = {
298
300
  } | {
299
301
  code: "DECRYPT_DENIED";
300
302
  message: string;
303
+ permissionHint?: PermissionHint;
301
304
  } | {
302
305
  code: "INVALID_RESPONSE";
303
306
  message: string;
@@ -481,14 +484,18 @@ interface DecryptTransport {
481
484
  networkId: string;
482
485
  authorization: string;
483
486
  canonicalBody: string;
487
+ signal?: AbortSignal;
484
488
  }): Promise<DecryptResponseBody>;
485
489
  }
490
+
486
491
  interface EncryptionServiceConfig {
487
492
  crypto: EncryptionCrypto;
488
493
  signer: DecryptInvocationSigner;
489
494
  transport: DecryptTransport;
490
495
  node?: NodeDescriptorFetcher;
491
496
  wellKnown?: WellKnownDescriptorFetcher;
497
+ /** Bound by an owning service graph to prevent cross-session authority use. */
498
+ assertActive?: () => void;
492
499
  [key: string]: unknown;
493
500
  }
494
501
  declare class EncryptionService extends BaseService implements IEncryptionService {
@@ -500,6 +507,7 @@ declare class EncryptionService extends BaseService implements IEncryptionServic
500
507
  discoverNetwork(identifier: string, ownerDid?: string): Promise<Result<NetworkDescriptor, EncryptionError>>;
501
508
  encryptToNetwork(networkId: string, plaintext: Uint8Array, options?: EncryptToNetworkOptions): Promise<Result<InlineEncryptedEnvelope, EncryptionError>>;
502
509
  decryptEnvelope(envelope: InlineEncryptedEnvelope, capabilityProof: DecryptCapabilityProof, options?: DecryptEnvelopeOptions): Promise<Result<Uint8Array, EncryptionError>>;
510
+ private assertActive;
503
511
  }
504
512
 
505
513
  /**
@@ -141,7 +141,7 @@ var BaseService = class {
141
141
  * Combines the service-level abort with context-level abort.
142
142
  */
143
143
  get abortSignal() {
144
- return this.abortController.signal;
144
+ return this.combineSignals();
145
145
  }
146
146
  /**
147
147
  * Check if the service is authenticated.
@@ -257,7 +257,11 @@ var BaseService = class {
257
257
  */
258
258
  combineSignals(...signals) {
259
259
  const controller = new AbortController();
260
- const allSignals = [this.abortSignal, ...signals.filter(Boolean)];
260
+ const allSignals = [
261
+ this.abortController.signal,
262
+ this.context?.abortSignal,
263
+ ...signals.filter(Boolean)
264
+ ].filter(Boolean);
261
265
  for (const signal of allSignals) {
262
266
  if (signal.aborted) {
263
267
  controller.abort(signal.reason);
@@ -1144,6 +1148,8 @@ function openWrappedKey(crypto, receiverPrivateKey, response) {
1144
1148
  }
1145
1149
 
1146
1150
  // src/encryption/EncryptionService.ts
1151
+ import { DecryptTransportResponseError } from "@tinycloud/sdk-services/internal/decrypt-transport-response-error";
1152
+ import { DecryptTransportResponseError as DecryptTransportResponseError2 } from "@tinycloud/sdk-services/internal/decrypt-transport-response-error";
1147
1153
  function encOk(data) {
1148
1154
  return { ok: true, data };
1149
1155
  }
@@ -1162,17 +1168,20 @@ var EncryptionService = class extends BaseService {
1162
1168
  return this._config.crypto;
1163
1169
  }
1164
1170
  async discoverNetwork(identifier, ownerDid) {
1171
+ this.assertActive();
1165
1172
  const result = await discoverNetwork({
1166
1173
  identifier,
1167
1174
  ...ownerDid !== void 0 ? { ownerDid } : {},
1168
1175
  ...this._config.node !== void 0 ? { node: this._config.node } : {},
1169
1176
  ...this._config.wellKnown !== void 0 ? { wellKnown: this._config.wellKnown } : {}
1170
1177
  });
1178
+ this.assertActive();
1171
1179
  if (!result.ok) return result;
1172
1180
  return encOk(result.data.descriptor);
1173
1181
  }
1174
1182
  async encryptToNetwork(networkId, plaintext, options) {
1175
1183
  try {
1184
+ this.assertActive();
1176
1185
  const discovered = await this.discoverNetwork(networkId);
1177
1186
  if (!discovered.ok) return discovered;
1178
1187
  const usable = ensureNetworkUsableForDecrypt(discovered.data);
@@ -1200,6 +1209,7 @@ var EncryptionService = class extends BaseService {
1200
1209
  }
1201
1210
  async decryptEnvelope(envelope, capabilityProof, options) {
1202
1211
  try {
1212
+ this.assertActive();
1203
1213
  const validated = validateEnvelope(this.crypto, envelope);
1204
1214
  if (!validated.ok) return validated;
1205
1215
  if (options?.aad !== void 0 && validated.data.aad !== base64Encode(options.aad)) {
@@ -1265,16 +1275,38 @@ var EncryptionService = class extends BaseService {
1265
1275
  facts,
1266
1276
  proof: capabilityProof
1267
1277
  });
1268
- if (!built.ok) return built;
1278
+ this.assertActive();
1279
+ if (!built.ok) {
1280
+ if (built.error.code !== "TRANSPORT_ERROR") return built;
1281
+ return encErr(
1282
+ encryptionError({
1283
+ code: "INVALID_INPUT",
1284
+ message: "Unable to build decrypt request"
1285
+ })
1286
+ );
1287
+ }
1269
1288
  let response;
1270
1289
  try {
1271
1290
  response = await this._config.transport.postDecrypt({
1272
1291
  targetNode,
1273
1292
  networkId: envelope.networkId,
1274
1293
  authorization: built.data.authorization,
1275
- canonicalBody: built.data.canonicalBody
1294
+ canonicalBody: built.data.canonicalBody,
1295
+ signal: this.abortSignal
1276
1296
  });
1297
+ this.assertActive();
1277
1298
  } catch (error) {
1299
+ if (error instanceof DecryptTransportResponseError) {
1300
+ return encErr(
1301
+ encryptionError(
1302
+ error.status === 401 || error.status === 403 ? {
1303
+ code: "DECRYPT_DENIED",
1304
+ message: "Node denied decrypt request",
1305
+ ...error.permissionHint === void 0 ? {} : { permissionHint: error.permissionHint }
1306
+ } : { code: "INVALID_RESPONSE", message: "Node decrypt request failed" }
1307
+ )
1308
+ );
1309
+ }
1278
1310
  return encErr(
1279
1311
  encryptionError({
1280
1312
  code: "TRANSPORT_ERROR",
@@ -1305,20 +1337,27 @@ var EncryptionService = class extends BaseService {
1305
1337
  } catch (error) {
1306
1338
  return encErr(
1307
1339
  encryptionError({
1308
- code: "TRANSPORT_ERROR",
1309
- cause: toError(error)
1340
+ code: "INVALID_RESPONSE",
1341
+ message: "Local decryption failed"
1310
1342
  })
1311
1343
  );
1312
1344
  }
1313
1345
  }
1346
+ assertActive() {
1347
+ this._config.assertActive?.();
1348
+ }
1314
1349
  };
1315
1350
  EncryptionService.serviceName = "encryption";
1351
+
1352
+ // src/encryption/index.ts
1353
+ import { DecryptTransportResponseError as DecryptTransportResponseError3 } from "@tinycloud/sdk-services/internal/decrypt-transport-response-error";
1316
1354
  export {
1317
1355
  DECRYPT_ACTION,
1318
1356
  DECRYPT_FACT_TYPE,
1319
1357
  DECRYPT_RESULT_TYPE,
1320
1358
  DEFAULT_ENCRYPTION_ALG,
1321
1359
  DEFAULT_KEY_VERSION,
1360
+ DecryptTransportResponseError3 as DecryptTransportResponseError,
1322
1361
  ENCRYPTION_NETWORK_URN_PREFIX,
1323
1362
  ENCRYPTION_SERVICE,
1324
1363
  ENCRYPTION_SERVICE_SHORT,