@tinycloud/sdk-services 2.7.0-beta.3 → 2.7.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.
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-C-EsEeGo.d.cts → types-DAY1O1kW.d.cts} +12 -156
  34. package/dist/{BaseService-C-EsEeGo.d.ts → types-DAY1O1kW.d.ts} +12 -156
  35. package/package.json +11 -3
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/encryption/DecryptTransportResponseError.ts
21
+ var DecryptTransportResponseError_exports = {};
22
+ __export(DecryptTransportResponseError_exports, {
23
+ DecryptTransportResponseError: () => DecryptTransportResponseError
24
+ });
25
+ module.exports = __toCommonJS(DecryptTransportResponseError_exports);
26
+ var DecryptTransportResponseError = class extends Error {
27
+ constructor(status, permissionHint) {
28
+ super("Node decrypt request failed");
29
+ this.status = status;
30
+ this.permissionHint = permissionHint;
31
+ this.name = "DecryptTransportResponseError";
32
+ }
33
+ };
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ DecryptTransportResponseError
37
+ });
38
+ //# sourceMappingURL=decrypt-transport-response-error.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/encryption/DecryptTransportResponseError.ts"],"sourcesContent":["import type { PermissionHint } from \"../types\";\n\n/** A reachable node returned an HTTP failure for a decrypt request. */\nexport class DecryptTransportResponseError extends Error {\n constructor(readonly status: number, readonly permissionHint?: PermissionHint) {\n super(\"Node decrypt request failed\");\n this.name = \"DecryptTransportResponseError\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAM,gCAAN,cAA4C,MAAM;AAAA,EACvD,YAAqB,QAAyB,gBAAiC;AAC7E,UAAM,6BAA6B;AADhB;AAAyB;AAE5C,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
@@ -0,0 +1,10 @@
1
+ import { P as PermissionHint } from '../types-DAY1O1kW.cjs';
2
+
3
+ /** A reachable node returned an HTTP failure for a decrypt request. */
4
+ declare class DecryptTransportResponseError extends Error {
5
+ readonly status: number;
6
+ readonly permissionHint?: PermissionHint | undefined;
7
+ constructor(status: number, permissionHint?: PermissionHint | undefined);
8
+ }
9
+
10
+ export { DecryptTransportResponseError };
@@ -0,0 +1,10 @@
1
+ import { P as PermissionHint } from '../types-DAY1O1kW.js';
2
+
3
+ /** A reachable node returned an HTTP failure for a decrypt request. */
4
+ declare class DecryptTransportResponseError extends Error {
5
+ readonly status: number;
6
+ readonly permissionHint?: PermissionHint | undefined;
7
+ constructor(status: number, permissionHint?: PermissionHint | undefined);
8
+ }
9
+
10
+ export { DecryptTransportResponseError };
@@ -0,0 +1,13 @@
1
+ // src/encryption/DecryptTransportResponseError.ts
2
+ var DecryptTransportResponseError = class extends Error {
3
+ constructor(status, permissionHint) {
4
+ super("Node decrypt request failed");
5
+ this.status = status;
6
+ this.permissionHint = permissionHint;
7
+ this.name = "DecryptTransportResponseError";
8
+ }
9
+ };
10
+ export {
11
+ DecryptTransportResponseError
12
+ };
13
+ //# sourceMappingURL=decrypt-transport-response-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/encryption/DecryptTransportResponseError.ts"],"sourcesContent":["import type { PermissionHint } from \"../types\";\n\n/** A reachable node returned an HTTP failure for a decrypt request. */\nexport class DecryptTransportResponseError extends Error {\n constructor(readonly status: number, readonly permissionHint?: PermissionHint) {\n super(\"Node decrypt request failed\");\n this.name = \"DecryptTransportResponseError\";\n }\n}\n"],"mappings":";AAGO,IAAM,gCAAN,cAA4C,MAAM;AAAA,EACvD,YAAqB,QAAyB,gBAAiC;AAC7E,UAAM,6BAA6B;AADhB;AAAyB;AAE5C,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
package/dist/kv/index.cjs CHANGED
@@ -97,6 +97,42 @@ function serviceError(code, message, service, options) {
97
97
  }
98
98
 
99
99
  // src/errors.ts
100
+ function parsePermissionHint(value) {
101
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
102
+ const candidate = value;
103
+ const keys = Object.keys(candidate).sort();
104
+ if (keys.some((key) => !["actions", "path", "service", "space"].includes(key))) return void 0;
105
+ if (candidate.service !== "tinycloud.kv" && candidate.service !== "tinycloud.encryption") return void 0;
106
+ if (typeof candidate.path !== "string" || candidate.path.length === 0 || candidate.path.includes("*")) return void 0;
107
+ if (candidate.service === "tinycloud.kv" && (typeof candidate.space !== "string" || candidate.space.length === 0 || !candidate.path.startsWith("vault/") || candidate.path.endsWith("/"))) {
108
+ return void 0;
109
+ }
110
+ if (candidate.service === "tinycloud.encryption" && (candidate.space !== void 0 || !candidate.path.startsWith("urn:tinycloud:encryption:") || candidate.path.endsWith(":"))) {
111
+ return void 0;
112
+ }
113
+ if (!Array.isArray(candidate.actions) || candidate.actions.length !== 1 || typeof candidate.actions[0] !== "string" || candidate.actions[0].includes("*")) return void 0;
114
+ const expectedAction = candidate.service === "tinycloud.kv" ? "tinycloud.kv/get" : "tinycloud.encryption/decrypt";
115
+ if (candidate.actions[0] !== expectedAction) return void 0;
116
+ const space = typeof candidate.space === "string" ? candidate.space : void 0;
117
+ return {
118
+ service: candidate.service,
119
+ ...space === void 0 ? {} : { space },
120
+ path: candidate.path,
121
+ actions: [candidate.actions[0]]
122
+ };
123
+ }
124
+ function parsePermissionHintFromErrorText(text) {
125
+ try {
126
+ const parsed = JSON.parse(text);
127
+ if (typeof parsed !== "object" || parsed === null) return void 0;
128
+ const root = parsed;
129
+ const nested = root.error;
130
+ const nestedRecord = typeof nested === "object" && nested !== null ? nested : void 0;
131
+ return parsePermissionHint(root.permissionHint) ?? parsePermissionHint(nestedRecord?.permissionHint);
132
+ } catch {
133
+ return void 0;
134
+ }
135
+ }
100
136
  function authRequiredError(service) {
101
137
  return {
102
138
  code: ErrorCodes.AUTH_REQUIRED,
@@ -215,7 +251,7 @@ var BaseService = class {
215
251
  * Combines the service-level abort with context-level abort.
216
252
  */
217
253
  get abortSignal() {
218
- return this.abortController.signal;
254
+ return this.combineSignals();
219
255
  }
220
256
  /**
221
257
  * Check if the service is authenticated.
@@ -331,7 +367,11 @@ var BaseService = class {
331
367
  */
332
368
  combineSignals(...signals) {
333
369
  const controller = new AbortController();
334
- const allSignals = [this.abortSignal, ...signals.filter(Boolean)];
370
+ const allSignals = [
371
+ this.abortController.signal,
372
+ this.context?.abortSignal,
373
+ ...signals.filter(Boolean)
374
+ ].filter(Boolean);
335
375
  for (const signal of allSignals) {
336
376
  if (signal.aborted) {
337
377
  controller.abort(signal.reason);
@@ -804,13 +844,15 @@ var KVService = class extends BaseService {
804
844
  options?.signal
805
845
  );
806
846
  if (!response.ok) {
807
- if (response.status === 401) {
847
+ if (response.status === 401 || response.status === 403) {
808
848
  const errorText2 = await response.text();
809
849
  const { resource, action } = parseAuthError(errorText2);
850
+ const permissionHint = parsePermissionHintFromErrorText(errorText2);
810
851
  return err(authUnauthorizedError("kv", errorText2, {
811
852
  status: response.status,
812
853
  ...action && { requiredAction: action },
813
- ...resource && { resource }
854
+ ...resource && { resource },
855
+ ...permissionHint === void 0 ? {} : { permissionHint }
814
856
  }));
815
857
  }
816
858
  if (response.status === 404) {