@tinycloudlabs/sdk-core 1.0.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/LICENSE.md +320 -0
- package/dist/TinyCloud.d.ts +206 -0
- package/dist/TinyCloud.d.ts.map +1 -0
- package/dist/TinyCloud.js +244 -0
- package/dist/TinyCloud.js.map +1 -0
- package/dist/TinyCloud.schema.d.ts +173 -0
- package/dist/TinyCloud.schema.d.ts.map +1 -0
- package/dist/TinyCloud.schema.js +136 -0
- package/dist/TinyCloud.schema.js.map +1 -0
- package/dist/TinyCloud.schema.test.d.ts +5 -0
- package/dist/TinyCloud.schema.test.d.ts.map +1 -0
- package/dist/TinyCloud.schema.test.js +286 -0
- package/dist/TinyCloud.schema.test.js.map +1 -0
- package/dist/authorization/CapabilityKeyRegistry.d.ts +317 -0
- package/dist/authorization/CapabilityKeyRegistry.d.ts.map +1 -0
- package/dist/authorization/CapabilityKeyRegistry.js +509 -0
- package/dist/authorization/CapabilityKeyRegistry.js.map +1 -0
- package/dist/authorization/authorization.schema.d.ts +233 -0
- package/dist/authorization/authorization.schema.d.ts.map +1 -0
- package/dist/authorization/authorization.schema.js +220 -0
- package/dist/authorization/authorization.schema.js.map +1 -0
- package/dist/authorization/authorization.schema.test.d.ts +5 -0
- package/dist/authorization/authorization.schema.test.d.ts.map +1 -0
- package/dist/authorization/authorization.schema.test.js +618 -0
- package/dist/authorization/authorization.schema.test.js.map +1 -0
- package/dist/authorization/index.d.ts +38 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +52 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/spaceCreation.d.ts +96 -0
- package/dist/authorization/spaceCreation.d.ts.map +1 -0
- package/dist/authorization/spaceCreation.js +35 -0
- package/dist/authorization/spaceCreation.js.map +1 -0
- package/dist/authorization/spaceCreation.schema.d.ts +67 -0
- package/dist/authorization/spaceCreation.schema.d.ts.map +1 -0
- package/dist/authorization/spaceCreation.schema.js +95 -0
- package/dist/authorization/spaceCreation.schema.js.map +1 -0
- package/dist/authorization/spaceCreation.schema.test.d.ts +5 -0
- package/dist/authorization/spaceCreation.schema.test.d.ts.map +1 -0
- package/dist/authorization/spaceCreation.schema.test.js +168 -0
- package/dist/authorization/spaceCreation.schema.test.js.map +1 -0
- package/dist/authorization/strategies.d.ts +134 -0
- package/dist/authorization/strategies.d.ts.map +1 -0
- package/dist/authorization/strategies.js +15 -0
- package/dist/authorization/strategies.js.map +1 -0
- package/dist/authorization/strategies.schema.d.ts +185 -0
- package/dist/authorization/strategies.schema.d.ts.map +1 -0
- package/dist/authorization/strategies.schema.js +147 -0
- package/dist/authorization/strategies.schema.js.map +1 -0
- package/dist/authorization/strategies.schema.test.d.ts +5 -0
- package/dist/authorization/strategies.schema.test.d.ts.map +1 -0
- package/dist/authorization/strategies.schema.test.js +253 -0
- package/dist/authorization/strategies.schema.test.js.map +1 -0
- package/dist/delegations/DelegationManager.d.ts +164 -0
- package/dist/delegations/DelegationManager.d.ts.map +1 -0
- package/dist/delegations/DelegationManager.js +428 -0
- package/dist/delegations/DelegationManager.js.map +1 -0
- package/dist/delegations/SharingService.d.ts +279 -0
- package/dist/delegations/SharingService.d.ts.map +1 -0
- package/dist/delegations/SharingService.js +558 -0
- package/dist/delegations/SharingService.js.map +1 -0
- package/dist/delegations/SharingService.schema.d.ts +401 -0
- package/dist/delegations/SharingService.schema.d.ts.map +1 -0
- package/dist/delegations/SharingService.schema.js +211 -0
- package/dist/delegations/SharingService.schema.js.map +1 -0
- package/dist/delegations/index.d.ts +38 -0
- package/dist/delegations/index.d.ts.map +1 -0
- package/dist/delegations/index.js +42 -0
- package/dist/delegations/index.js.map +1 -0
- package/dist/delegations/types.d.ts +13 -0
- package/dist/delegations/types.d.ts.map +1 -0
- package/dist/delegations/types.js +42 -0
- package/dist/delegations/types.js.map +1 -0
- package/dist/delegations/types.schema.d.ts +1641 -0
- package/dist/delegations/types.schema.d.ts.map +1 -0
- package/dist/delegations/types.schema.js +535 -0
- package/dist/delegations/types.schema.js.map +1 -0
- package/dist/delegations/types.schema.test.d.ts +5 -0
- package/dist/delegations/types.schema.test.d.ts.map +1 -0
- package/dist/delegations/types.schema.test.js +627 -0
- package/dist/delegations/types.schema.test.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/json-schema.d.ts +327 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +703 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/json-schema.test.d.ts +7 -0
- package/dist/json-schema.test.d.ts.map +1 -0
- package/dist/json-schema.test.js +365 -0
- package/dist/json-schema.test.js.map +1 -0
- package/dist/signer.d.ts +28 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +2 -0
- package/dist/signer.js.map +1 -0
- package/dist/space.d.ts +53 -0
- package/dist/space.d.ts.map +1 -0
- package/dist/space.js +67 -0
- package/dist/space.js.map +1 -0
- package/dist/space.schema.d.ts +65 -0
- package/dist/space.schema.d.ts.map +1 -0
- package/dist/space.schema.js +65 -0
- package/dist/space.schema.js.map +1 -0
- package/dist/space.schema.test.d.ts +5 -0
- package/dist/space.schema.test.d.ts.map +1 -0
- package/dist/space.schema.test.js +148 -0
- package/dist/space.schema.test.js.map +1 -0
- package/dist/spaces/Space.d.ts +175 -0
- package/dist/spaces/Space.d.ts.map +1 -0
- package/dist/spaces/Space.js +84 -0
- package/dist/spaces/Space.js.map +1 -0
- package/dist/spaces/SpaceService.d.ts +271 -0
- package/dist/spaces/SpaceService.d.ts.map +1 -0
- package/dist/spaces/SpaceService.js +715 -0
- package/dist/spaces/SpaceService.js.map +1 -0
- package/dist/spaces/index.d.ts +11 -0
- package/dist/spaces/index.d.ts.map +1 -0
- package/dist/spaces/index.js +20 -0
- package/dist/spaces/index.js.map +1 -0
- package/dist/spaces/spaces.schema.d.ts +421 -0
- package/dist/spaces/spaces.schema.d.ts.map +1 -0
- package/dist/spaces/spaces.schema.js +342 -0
- package/dist/spaces/spaces.schema.js.map +1 -0
- package/dist/spaces/spaces.schema.test.d.ts +5 -0
- package/dist/spaces/spaces.schema.test.d.ts.map +1 -0
- package/dist/spaces/spaces.schema.test.js +471 -0
- package/dist/spaces/spaces.schema.test.js.map +1 -0
- package/dist/storage.d.ts +47 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +14 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.schema.d.ts +277 -0
- package/dist/storage.schema.d.ts.map +1 -0
- package/dist/storage.schema.js +185 -0
- package/dist/storage.schema.js.map +1 -0
- package/dist/storage.schema.test.d.ts +5 -0
- package/dist/storage.schema.test.d.ts.map +1 -0
- package/dist/storage.schema.test.js +346 -0
- package/dist/storage.schema.test.js.map +1 -0
- package/dist/userAuthorization.d.ts +99 -0
- package/dist/userAuthorization.d.ts.map +1 -0
- package/dist/userAuthorization.js +3 -0
- package/dist/userAuthorization.js.map +1 -0
- package/dist/userAuthorization.schema.d.ts +259 -0
- package/dist/userAuthorization.schema.d.ts.map +1 -0
- package/dist/userAuthorization.schema.js +175 -0
- package/dist/userAuthorization.schema.js.map +1 -0
- package/dist/userAuthorization.schema.test.d.ts +5 -0
- package/dist/userAuthorization.schema.test.d.ts.map +1 -0
- package/dist/userAuthorization.schema.test.js +356 -0
- package/dist/userAuthorization.schema.test.js.map +1 -0
- package/dist/version.d.ts +30 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +54 -0
- package/dist/version.js.map +1 -0
- package/dist/wasm-validation.d.ts +287 -0
- package/dist/wasm-validation.d.ts.map +1 -0
- package/dist/wasm-validation.js +219 -0
- package/dist/wasm-validation.js.map +1 -0
- package/dist/wasm-validation.test.d.ts +5 -0
- package/dist/wasm-validation.test.d.ts.map +1 -0
- package/dist/wasm-validation.test.js +233 -0
- package/dist/wasm-validation.test.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for TinyCloud configuration schemas.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "bun:test";
|
|
5
|
+
import { BackoffStrategySchema, RetryPolicySchema, PartialRetryPolicySchema, TinyCloudConfigSchema, validateTinyCloudConfig, validateRetryPolicy, } from "./TinyCloud.schema";
|
|
6
|
+
describe("BackoffStrategySchema", () => {
|
|
7
|
+
it("should accept valid backoff strategies", () => {
|
|
8
|
+
expect(BackoffStrategySchema.safeParse("none").success).toBe(true);
|
|
9
|
+
expect(BackoffStrategySchema.safeParse("linear").success).toBe(true);
|
|
10
|
+
expect(BackoffStrategySchema.safeParse("exponential").success).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
it("should reject invalid backoff strategies", () => {
|
|
13
|
+
expect(BackoffStrategySchema.safeParse("invalid").success).toBe(false);
|
|
14
|
+
expect(BackoffStrategySchema.safeParse("").success).toBe(false);
|
|
15
|
+
expect(BackoffStrategySchema.safeParse(123).success).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe("RetryPolicySchema", () => {
|
|
19
|
+
const validPolicy = {
|
|
20
|
+
maxAttempts: 3,
|
|
21
|
+
backoff: "exponential",
|
|
22
|
+
baseDelayMs: 1000,
|
|
23
|
+
maxDelayMs: 10000,
|
|
24
|
+
retryableErrors: ["NETWORK_ERROR", "TIMEOUT"],
|
|
25
|
+
};
|
|
26
|
+
it("should accept valid retry policy", () => {
|
|
27
|
+
const result = RetryPolicySchema.safeParse(validPolicy);
|
|
28
|
+
expect(result.success).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it("should accept zero delays", () => {
|
|
31
|
+
const result = RetryPolicySchema.safeParse({
|
|
32
|
+
...validPolicy,
|
|
33
|
+
baseDelayMs: 0,
|
|
34
|
+
maxDelayMs: 0,
|
|
35
|
+
});
|
|
36
|
+
expect(result.success).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it("should accept empty retryableErrors array", () => {
|
|
39
|
+
const result = RetryPolicySchema.safeParse({
|
|
40
|
+
...validPolicy,
|
|
41
|
+
retryableErrors: [],
|
|
42
|
+
});
|
|
43
|
+
expect(result.success).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it("should reject negative maxAttempts", () => {
|
|
46
|
+
const result = RetryPolicySchema.safeParse({
|
|
47
|
+
...validPolicy,
|
|
48
|
+
maxAttempts: -1,
|
|
49
|
+
});
|
|
50
|
+
expect(result.success).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
it("should reject zero maxAttempts", () => {
|
|
53
|
+
const result = RetryPolicySchema.safeParse({
|
|
54
|
+
...validPolicy,
|
|
55
|
+
maxAttempts: 0,
|
|
56
|
+
});
|
|
57
|
+
expect(result.success).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
it("should reject non-integer maxAttempts", () => {
|
|
60
|
+
const result = RetryPolicySchema.safeParse({
|
|
61
|
+
...validPolicy,
|
|
62
|
+
maxAttempts: 1.5,
|
|
63
|
+
});
|
|
64
|
+
expect(result.success).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
it("should reject negative delays", () => {
|
|
67
|
+
const result = RetryPolicySchema.safeParse({
|
|
68
|
+
...validPolicy,
|
|
69
|
+
baseDelayMs: -1,
|
|
70
|
+
});
|
|
71
|
+
expect(result.success).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
it("should reject invalid backoff strategy", () => {
|
|
74
|
+
const result = RetryPolicySchema.safeParse({
|
|
75
|
+
...validPolicy,
|
|
76
|
+
backoff: "invalid",
|
|
77
|
+
});
|
|
78
|
+
expect(result.success).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
it("should reject missing required fields", () => {
|
|
81
|
+
expect(RetryPolicySchema.safeParse({}).success).toBe(false);
|
|
82
|
+
expect(RetryPolicySchema.safeParse({ maxAttempts: 3 }).success).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("PartialRetryPolicySchema", () => {
|
|
86
|
+
it("should accept empty object", () => {
|
|
87
|
+
const result = PartialRetryPolicySchema.safeParse({});
|
|
88
|
+
expect(result.success).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it("should accept partial policy", () => {
|
|
91
|
+
const result = PartialRetryPolicySchema.safeParse({
|
|
92
|
+
maxAttempts: 5,
|
|
93
|
+
});
|
|
94
|
+
expect(result.success).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it("should accept full policy", () => {
|
|
97
|
+
const result = PartialRetryPolicySchema.safeParse({
|
|
98
|
+
maxAttempts: 3,
|
|
99
|
+
backoff: "exponential",
|
|
100
|
+
baseDelayMs: 1000,
|
|
101
|
+
maxDelayMs: 10000,
|
|
102
|
+
retryableErrors: ["NETWORK_ERROR"],
|
|
103
|
+
});
|
|
104
|
+
expect(result.success).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
it("should still validate values when present", () => {
|
|
107
|
+
const result = PartialRetryPolicySchema.safeParse({
|
|
108
|
+
maxAttempts: -1,
|
|
109
|
+
});
|
|
110
|
+
expect(result.success).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe("TinyCloudConfigSchema", () => {
|
|
114
|
+
it("should accept empty config", () => {
|
|
115
|
+
const result = TinyCloudConfigSchema.safeParse({});
|
|
116
|
+
expect(result.success).toBe(true);
|
|
117
|
+
});
|
|
118
|
+
it("should accept minimal config", () => {
|
|
119
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
120
|
+
hosts: ["https://node.tinycloud.xyz"],
|
|
121
|
+
});
|
|
122
|
+
expect(result.success).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it("should accept full config", () => {
|
|
125
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
126
|
+
resolveEns: true,
|
|
127
|
+
hosts: ["https://node.tinycloud.xyz"],
|
|
128
|
+
invoke: () => { },
|
|
129
|
+
fetch: () => { },
|
|
130
|
+
services: {
|
|
131
|
+
kv: class KVService {
|
|
132
|
+
},
|
|
133
|
+
custom: class CustomService {
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
serviceConfigs: {
|
|
137
|
+
kv: { prefix: "myapp" },
|
|
138
|
+
custom: { maxSize: 1000 },
|
|
139
|
+
},
|
|
140
|
+
retryPolicy: {
|
|
141
|
+
maxAttempts: 5,
|
|
142
|
+
backoff: "linear",
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
expect(result.success).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it("should accept resolveEns boolean", () => {
|
|
148
|
+
expect(TinyCloudConfigSchema.safeParse({ resolveEns: true }).success).toBe(true);
|
|
149
|
+
expect(TinyCloudConfigSchema.safeParse({ resolveEns: false }).success).toBe(true);
|
|
150
|
+
});
|
|
151
|
+
it("should reject non-boolean resolveEns", () => {
|
|
152
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
153
|
+
resolveEns: "true",
|
|
154
|
+
});
|
|
155
|
+
expect(result.success).toBe(false);
|
|
156
|
+
});
|
|
157
|
+
it("should accept hosts array", () => {
|
|
158
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
159
|
+
hosts: ["https://a.com", "https://b.com"],
|
|
160
|
+
});
|
|
161
|
+
expect(result.success).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
it("should reject non-array hosts", () => {
|
|
164
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
165
|
+
hosts: "https://node.tinycloud.xyz",
|
|
166
|
+
});
|
|
167
|
+
expect(result.success).toBe(false);
|
|
168
|
+
});
|
|
169
|
+
it("should accept function invoke", () => {
|
|
170
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
171
|
+
invoke: () => { },
|
|
172
|
+
});
|
|
173
|
+
expect(result.success).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
it("should accept async function invoke", () => {
|
|
176
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
177
|
+
invoke: async () => { },
|
|
178
|
+
});
|
|
179
|
+
expect(result.success).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
it("should reject non-function invoke", () => {
|
|
182
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
183
|
+
invoke: "not a function",
|
|
184
|
+
});
|
|
185
|
+
expect(result.success).toBe(false);
|
|
186
|
+
});
|
|
187
|
+
it("should accept function fetch", () => {
|
|
188
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
189
|
+
fetch: () => { },
|
|
190
|
+
});
|
|
191
|
+
expect(result.success).toBe(true);
|
|
192
|
+
});
|
|
193
|
+
it("should reject non-function fetch", () => {
|
|
194
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
195
|
+
fetch: "not a function",
|
|
196
|
+
});
|
|
197
|
+
expect(result.success).toBe(false);
|
|
198
|
+
});
|
|
199
|
+
it("should accept services record with constructors", () => {
|
|
200
|
+
class MyService {
|
|
201
|
+
}
|
|
202
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
203
|
+
services: { myService: MyService },
|
|
204
|
+
});
|
|
205
|
+
expect(result.success).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
it("should reject services with non-function values", () => {
|
|
208
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
209
|
+
services: { myService: "not a constructor" },
|
|
210
|
+
});
|
|
211
|
+
expect(result.success).toBe(false);
|
|
212
|
+
});
|
|
213
|
+
it("should accept serviceConfigs record", () => {
|
|
214
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
215
|
+
serviceConfigs: {
|
|
216
|
+
kv: { prefix: "test", nested: { deep: true } },
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
expect(result.success).toBe(true);
|
|
220
|
+
});
|
|
221
|
+
it("should accept partial retryPolicy", () => {
|
|
222
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
223
|
+
retryPolicy: { maxAttempts: 5 },
|
|
224
|
+
});
|
|
225
|
+
expect(result.success).toBe(true);
|
|
226
|
+
});
|
|
227
|
+
it("should reject invalid retryPolicy values", () => {
|
|
228
|
+
const result = TinyCloudConfigSchema.safeParse({
|
|
229
|
+
retryPolicy: { maxAttempts: -1 },
|
|
230
|
+
});
|
|
231
|
+
expect(result.success).toBe(false);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe("validateTinyCloudConfig", () => {
|
|
235
|
+
it("should return ok result for valid config", () => {
|
|
236
|
+
const result = validateTinyCloudConfig({
|
|
237
|
+
hosts: ["https://node.tinycloud.xyz"],
|
|
238
|
+
resolveEns: true,
|
|
239
|
+
});
|
|
240
|
+
expect(result.ok).toBe(true);
|
|
241
|
+
if (result.ok) {
|
|
242
|
+
expect(result.data.hosts).toEqual(["https://node.tinycloud.xyz"]);
|
|
243
|
+
expect(result.data.resolveEns).toBe(true);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
it("should return ok result for empty config", () => {
|
|
247
|
+
const result = validateTinyCloudConfig({});
|
|
248
|
+
expect(result.ok).toBe(true);
|
|
249
|
+
});
|
|
250
|
+
it("should return error result for invalid config", () => {
|
|
251
|
+
const result = validateTinyCloudConfig({
|
|
252
|
+
hosts: "not an array",
|
|
253
|
+
});
|
|
254
|
+
expect(result.ok).toBe(false);
|
|
255
|
+
if (!result.ok) {
|
|
256
|
+
expect(result.error.code).toBe("VALIDATION_ERROR");
|
|
257
|
+
expect(result.error.service).toBe("tinycloud");
|
|
258
|
+
expect(result.error.meta?.issues).toBeDefined();
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe("validateRetryPolicy", () => {
|
|
263
|
+
it("should return ok result for valid policy", () => {
|
|
264
|
+
const result = validateRetryPolicy({
|
|
265
|
+
maxAttempts: 3,
|
|
266
|
+
backoff: "exponential",
|
|
267
|
+
baseDelayMs: 1000,
|
|
268
|
+
maxDelayMs: 10000,
|
|
269
|
+
retryableErrors: ["NETWORK_ERROR"],
|
|
270
|
+
});
|
|
271
|
+
expect(result.ok).toBe(true);
|
|
272
|
+
if (result.ok) {
|
|
273
|
+
expect(result.data.maxAttempts).toBe(3);
|
|
274
|
+
expect(result.data.backoff).toBe("exponential");
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
it("should return error result for invalid policy", () => {
|
|
278
|
+
const result = validateRetryPolicy({});
|
|
279
|
+
expect(result.ok).toBe(false);
|
|
280
|
+
if (!result.ok) {
|
|
281
|
+
expect(result.error.code).toBe("VALIDATION_ERROR");
|
|
282
|
+
expect(result.error.service).toBe("tinycloud");
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
//# sourceMappingURL=TinyCloud.schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TinyCloud.schema.test.js","sourceRoot":"","sources":["../src/TinyCloud.schema.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CapabilityKeyRegistry - Tracks keys and their capabilities for automatic key selection.
|
|
3
|
+
*
|
|
4
|
+
* The registry maintains mappings between:
|
|
5
|
+
* - Keys and their associated delegations
|
|
6
|
+
* - Capabilities (resource/action pairs) and the keys that can exercise them
|
|
7
|
+
*
|
|
8
|
+
* This enables automatic key selection when performing operations, choosing
|
|
9
|
+
* the most appropriate key based on priority and validity.
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import type { Result, ServiceError } from "@tinycloudlabs/sdk-services";
|
|
14
|
+
import type { KeyInfo, CapabilityEntry, Delegation, IngestOptions } from "../delegations/types";
|
|
15
|
+
/**
|
|
16
|
+
* Error codes specific to CapabilityKeyRegistry operations.
|
|
17
|
+
*/
|
|
18
|
+
export declare const CapabilityKeyRegistryErrorCodes: {
|
|
19
|
+
/** Key not found in registry */
|
|
20
|
+
readonly KEY_NOT_FOUND: "KEY_NOT_FOUND";
|
|
21
|
+
/** No key available for the requested capability */
|
|
22
|
+
readonly NO_CAPABLE_KEY: "NO_CAPABLE_KEY";
|
|
23
|
+
/** Delegation has expired */
|
|
24
|
+
readonly DELEGATION_EXPIRED: "DELEGATION_EXPIRED";
|
|
25
|
+
/** Delegation has been revoked */
|
|
26
|
+
readonly DELEGATION_REVOKED: "DELEGATION_REVOKED";
|
|
27
|
+
/** Invalid delegation data */
|
|
28
|
+
readonly INVALID_DELEGATION: "INVALID_DELEGATION";
|
|
29
|
+
/** Key already registered */
|
|
30
|
+
readonly KEY_EXISTS: "KEY_EXISTS";
|
|
31
|
+
};
|
|
32
|
+
export type CapabilityKeyRegistryErrorCode = (typeof CapabilityKeyRegistryErrorCodes)[keyof typeof CapabilityKeyRegistryErrorCodes];
|
|
33
|
+
/**
|
|
34
|
+
* Stored delegation with chain information.
|
|
35
|
+
*/
|
|
36
|
+
export interface StoredDelegationChain {
|
|
37
|
+
/** The delegation itself */
|
|
38
|
+
delegation: Delegation;
|
|
39
|
+
/** Parent delegation CID if this is a sub-delegation */
|
|
40
|
+
parentCid?: string;
|
|
41
|
+
/** Key ID used to sign/exercise this delegation */
|
|
42
|
+
keyId: string;
|
|
43
|
+
/** When this was stored */
|
|
44
|
+
storedAt: Date;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Interface for the CapabilityKeyRegistry.
|
|
48
|
+
*
|
|
49
|
+
* Tracks keys and their capabilities for automatic key selection.
|
|
50
|
+
*/
|
|
51
|
+
export interface ICapabilityKeyRegistry {
|
|
52
|
+
/**
|
|
53
|
+
* Register a key with its associated delegations.
|
|
54
|
+
*
|
|
55
|
+
* @param key - Key information
|
|
56
|
+
* @param delegations - Delegations granted to this key
|
|
57
|
+
*/
|
|
58
|
+
registerKey(key: KeyInfo, delegations: Delegation[]): void;
|
|
59
|
+
/**
|
|
60
|
+
* Remove a key and all its associated delegations.
|
|
61
|
+
*
|
|
62
|
+
* @param keyId - The key ID to remove
|
|
63
|
+
*/
|
|
64
|
+
removeKey(keyId: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get a key that can exercise the specified capability.
|
|
67
|
+
*
|
|
68
|
+
* Uses the key selection algorithm:
|
|
69
|
+
* 1. Filter keys that have the required capability
|
|
70
|
+
* 2. Check delegation validity (not expired, not revoked)
|
|
71
|
+
* 3. Sort by priority (session=0, main=1, ingested=2)
|
|
72
|
+
* 4. Return highest priority valid key
|
|
73
|
+
*
|
|
74
|
+
* @param resource - Resource URI (e.g., "tinycloud://space-id/kv/my-data")
|
|
75
|
+
* @param action - Action to perform (e.g., "tinycloud.kv/get")
|
|
76
|
+
* @returns The best matching key, or null if none available
|
|
77
|
+
*/
|
|
78
|
+
getKeyForCapability(resource: string, action: string): KeyInfo | null;
|
|
79
|
+
/**
|
|
80
|
+
* Get all registered capabilities.
|
|
81
|
+
*
|
|
82
|
+
* @returns All capability entries in the registry
|
|
83
|
+
*/
|
|
84
|
+
getAllCapabilities(): CapabilityEntry[];
|
|
85
|
+
/**
|
|
86
|
+
* Get all delegations for a specific key.
|
|
87
|
+
*
|
|
88
|
+
* @param keyId - The key ID
|
|
89
|
+
* @returns Array of delegations for this key
|
|
90
|
+
*/
|
|
91
|
+
getDelegationsForKey(keyId: string): Delegation[];
|
|
92
|
+
/**
|
|
93
|
+
* Ingest a key and delegation from an external source (e.g., sharing link).
|
|
94
|
+
*
|
|
95
|
+
* @param key - Key information to ingest
|
|
96
|
+
* @param delegation - Delegation to associate with the key
|
|
97
|
+
* @param options - Ingestion options
|
|
98
|
+
*/
|
|
99
|
+
ingestKey(key: KeyInfo, delegation: Delegation, options?: IngestOptions): void;
|
|
100
|
+
/**
|
|
101
|
+
* Check if a delegation is currently valid.
|
|
102
|
+
*
|
|
103
|
+
* @param delegation - The delegation to check
|
|
104
|
+
* @returns true if valid, false if expired or revoked
|
|
105
|
+
*/
|
|
106
|
+
isDelegationValid(delegation: Delegation): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Get a key by its ID.
|
|
109
|
+
*
|
|
110
|
+
* @param keyId - The key ID
|
|
111
|
+
* @returns The key info, or undefined if not found
|
|
112
|
+
*/
|
|
113
|
+
getKey(keyId: string): KeyInfo | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* Get all registered keys.
|
|
116
|
+
*
|
|
117
|
+
* @returns Array of all registered keys
|
|
118
|
+
*/
|
|
119
|
+
getAllKeys(): KeyInfo[];
|
|
120
|
+
/**
|
|
121
|
+
* Clear all registered keys and delegations.
|
|
122
|
+
*/
|
|
123
|
+
clear(): void;
|
|
124
|
+
/**
|
|
125
|
+
* Revoke a delegation by CID.
|
|
126
|
+
*
|
|
127
|
+
* @param cid - The delegation CID to revoke
|
|
128
|
+
* @returns Result indicating success or failure
|
|
129
|
+
*/
|
|
130
|
+
revokeDelegation(cid: string): Result<void, ServiceError>;
|
|
131
|
+
/**
|
|
132
|
+
* Find capabilities that match a resource path pattern.
|
|
133
|
+
*
|
|
134
|
+
* @param resourcePattern - Resource pattern (supports wildcards)
|
|
135
|
+
* @param action - Optional action filter
|
|
136
|
+
* @returns Matching capability entries
|
|
137
|
+
*/
|
|
138
|
+
findCapabilities(resourcePattern: string, action?: string): CapabilityEntry[];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* CapabilityKeyRegistry - Tracks keys and their capabilities for automatic key selection.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* const registry = new CapabilityKeyRegistry();
|
|
146
|
+
*
|
|
147
|
+
* // Register a session key with its delegations
|
|
148
|
+
* registry.registerKey(sessionKey, [rootDelegation]);
|
|
149
|
+
*
|
|
150
|
+
* // Get the best key for an operation
|
|
151
|
+
* const key = registry.getKeyForCapability(
|
|
152
|
+
* "tinycloud://my-space/kv/data",
|
|
153
|
+
* "tinycloud.kv/get"
|
|
154
|
+
* );
|
|
155
|
+
*
|
|
156
|
+
* if (key) {
|
|
157
|
+
* // Use this key for the operation
|
|
158
|
+
* console.log("Using key:", key.id);
|
|
159
|
+
* }
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export declare class CapabilityKeyRegistry implements ICapabilityKeyRegistry {
|
|
163
|
+
/**
|
|
164
|
+
* Registry of all keys indexed by ID.
|
|
165
|
+
*/
|
|
166
|
+
private keys;
|
|
167
|
+
/**
|
|
168
|
+
* Delegation storage.
|
|
169
|
+
*/
|
|
170
|
+
private store;
|
|
171
|
+
/**
|
|
172
|
+
* Register a key with its associated delegations.
|
|
173
|
+
*
|
|
174
|
+
* @param key - Key information
|
|
175
|
+
* @param delegations - Delegations granted to this key
|
|
176
|
+
*/
|
|
177
|
+
registerKey(key: KeyInfo, delegations: Delegation[]): void;
|
|
178
|
+
/**
|
|
179
|
+
* Remove a key and all its associated delegations.
|
|
180
|
+
*
|
|
181
|
+
* @param keyId - The key ID to remove
|
|
182
|
+
*/
|
|
183
|
+
removeKey(keyId: string): void;
|
|
184
|
+
/**
|
|
185
|
+
* Get a key that can exercise the specified capability.
|
|
186
|
+
*
|
|
187
|
+
* Key selection algorithm:
|
|
188
|
+
* 1. Filter keys that have the required capability
|
|
189
|
+
* 2. Check delegation validity (not expired, not revoked)
|
|
190
|
+
* 3. Sort by priority (session=0, main=1, ingested=2)
|
|
191
|
+
* 4. Return highest priority valid key
|
|
192
|
+
*
|
|
193
|
+
* @param resource - Resource URI
|
|
194
|
+
* @param action - Action to perform
|
|
195
|
+
* @returns The best matching key, or null if none available
|
|
196
|
+
*/
|
|
197
|
+
getKeyForCapability(resource: string, action: string): KeyInfo | null;
|
|
198
|
+
/**
|
|
199
|
+
* Get all registered capabilities.
|
|
200
|
+
*
|
|
201
|
+
* @returns All capability entries in the registry
|
|
202
|
+
*/
|
|
203
|
+
getAllCapabilities(): CapabilityEntry[];
|
|
204
|
+
/**
|
|
205
|
+
* Get all delegations for a specific key.
|
|
206
|
+
*
|
|
207
|
+
* @param keyId - The key ID
|
|
208
|
+
* @returns Array of delegations for this key
|
|
209
|
+
*/
|
|
210
|
+
getDelegationsForKey(keyId: string): Delegation[];
|
|
211
|
+
/**
|
|
212
|
+
* Ingest a key and delegation from an external source.
|
|
213
|
+
*
|
|
214
|
+
* @param key - Key information to ingest
|
|
215
|
+
* @param delegation - Delegation to associate with the key
|
|
216
|
+
* @param options - Ingestion options
|
|
217
|
+
*/
|
|
218
|
+
ingestKey(key: KeyInfo, delegation: Delegation, options?: IngestOptions): void;
|
|
219
|
+
/**
|
|
220
|
+
* Check if a delegation is currently valid.
|
|
221
|
+
*
|
|
222
|
+
* @param delegation - The delegation to check
|
|
223
|
+
* @returns true if valid, false if expired or revoked
|
|
224
|
+
*/
|
|
225
|
+
isDelegationValid(delegation: Delegation): boolean;
|
|
226
|
+
/**
|
|
227
|
+
* Get a key by its ID.
|
|
228
|
+
*
|
|
229
|
+
* @param keyId - The key ID
|
|
230
|
+
* @returns The key info, or undefined if not found
|
|
231
|
+
*/
|
|
232
|
+
getKey(keyId: string): KeyInfo | undefined;
|
|
233
|
+
/**
|
|
234
|
+
* Get all registered keys.
|
|
235
|
+
*
|
|
236
|
+
* @returns Array of all registered keys
|
|
237
|
+
*/
|
|
238
|
+
getAllKeys(): KeyInfo[];
|
|
239
|
+
/**
|
|
240
|
+
* Clear all registered keys and delegations.
|
|
241
|
+
*/
|
|
242
|
+
clear(): void;
|
|
243
|
+
/**
|
|
244
|
+
* Revoke a delegation by CID.
|
|
245
|
+
*
|
|
246
|
+
* @param cid - The delegation CID to revoke
|
|
247
|
+
* @returns Result indicating success or failure
|
|
248
|
+
*/
|
|
249
|
+
revokeDelegation(cid: string): Result<void, ServiceError>;
|
|
250
|
+
/**
|
|
251
|
+
* Find capabilities that match a resource path pattern.
|
|
252
|
+
*
|
|
253
|
+
* @param resourcePattern - Resource pattern (supports wildcards)
|
|
254
|
+
* @param action - Optional action filter
|
|
255
|
+
* @returns Matching capability entries
|
|
256
|
+
*/
|
|
257
|
+
findCapabilities(resourcePattern: string, action?: string): CapabilityEntry[];
|
|
258
|
+
/**
|
|
259
|
+
* Add a delegation to the store.
|
|
260
|
+
*
|
|
261
|
+
* @param key - The key associated with this delegation
|
|
262
|
+
* @param delegation - The delegation to add
|
|
263
|
+
*/
|
|
264
|
+
private addDelegation;
|
|
265
|
+
/**
|
|
266
|
+
* Create a capability key for indexing.
|
|
267
|
+
*
|
|
268
|
+
* @param resource - Resource path
|
|
269
|
+
* @param action - Action
|
|
270
|
+
* @returns Combined key string
|
|
271
|
+
*/
|
|
272
|
+
private makeCapabilityKey;
|
|
273
|
+
/**
|
|
274
|
+
* Find capability entries that match a resource and action.
|
|
275
|
+
*
|
|
276
|
+
* @param resource - Resource to match
|
|
277
|
+
* @param action - Action to match
|
|
278
|
+
* @returns Matching entries
|
|
279
|
+
*/
|
|
280
|
+
private findMatchingEntries;
|
|
281
|
+
/**
|
|
282
|
+
* Check if an action pattern matches a specific action.
|
|
283
|
+
*
|
|
284
|
+
* @param pattern - Action pattern (may include wildcard like "tinycloud.kv/*")
|
|
285
|
+
* @param action - Specific action to check
|
|
286
|
+
* @returns true if pattern matches action
|
|
287
|
+
*/
|
|
288
|
+
private actionMatches;
|
|
289
|
+
/**
|
|
290
|
+
* Check if a resource matches a pattern.
|
|
291
|
+
*
|
|
292
|
+
* Patterns support:
|
|
293
|
+
* - Exact match: "/kv/data" matches "/kv/data"
|
|
294
|
+
* - Wildcard suffix: "/kv/*" matches "/kv/anything"
|
|
295
|
+
* - Double wildcard: "/kv/**" matches "/kv/any/nested/path"
|
|
296
|
+
*
|
|
297
|
+
* @param resource - The specific resource being accessed
|
|
298
|
+
* @param pattern - The pattern from the delegation
|
|
299
|
+
* @returns true if resource matches pattern
|
|
300
|
+
*/
|
|
301
|
+
private resourceMatchesPattern;
|
|
302
|
+
/**
|
|
303
|
+
* Check if a specific resource matches a resource pattern for searching.
|
|
304
|
+
*
|
|
305
|
+
* @param entryResource - The resource from a capability entry
|
|
306
|
+
* @param searchPattern - The pattern to search for
|
|
307
|
+
* @returns true if entry resource matches search pattern
|
|
308
|
+
*/
|
|
309
|
+
private matchesResourcePattern;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Create a new CapabilityKeyRegistry instance.
|
|
313
|
+
*
|
|
314
|
+
* @returns A new registry instance
|
|
315
|
+
*/
|
|
316
|
+
export declare function createCapabilityKeyRegistry(): ICapabilityKeyRegistry;
|
|
317
|
+
//# sourceMappingURL=CapabilityKeyRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapabilityKeyRegistry.d.ts","sourceRoot":"","sources":["../../src/authorization/CapabilityKeyRegistry.ts"],"names":[],"mappings":"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"}
|