@blimu/backend 1.1.0 → 1.1.3

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 (145) hide show
  1. package/README.md +6 -13
  2. package/dist/__tests__/token-verifier.test.cjs +17662 -0
  3. package/dist/__tests__/token-verifier.test.cjs.map +1 -0
  4. package/dist/__tests__/token-verifier.test.d.mts +2 -0
  5. package/dist/__tests__/token-verifier.test.d.ts +2 -0
  6. package/dist/__tests__/token-verifier.test.mjs +17661 -0
  7. package/dist/__tests__/token-verifier.test.mjs.map +1 -0
  8. package/dist/auth-strategies.cjs +42 -0
  9. package/dist/auth-strategies.cjs.map +1 -0
  10. package/dist/auth-strategies.d.mts +16 -0
  11. package/dist/auth-strategies.d.ts +16 -0
  12. package/dist/auth-strategies.mjs +17 -0
  13. package/dist/auth-strategies.mjs.map +1 -0
  14. package/dist/client.cjs +483 -0
  15. package/dist/client.cjs.map +1 -0
  16. package/dist/client.d.mts +26 -18
  17. package/dist/client.d.ts +26 -18
  18. package/dist/client.mjs +447 -39
  19. package/dist/client.mjs.map +1 -1
  20. package/dist/{main.js → index.cjs} +294 -399
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.mts +15 -33
  23. package/dist/index.d.ts +15 -33
  24. package/dist/index.mjs +440 -330
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/{schema-B1usIXCr.d.mts → schema-BbKn_i-U.d.mts} +82 -93
  27. package/dist/{schema-B1usIXCr.d.ts → schema-BbKn_i-U.d.ts} +82 -93
  28. package/dist/{schema.js → schema.cjs} +2 -1
  29. package/dist/schema.cjs.map +1 -0
  30. package/dist/schema.d.mts +1 -2
  31. package/dist/schema.d.ts +1 -2
  32. package/dist/{schema.zod-CRNAHxbc.d.mts → schema.zod-DtXVS-1g.d.mts} +38 -48
  33. package/dist/{schema.zod-CRNAHxbc.d.ts → schema.zod-DtXVS-1g.d.ts} +38 -48
  34. package/dist/{schema.zod.js → schema.zod.cjs} +175 -248
  35. package/dist/schema.zod.cjs.map +1 -0
  36. package/dist/schema.zod.d.mts +1 -1
  37. package/dist/schema.zod.d.ts +1 -1
  38. package/dist/schema.zod.mjs +173 -242
  39. package/dist/schema.zod.mjs.map +1 -1
  40. package/dist/services/{bulk_resources.js → bulk_resources.cjs} +4 -2
  41. package/dist/services/bulk_resources.cjs.map +1 -0
  42. package/dist/services/bulk_resources.d.mts +4 -6
  43. package/dist/services/bulk_resources.d.ts +4 -6
  44. package/dist/services/bulk_resources.mjs +2 -1
  45. package/dist/services/bulk_resources.mjs.map +1 -1
  46. package/dist/services/{bulk_roles.js → bulk_roles.cjs} +4 -2
  47. package/dist/services/bulk_roles.cjs.map +1 -0
  48. package/dist/services/bulk_roles.d.mts +3 -5
  49. package/dist/services/bulk_roles.d.ts +3 -5
  50. package/dist/services/bulk_roles.mjs +2 -1
  51. package/dist/services/bulk_roles.mjs.map +1 -1
  52. package/dist/services/{entitlements.js → entitlements.cjs} +6 -4
  53. package/dist/services/entitlements.cjs.map +1 -0
  54. package/dist/services/entitlements.d.mts +4 -6
  55. package/dist/services/entitlements.d.ts +4 -6
  56. package/dist/services/entitlements.mjs +4 -3
  57. package/dist/services/entitlements.mjs.map +1 -1
  58. package/dist/services/{plans.js → plans.cjs} +6 -4
  59. package/dist/services/plans.cjs.map +1 -0
  60. package/dist/services/plans.d.mts +6 -8
  61. package/dist/services/plans.d.ts +6 -8
  62. package/dist/services/plans.mjs +4 -3
  63. package/dist/services/plans.mjs.map +1 -1
  64. package/dist/services/{resource_members.js → resource_members.cjs} +4 -2
  65. package/dist/services/resource_members.cjs.map +1 -0
  66. package/dist/services/resource_members.d.mts +4 -6
  67. package/dist/services/resource_members.d.ts +4 -6
  68. package/dist/services/resource_members.mjs +2 -1
  69. package/dist/services/resource_members.mjs.map +1 -1
  70. package/dist/services/{resources.js → resources.cjs} +8 -6
  71. package/dist/services/resources.cjs.map +1 -0
  72. package/dist/services/resources.d.mts +8 -10
  73. package/dist/services/resources.d.ts +8 -10
  74. package/dist/services/resources.mjs +6 -5
  75. package/dist/services/resources.mjs.map +1 -1
  76. package/dist/services/{roles.js → roles.cjs} +6 -4
  77. package/dist/services/roles.cjs.map +1 -0
  78. package/dist/services/roles.d.mts +4 -6
  79. package/dist/services/roles.d.ts +4 -6
  80. package/dist/services/roles.mjs +4 -3
  81. package/dist/services/roles.mjs.map +1 -1
  82. package/dist/services/{usage.js → usage.cjs} +8 -6
  83. package/dist/services/usage.cjs.map +1 -0
  84. package/dist/services/usage.d.mts +5 -7
  85. package/dist/services/usage.d.ts +5 -7
  86. package/dist/services/usage.mjs +6 -5
  87. package/dist/services/usage.mjs.map +1 -1
  88. package/dist/services/{users.js → users.cjs} +9 -7
  89. package/dist/services/users.cjs.map +1 -0
  90. package/dist/services/users.d.mts +3 -5
  91. package/dist/services/users.d.ts +3 -5
  92. package/dist/services/users.mjs +7 -6
  93. package/dist/services/users.mjs.map +1 -1
  94. package/dist/{token-verifier.js → token-verifier.cjs} +14 -31
  95. package/dist/token-verifier.cjs.map +1 -0
  96. package/dist/token-verifier.d.mts +5 -5
  97. package/dist/token-verifier.d.ts +5 -5
  98. package/dist/token-verifier.mjs +13 -34
  99. package/dist/token-verifier.mjs.map +1 -1
  100. package/dist/tsconfig.tsbuildinfo +1 -1
  101. package/dist/{utils.js → utils.cjs} +10 -3
  102. package/dist/utils.cjs.map +1 -0
  103. package/dist/utils.d.mts +4 -3
  104. package/dist/utils.d.ts +4 -3
  105. package/dist/utils.mjs +7 -2
  106. package/dist/utils.mjs.map +1 -1
  107. package/package.json +37 -25
  108. package/dist/client.js +0 -70
  109. package/dist/client.js.map +0 -1
  110. package/dist/index.js +0 -1042
  111. package/dist/index.js.map +0 -1
  112. package/dist/main.d.mts +0 -19
  113. package/dist/main.d.ts +0 -19
  114. package/dist/main.js.map +0 -1
  115. package/dist/main.mjs +0 -1264
  116. package/dist/main.mjs.map +0 -1
  117. package/dist/schema.js.map +0 -1
  118. package/dist/schema.zod.js.map +0 -1
  119. package/dist/services/bulk_resources.js.map +0 -1
  120. package/dist/services/bulk_roles.js.map +0 -1
  121. package/dist/services/entitlements.js.map +0 -1
  122. package/dist/services/plans.js.map +0 -1
  123. package/dist/services/resource_members.js.map +0 -1
  124. package/dist/services/resources.js.map +0 -1
  125. package/dist/services/roles.js.map +0 -1
  126. package/dist/services/usage.js.map +0 -1
  127. package/dist/services/users.js.map +0 -1
  128. package/dist/token-verifier.js.map +0 -1
  129. package/dist/utils.js.map +0 -1
  130. package/src/client.ts +0 -74
  131. package/src/index.ts +0 -55
  132. package/src/main.ts +0 -3
  133. package/src/schema.ts +0 -430
  134. package/src/schema.zod.ts +0 -558
  135. package/src/services/bulk_resources.ts +0 -24
  136. package/src/services/bulk_roles.ts +0 -22
  137. package/src/services/entitlements.ts +0 -58
  138. package/src/services/plans.ts +0 -57
  139. package/src/services/resource_members.ts +0 -25
  140. package/src/services/resources.ts +0 -91
  141. package/src/services/roles.ts +0 -58
  142. package/src/services/usage.ts +0 -93
  143. package/src/services/users.ts +0 -100
  144. package/src/token-verifier.ts +0 -280
  145. package/src/utils.ts +0 -56
package/dist/index.mjs CHANGED
@@ -5,48 +5,28 @@ var __export = (target, all) => {
5
5
  };
6
6
 
7
7
  // src/client.ts
8
- import {
9
- FetchClient,
10
- FetchError
11
- } from "@blimu/fetch";
12
- var CoreClient = class extends FetchClient {
13
- constructor(cfg = {}) {
14
- const authStrategies = [];
15
- const { auth: _existingAuth, apiKey, ...restCfg } = cfg;
16
- if (cfg?.apiKey) {
17
- const apiKeyValue = cfg.apiKey;
18
- authStrategies.push({
19
- type: "apiKey",
20
- key: () => apiKeyValue,
21
- location: "header",
22
- name: "X-API-KEY"
23
- });
24
- }
25
- const finalAuthStrategies = [
26
- ..._existingAuth?.strategies || [],
27
- ...authStrategies
28
- ];
29
- const fetchConfig = {
30
- ...restCfg,
31
- baseURL: cfg.baseURL ?? "https://api.blimu.dev",
32
- // Explicitly set auth after restCfg to ensure it's not overwritten
33
- // (restCfg might have an auth property that we want to replace)
34
- ...finalAuthStrategies.length > 0 ? {
35
- auth: {
36
- strategies: finalAuthStrategies
37
- }
38
- } : {}
39
- // Hooks are passed through directly from FetchClientConfig (no mapping needed)
40
- };
41
- super(fetchConfig);
42
- }
43
- async request(init) {
44
- return await super.request(init);
45
- }
46
- async *requestStream(init) {
47
- yield* super.requestStream(init);
8
+ import { FetchClient as FetchClient10, FetchError } from "@blimu/fetch";
9
+ import "@blimu/fetch";
10
+
11
+ // src/auth-strategies.ts
12
+ function buildAuthStrategies(cfg) {
13
+ const authStrategies = [...cfg?.authStrategies ?? []];
14
+ if (cfg.apiKey) {
15
+ authStrategies.push({
16
+ type: "apiKey",
17
+ key: cfg.apiKey,
18
+ location: "header",
19
+ name: "X-API-KEY"
20
+ });
48
21
  }
49
- };
22
+ return authStrategies;
23
+ }
24
+
25
+ // src/services/bulk_resources.ts
26
+ import "@blimu/fetch";
27
+
28
+ // src/schema.ts
29
+ var schema_exports = {};
50
30
 
51
31
  // src/services/bulk_resources.ts
52
32
  var BulkResourcesService = class {
@@ -62,12 +42,13 @@ var BulkResourcesService = class {
62
42
  method: "POST",
63
43
  path: `/v1/resources/${encodeURIComponent(resourceType)}/bulk`,
64
44
  body,
65
- ...init || {}
45
+ ...init ?? {}
66
46
  });
67
47
  }
68
48
  };
69
49
 
70
50
  // src/services/bulk_roles.ts
51
+ import "@blimu/fetch";
71
52
  var BulkRolesService = class {
72
53
  constructor(core) {
73
54
  this.core = core;
@@ -81,12 +62,13 @@ var BulkRolesService = class {
81
62
  method: "POST",
82
63
  path: `/v1/users/roles/bulk`,
83
64
  body,
84
- ...init || {}
65
+ ...init ?? {}
85
66
  });
86
67
  }
87
68
  };
88
69
 
89
70
  // src/services/entitlements.ts
71
+ import "@blimu/fetch";
90
72
  var EntitlementsService = class {
91
73
  constructor(core) {
92
74
  this.core = core;
@@ -100,7 +82,7 @@ var EntitlementsService = class {
100
82
  method: "POST",
101
83
  path: `/v1/entitlements/check`,
102
84
  body,
103
- ...init || {}
85
+ ...init ?? {}
104
86
  });
105
87
  }
106
88
  /**
@@ -112,7 +94,7 @@ var EntitlementsService = class {
112
94
  method: "GET",
113
95
  path: `/v1/entitlements/list-for-resource/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,
114
96
  query,
115
- ...init || {}
97
+ ...init ?? {}
116
98
  });
117
99
  }
118
100
  /**
@@ -124,12 +106,13 @@ var EntitlementsService = class {
124
106
  method: "GET",
125
107
  path: `/v1/entitlements/list-for-tenant/${encodeURIComponent(tenantResourceId)}`,
126
108
  query,
127
- ...init || {}
109
+ ...init ?? {}
128
110
  });
129
111
  }
130
112
  };
131
113
 
132
114
  // src/services/plans.ts
115
+ import "@blimu/fetch";
133
116
  var PlansService = class {
134
117
  constructor(core) {
135
118
  this.core = core;
@@ -142,7 +125,7 @@ var PlansService = class {
142
125
  return this.core.request({
143
126
  method: "DELETE",
144
127
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/plan`,
145
- ...init || {}
128
+ ...init ?? {}
146
129
  });
147
130
  }
148
131
  /**
@@ -153,7 +136,7 @@ var PlansService = class {
153
136
  return this.core.request({
154
137
  method: "GET",
155
138
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/plan`,
156
- ...init || {}
139
+ ...init ?? {}
157
140
  });
158
141
  }
159
142
  /**
@@ -165,12 +148,13 @@ var PlansService = class {
165
148
  method: "POST",
166
149
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/plan`,
167
150
  body,
168
- ...init || {}
151
+ ...init ?? {}
169
152
  });
170
153
  }
171
154
  };
172
155
 
173
156
  // src/services/resource_members.ts
157
+ import "@blimu/fetch";
174
158
  var ResourceMembersService = class {
175
159
  constructor(core) {
176
160
  this.core = core;
@@ -184,12 +168,13 @@ var ResourceMembersService = class {
184
168
  method: "GET",
185
169
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/members`,
186
170
  query,
187
- ...init || {}
171
+ ...init ?? {}
188
172
  });
189
173
  }
190
174
  };
191
175
 
192
176
  // src/services/resources.ts
177
+ import "@blimu/fetch";
193
178
  var ResourcesService = class {
194
179
  constructor(core) {
195
180
  this.core = core;
@@ -203,7 +188,7 @@ var ResourcesService = class {
203
188
  method: "GET",
204
189
  path: `/v1/resources/${encodeURIComponent(resourceType)}`,
205
190
  query,
206
- ...init || {}
191
+ ...init ?? {}
207
192
  });
208
193
  }
209
194
  /**
@@ -215,7 +200,7 @@ var ResourcesService = class {
215
200
  method: "POST",
216
201
  path: `/v1/resources/${encodeURIComponent(resourceType)}`,
217
202
  body,
218
- ...init || {}
203
+ ...init ?? {}
219
204
  });
220
205
  }
221
206
  /**
@@ -226,7 +211,7 @@ var ResourcesService = class {
226
211
  return this.core.request({
227
212
  method: "DELETE",
228
213
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,
229
- ...init || {}
214
+ ...init ?? {}
230
215
  });
231
216
  }
232
217
  /**
@@ -237,7 +222,7 @@ var ResourcesService = class {
237
222
  return this.core.request({
238
223
  method: "GET",
239
224
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,
240
- ...init || {}
225
+ ...init ?? {}
241
226
  });
242
227
  }
243
228
  /**
@@ -249,12 +234,13 @@ var ResourcesService = class {
249
234
  method: "PUT",
250
235
  path: `/v1/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,
251
236
  body,
252
- ...init || {}
237
+ ...init ?? {}
253
238
  });
254
239
  }
255
240
  };
256
241
 
257
242
  // src/services/roles.ts
243
+ import "@blimu/fetch";
258
244
  var RolesService = class {
259
245
  constructor(core) {
260
246
  this.core = core;
@@ -268,7 +254,7 @@ var RolesService = class {
268
254
  method: "GET",
269
255
  path: `/v1/users/${encodeURIComponent(userId)}/roles`,
270
256
  query,
271
- ...init || {}
257
+ ...init ?? {}
272
258
  });
273
259
  }
274
260
  /**
@@ -280,7 +266,7 @@ var RolesService = class {
280
266
  method: "POST",
281
267
  path: `/v1/users/${encodeURIComponent(userId)}/roles`,
282
268
  body,
283
- ...init || {}
269
+ ...init ?? {}
284
270
  });
285
271
  }
286
272
  /**
@@ -291,12 +277,13 @@ var RolesService = class {
291
277
  return this.core.request({
292
278
  method: "DELETE",
293
279
  path: `/v1/users/${encodeURIComponent(userId)}/roles/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,
294
- ...init || {}
280
+ ...init ?? {}
295
281
  });
296
282
  }
297
283
  };
298
284
 
299
285
  // src/services/usage.ts
286
+ import "@blimu/fetch";
300
287
  var UsageService = class {
301
288
  constructor(core) {
302
289
  this.core = core;
@@ -310,7 +297,7 @@ var UsageService = class {
310
297
  method: "GET",
311
298
  path: `/v1/usage/balance/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/${encodeURIComponent(limitType)}`,
312
299
  query,
313
- ...init || {}
300
+ ...init ?? {}
314
301
  });
315
302
  }
316
303
  /**
@@ -322,7 +309,7 @@ var UsageService = class {
322
309
  method: "POST",
323
310
  path: `/v1/usage/check`,
324
311
  body,
325
- ...init || {}
312
+ ...init ?? {}
326
313
  });
327
314
  }
328
315
  /**
@@ -334,7 +321,7 @@ var UsageService = class {
334
321
  method: "POST",
335
322
  path: `/v1/usage/consume`,
336
323
  body,
337
- ...init || {}
324
+ ...init ?? {}
338
325
  });
339
326
  }
340
327
  /**
@@ -346,7 +333,7 @@ var UsageService = class {
346
333
  method: "POST",
347
334
  path: `/v1/usage/credit`,
348
335
  body,
349
- ...init || {}
336
+ ...init ?? {}
350
337
  });
351
338
  }
352
339
  /**
@@ -358,12 +345,13 @@ var UsageService = class {
358
345
  method: "GET",
359
346
  path: `/v1/usage/transactions/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/${encodeURIComponent(limitType)}`,
360
347
  query,
361
- ...init || {}
348
+ ...init ?? {}
362
349
  });
363
350
  }
364
351
  };
365
352
 
366
353
  // src/services/users.ts
354
+ import "@blimu/fetch";
367
355
  var UsersService = class {
368
356
  constructor(core) {
369
357
  this.core = core;
@@ -377,7 +365,7 @@ var UsersService = class {
377
365
  method: "GET",
378
366
  path: `/v1/users`,
379
367
  query,
380
- ...init || {}
368
+ ...init ?? {}
381
369
  });
382
370
  }
383
371
  /**
@@ -389,7 +377,7 @@ var UsersService = class {
389
377
  method: "POST",
390
378
  path: `/v1/users`,
391
379
  body,
392
- ...init || {}
380
+ ...init ?? {}
393
381
  });
394
382
  }
395
383
  /**
@@ -400,7 +388,7 @@ var UsersService = class {
400
388
  return this.core.request({
401
389
  method: "DELETE",
402
390
  path: `/v1/users/${encodeURIComponent(userId)}`,
403
- ...init || {}
391
+ ...init ?? {}
404
392
  });
405
393
  }
406
394
  /**
@@ -411,7 +399,7 @@ var UsersService = class {
411
399
  return this.core.request({
412
400
  method: "GET",
413
401
  path: `/v1/users/${encodeURIComponent(userId)}`,
414
- ...init || {}
402
+ ...init ?? {}
415
403
  });
416
404
  }
417
405
  /**
@@ -423,7 +411,7 @@ var UsersService = class {
423
411
  method: "PUT",
424
412
  path: `/v1/users/${encodeURIComponent(userId)}`,
425
413
  body,
426
- ...init || {}
414
+ ...init ?? {}
427
415
  });
428
416
  }
429
417
  /**
@@ -434,11 +422,44 @@ var UsersService = class {
434
422
  return this.core.request({
435
423
  method: "GET",
436
424
  path: `/v1/users/${encodeURIComponent(userId)}/effective-user-resources-roles`,
437
- ...init || {}
425
+ ...init ?? {}
438
426
  });
439
427
  }
440
428
  };
441
429
 
430
+ // src/client.ts
431
+ var Blimu = class {
432
+ bulkResources;
433
+ bulkRoles;
434
+ entitlements;
435
+ plans;
436
+ resourceMembers;
437
+ resources;
438
+ roles;
439
+ usage;
440
+ users;
441
+ constructor(options) {
442
+ const restCfg = { ...options ?? {} };
443
+ delete restCfg.apiKey;
444
+ const authStrategies = buildAuthStrategies(options ?? {});
445
+ const core = new FetchClient10({
446
+ ...restCfg,
447
+ baseURL: options?.baseURL ?? "https://api.blimu.dev",
448
+ ...authStrategies.length > 0 ? { authStrategies } : {}
449
+ });
450
+ this.bulkResources = new BulkResourcesService(core);
451
+ this.bulkRoles = new BulkRolesService(core);
452
+ this.entitlements = new EntitlementsService(core);
453
+ this.plans = new PlansService(core);
454
+ this.resourceMembers = new ResourceMembersService(core);
455
+ this.resources = new ResourcesService(core);
456
+ this.roles = new RolesService(core);
457
+ this.usage = new UsageService(core);
458
+ this.users = new UsersService(core);
459
+ }
460
+ };
461
+ var BlimuError = FetchError;
462
+
442
463
  // src/index.ts
443
464
  export * from "@blimu/fetch";
444
465
 
@@ -460,13 +481,14 @@ async function* paginate(fetchPage, initialQuery = {}, pageSize = 100) {
460
481
  }
461
482
  async function listAll(fetchPage, query = {}, pageSize = 100) {
462
483
  const out = [];
463
- for await (const item of paginate(fetchPage, query, pageSize))
464
- out.push(item);
484
+ for await (const item of paginate(fetchPage, query, pageSize)) out.push(item);
465
485
  return out;
466
486
  }
467
-
468
- // src/schema.ts
469
- var schema_exports = {};
487
+ function isNotUndefined(arr) {
488
+ return arr.filter(
489
+ (item) => item !== void 0
490
+ );
491
+ }
470
492
 
471
493
  // src/schema.zod.ts
472
494
  var schema_zod_exports = {};
@@ -475,15 +497,12 @@ __export(schema_zod_exports, {
475
497
  CheckLimitResponseSchema: () => CheckLimitResponseSchema,
476
498
  EntitlementCheckBodySchema: () => EntitlementCheckBodySchema,
477
499
  EntitlementCheckResultSchema: () => EntitlementCheckResultSchema,
478
- EntitlementTypeSchema: () => EntitlementTypeSchema,
479
500
  EntitlementsListForResourceQuerySchema: () => EntitlementsListForResourceQuerySchema,
480
501
  EntitlementsListForTenantQuerySchema: () => EntitlementsListForTenantQuerySchema,
481
502
  EntitlementsListResultSchema: () => EntitlementsListResultSchema,
482
- LimitTypeSchema: () => LimitTypeSchema,
483
503
  PlanAssignBodySchema: () => PlanAssignBodySchema,
484
504
  PlanDeleteResponseSchema: () => PlanDeleteResponseSchema,
485
505
  PlanResponseSchema: () => PlanResponseSchema,
486
- PlanTypeSchema: () => PlanTypeSchema,
487
506
  ResourceBulkCreateBodySchema: () => ResourceBulkCreateBodySchema,
488
507
  ResourceBulkResultSchema: () => ResourceBulkResultSchema,
489
508
  ResourceCreateBodySchema: () => ResourceCreateBodySchema,
@@ -491,7 +510,6 @@ __export(schema_zod_exports, {
491
510
  ResourceMemberListSchema: () => ResourceMemberListSchema,
492
511
  ResourceMembersListQuerySchema: () => ResourceMembersListQuerySchema,
493
512
  ResourceSchema: () => ResourceSchema,
494
- ResourceTypeSchema: () => ResourceTypeSchema,
495
513
  ResourceUpdateBodySchema: () => ResourceUpdateBodySchema,
496
514
  ResourcesListQuerySchema: () => ResourcesListQuerySchema,
497
515
  RoleBulkCreateBodySchema: () => RoleBulkCreateBodySchema,
@@ -506,7 +524,6 @@ __export(schema_zod_exports, {
506
524
  UsageCreditBodySchema: () => UsageCreditBodySchema,
507
525
  UsageGetBalanceQuerySchema: () => UsageGetBalanceQuerySchema,
508
526
  UsageGetTransactionHistoryQuerySchema: () => UsageGetTransactionHistoryQuerySchema,
509
- UsageLimitTypeSchema: () => UsageLimitTypeSchema,
510
527
  UsageWalletResponseSchema: () => UsageWalletResponseSchema,
511
528
  UserCreateBodySchema: () => UserCreateBodySchema,
512
529
  UserListSchema: () => UserListSchema,
@@ -516,11 +533,6 @@ __export(schema_zod_exports, {
516
533
  UsersListQuerySchema: () => UsersListQuerySchema
517
534
  });
518
535
  import { z } from "zod";
519
- var EntitlementTypeSchema = z.string();
520
- var LimitTypeSchema = z.string();
521
- var PlanTypeSchema = z.string();
522
- var ResourceTypeSchema = z.string();
523
- var UsageLimitTypeSchema = z.string();
524
536
  var BalanceResponseSchema = z.object({ balance: z.number() });
525
537
  var CheckLimitResponseSchema = z.object({
526
538
  allowed: z.boolean(),
@@ -530,7 +542,7 @@ var CheckLimitResponseSchema = z.object({
530
542
  });
531
543
  var EntitlementCheckBodySchema = z.object({
532
544
  amount: z.number().int().optional(),
533
- entitlement: EntitlementTypeSchema,
545
+ entitlement: z.string(),
534
546
  resourceId: z.string(),
535
547
  userId: z.string()
536
548
  });
@@ -547,109 +559,89 @@ var EntitlementCheckResultSchema = z.object({
547
559
  }).nullable().optional(),
548
560
  plans: z.object({
549
561
  allowed: z.boolean(),
550
- allowedPlans: z.array(z.string()).optional(),
562
+ allowedPlans: z.string().array().optional(),
551
563
  plan: z.string().nullable().optional(),
552
564
  reason: z.string().optional()
553
565
  }).nullable().optional(),
554
566
  roles: z.object({
555
567
  allowed: z.boolean(),
556
- allowedRoles: z.array(z.string()).optional(),
568
+ allowedRoles: z.string().array().optional(),
557
569
  reason: z.string().optional(),
558
- userRoles: z.array(z.string()).optional()
570
+ userRoles: z.string().array().optional()
559
571
  }).nullable().optional()
560
572
  });
561
573
  var EntitlementsListResultSchema = z.object({
562
- results: z.array(
563
- z.object({
564
- entitlements: z.array(
565
- z.object({
566
- allowed: z.boolean(),
567
- allowedByPlan: z.boolean(),
568
- allowedByRole: z.boolean(),
569
- allowedPlans: z.array(z.string()).optional(),
570
- allowedRoles: z.array(z.string()),
571
- currentPlan: z.string().optional(),
572
- currentRole: z.string().optional(),
573
- entitlement: EntitlementTypeSchema
574
- })
575
- ),
576
- resourceId: z.string(),
577
- resourceType: ResourceTypeSchema
578
- })
579
- )
574
+ results: z.object({
575
+ entitlements: z.object({
576
+ allowed: z.boolean(),
577
+ allowedByPlan: z.boolean(),
578
+ allowedByRole: z.boolean(),
579
+ allowedPlans: z.string().array().optional(),
580
+ allowedRoles: z.string().array(),
581
+ currentPlan: z.string().optional(),
582
+ currentRole: z.string().optional(),
583
+ entitlement: z.string()
584
+ }).array(),
585
+ resourceId: z.string(),
586
+ resourceType: z.string()
587
+ }).array()
580
588
  });
581
- var PlanAssignBodySchema = z.object({ planKey: PlanTypeSchema });
589
+ var PlanAssignBodySchema = z.object({ planKey: z.string() });
582
590
  var PlanDeleteResponseSchema = z.object({ success: z.boolean() });
583
591
  var PlanResponseSchema = z.object({
584
- createdAt: z.string().datetime(),
592
+ createdAt: z.iso.datetime(),
585
593
  environmentId: z.string(),
586
- planKey: PlanTypeSchema,
594
+ planKey: z.string(),
587
595
  resourceId: z.string(),
588
- resourceType: ResourceTypeSchema,
589
- updatedAt: z.string().datetime()
596
+ resourceType: z.string(),
597
+ updatedAt: z.iso.datetime()
590
598
  });
591
599
  var ResourceSchema = z.object({
592
- createdAt: z.string().datetime(),
600
+ createdAt: z.iso.datetime(),
593
601
  id: z.string(),
594
602
  name: z.string().nullable(),
595
- parents: z.array(
596
- z.object({
597
- id: z.string(),
598
- type: ResourceTypeSchema
599
- })
600
- ).optional(),
601
- type: ResourceTypeSchema
603
+ parents: z.object({
604
+ id: z.string(),
605
+ type: z.string()
606
+ }).array().optional(),
607
+ type: z.string()
602
608
  });
603
609
  var ResourceBulkCreateBodySchema = z.object({
604
- resources: z.array(
605
- z.object({
606
- id: z.string().optional(),
607
- name: z.string().optional(),
608
- parents: z.array(
609
- z.object({
610
- id: z.string(),
611
- type: ResourceTypeSchema
612
- })
613
- ).optional(),
614
- roles: z.array(
615
- z.object({
616
- role: z.string(),
617
- userId: z.string()
618
- })
619
- ).optional()
620
- })
621
- )
610
+ resources: z.object({
611
+ id: z.string().optional(),
612
+ name: z.string().optional(),
613
+ parents: z.object({
614
+ id: z.string(),
615
+ type: z.string()
616
+ }).array().optional(),
617
+ roles: z.object({
618
+ role: z.string(),
619
+ userId: z.string()
620
+ }).array().optional()
621
+ }).array()
622
622
  });
623
623
  var ResourceBulkResultSchema = z.object({
624
- created: z.array(
625
- z.object({
626
- environmentId: z.string(),
627
- id: z.string(),
628
- type: ResourceTypeSchema
629
- })
630
- ),
631
- errors: z.array(
632
- z.object({
633
- error: z.string(),
634
- index: z.number(),
635
- resource: z.object({
636
- id: z.string().optional(),
637
- name: z.string().optional(),
638
- parents: z.array(
639
- z.object({
640
- id: z.string(),
641
- type: ResourceTypeSchema
642
- })
643
- ).optional(),
644
- roles: z.array(
645
- z.object({
646
- role: z.string(),
647
- userId: z.string()
648
- })
649
- ).optional()
650
- })
624
+ created: z.object({
625
+ environmentId: z.string(),
626
+ id: z.string(),
627
+ type: z.string()
628
+ }).array(),
629
+ errors: z.object({
630
+ error: z.string(),
631
+ index: z.number(),
632
+ resource: z.object({
633
+ id: z.string().optional(),
634
+ name: z.string().optional(),
635
+ parents: z.object({
636
+ id: z.string(),
637
+ type: z.string()
638
+ }).array().optional(),
639
+ roles: z.object({
640
+ role: z.string(),
641
+ userId: z.string()
642
+ }).array().optional()
651
643
  })
652
- ),
644
+ }).array(),
653
645
  success: z.boolean(),
654
646
  summary: z.object({
655
647
  failed: z.number(),
@@ -660,58 +652,33 @@ var ResourceBulkResultSchema = z.object({
660
652
  var ResourceCreateBodySchema = z.object({
661
653
  id: z.string().optional(),
662
654
  name: z.string().optional(),
663
- parents: z.array(
664
- z.object({
665
- id: z.string(),
666
- type: ResourceTypeSchema
667
- })
668
- ).optional(),
669
- roles: z.array(
670
- z.object({
671
- role: z.string(),
672
- userId: z.string()
673
- })
674
- ).optional()
675
- });
676
- var ResourceListSchema = z.object({
677
- items: z.array(
678
- z.object({
679
- createdAt: z.string().datetime(),
680
- id: z.string(),
681
- name: z.string().nullable(),
682
- parents: z.array(
683
- z.object({
684
- id: z.string(),
685
- type: ResourceTypeSchema
686
- })
687
- ).optional(),
688
- type: ResourceTypeSchema
689
- })
690
- ),
691
- limit: z.number(),
692
- page: z.number(),
693
- total: z.number()
655
+ parents: z.object({
656
+ id: z.string(),
657
+ type: z.string()
658
+ }).array().optional(),
659
+ roles: z.object({
660
+ role: z.string(),
661
+ userId: z.string()
662
+ }).array().optional()
694
663
  });
695
664
  var ResourceMemberListSchema = z.object({
696
- items: z.array(
697
- z.object({
698
- inherited: z.boolean(),
699
- role: z.string(),
700
- user: z.object({
701
- avatarUrl: z.string().nullable(),
702
- createdAt: z.string().datetime(),
703
- email: z.string().email(),
704
- emailVerified: z.boolean(),
705
- firstName: z.string().nullable(),
706
- id: z.string(),
707
- lastLoginAt: z.string().datetime().nullable(),
708
- lastName: z.string().nullable(),
709
- lookupKey: z.string().nullable(),
710
- updatedAt: z.string().datetime()
711
- }),
712
- userId: z.string()
713
- })
714
- ),
665
+ items: z.object({
666
+ inherited: z.boolean(),
667
+ role: z.string(),
668
+ user: z.object({
669
+ avatarUrl: z.string().nullable(),
670
+ createdAt: z.iso.datetime(),
671
+ email: z.email(),
672
+ emailVerified: z.boolean(),
673
+ firstName: z.string().nullable(),
674
+ id: z.string(),
675
+ lastLoginAt: z.iso.datetime().nullable(),
676
+ lastName: z.string().nullable(),
677
+ lookupKey: z.string().nullable(),
678
+ updatedAt: z.iso.datetime()
679
+ }),
680
+ userId: z.string()
681
+ }).array(),
715
682
  limit: z.number(),
716
683
  page: z.number(),
717
684
  total: z.number()
@@ -719,54 +686,46 @@ var ResourceMemberListSchema = z.object({
719
686
  var ResourceUpdateBodySchema = z.object({
720
687
  name: z.string().optional(),
721
688
  /** Creates relationships with other resources. Parent resources must already exist. */
722
- parents: z.array(
723
- z.object({
724
- id: z.string(),
725
- type: ResourceTypeSchema
726
- })
727
- ).optional()
689
+ parents: z.object({
690
+ id: z.string(),
691
+ type: z.string()
692
+ }).array().optional()
728
693
  });
729
694
  var RoleSchema = z.object({
730
695
  createdAt: z.string(),
731
696
  environmentId: z.string(),
732
697
  resourceId: z.string(),
733
- resourceType: ResourceTypeSchema,
698
+ resourceType: z.string(),
734
699
  role: z.string(),
735
700
  userId: z.string()
736
701
  });
737
702
  var RoleBulkCreateBodySchema = z.object({
738
- roles: z.array(
739
- z.object({
740
- resourceId: z.string(),
741
- resourceType: ResourceTypeSchema,
742
- role: z.string(),
743
- userId: z.string()
744
- })
745
- )
703
+ roles: z.object({
704
+ resourceId: z.string(),
705
+ resourceType: z.string(),
706
+ role: z.string(),
707
+ userId: z.string()
708
+ }).array()
746
709
  });
747
710
  var RoleBulkResultSchema = z.object({
748
- created: z.array(
749
- z.object({
750
- createdAt: z.string(),
751
- environmentId: z.string(),
711
+ created: z.object({
712
+ createdAt: z.string(),
713
+ environmentId: z.string(),
714
+ resourceId: z.string(),
715
+ resourceType: z.string(),
716
+ role: z.string(),
717
+ userId: z.string()
718
+ }).array(),
719
+ errors: z.object({
720
+ error: z.string(),
721
+ index: z.number(),
722
+ role: z.object({
752
723
  resourceId: z.string(),
753
- resourceType: ResourceTypeSchema,
724
+ resourceType: z.string(),
754
725
  role: z.string(),
755
726
  userId: z.string()
756
727
  })
757
- ),
758
- errors: z.array(
759
- z.object({
760
- error: z.string(),
761
- index: z.number(),
762
- role: z.object({
763
- resourceId: z.string(),
764
- resourceType: ResourceTypeSchema,
765
- role: z.string(),
766
- userId: z.string()
767
- })
768
- })
769
- ),
728
+ }).array(),
770
729
  success: z.boolean(),
771
730
  summary: z.object({
772
731
  failed: z.number(),
@@ -776,84 +735,80 @@ var RoleBulkResultSchema = z.object({
776
735
  });
777
736
  var RoleCreateBodySchema = z.object({
778
737
  resourceId: z.string(),
779
- resourceType: ResourceTypeSchema,
738
+ resourceType: z.string(),
780
739
  role: z.string()
781
740
  });
782
741
  var RoleListSchema = z.object({
783
742
  limit: z.number(),
784
743
  page: z.number(),
785
- roles: z.array(
786
- z.object({
787
- createdAt: z.string(),
788
- environmentId: z.string(),
789
- resourceId: z.string(),
790
- resourceType: ResourceTypeSchema,
791
- role: z.string(),
792
- userId: z.string()
793
- })
794
- ),
744
+ roles: z.object({
745
+ createdAt: z.string(),
746
+ environmentId: z.string(),
747
+ resourceId: z.string(),
748
+ resourceType: z.string(),
749
+ role: z.string(),
750
+ userId: z.string()
751
+ }).array(),
795
752
  total: z.number()
796
753
  });
797
754
  var TransactionHistoryResponseSchema = z.object({
798
- items: z.array(
799
- z.object({
800
- amount: z.number().int(),
801
- createdAt: z.string().datetime(),
802
- environmentId: z.string(),
803
- id: z.string(),
804
- limitType: LimitTypeSchema,
805
- resourceId: z.string(),
806
- resourceType: ResourceTypeSchema,
807
- tags: z.record(z.string(), z.unknown()).nullable()
808
- })
809
- )
755
+ items: z.object({
756
+ amount: z.number().int(),
757
+ createdAt: z.iso.datetime(),
758
+ environmentId: z.string(),
759
+ id: z.string(),
760
+ limitType: z.string(),
761
+ resourceId: z.string(),
762
+ resourceType: z.string(),
763
+ tags: z.record(z.string(), z.unknown()).nullable()
764
+ }).array()
810
765
  });
811
766
  var UsageCheckBodySchema = z.object({
812
767
  amount: z.number().int(),
813
- limitType: UsageLimitTypeSchema,
768
+ limitType: z.string(),
814
769
  period: z.enum(["monthly", "yearly", "lifetime"]),
815
770
  resourceId: z.string(),
816
- resourceType: ResourceTypeSchema
771
+ resourceType: z.string()
817
772
  });
818
773
  var UsageConsumeBodySchema = z.object({
819
774
  amount: z.number().int(),
820
- limitType: UsageLimitTypeSchema,
775
+ limitType: z.string(),
821
776
  resourceId: z.string(),
822
- resourceType: ResourceTypeSchema,
777
+ resourceType: z.string(),
823
778
  tags: z.record(z.string(), z.unknown()).optional()
824
779
  });
825
780
  var UsageCreditBodySchema = z.object({
826
781
  amount: z.number().int(),
827
- limitType: UsageLimitTypeSchema,
782
+ limitType: z.string(),
828
783
  resourceId: z.string(),
829
- resourceType: ResourceTypeSchema,
784
+ resourceType: z.string(),
830
785
  tags: z.record(z.string(), z.unknown()).optional()
831
786
  });
832
787
  var UsageWalletResponseSchema = z.object({
833
788
  amount: z.number().int(),
834
- createdAt: z.string().datetime(),
789
+ createdAt: z.iso.datetime(),
835
790
  environmentId: z.string(),
836
791
  id: z.string(),
837
- limitType: UsageLimitTypeSchema,
792
+ limitType: z.string(),
838
793
  resourceId: z.string(),
839
- resourceType: ResourceTypeSchema,
794
+ resourceType: z.string(),
840
795
  tags: z.record(z.string(), z.unknown()).nullable()
841
796
  });
842
797
  var UserSchema = z.object({
843
798
  avatarUrl: z.string().nullable(),
844
- createdAt: z.string().datetime(),
845
- email: z.string().email(),
799
+ createdAt: z.iso.datetime(),
800
+ email: z.email(),
846
801
  emailVerified: z.boolean(),
847
802
  firstName: z.string().nullable(),
848
803
  id: z.string(),
849
- lastLoginAt: z.string().datetime().nullable(),
804
+ lastLoginAt: z.iso.datetime().nullable(),
850
805
  lastName: z.string().nullable(),
851
806
  lookupKey: z.string().nullable(),
852
- updatedAt: z.string().datetime()
807
+ updatedAt: z.iso.datetime()
853
808
  });
854
809
  var UserCreateBodySchema = z.object({
855
- avatarUrl: z.string().url().optional(),
856
- email: z.string().email(),
810
+ avatarUrl: z.url().optional(),
811
+ email: z.email(),
857
812
  firstName: z.string().nullable().optional(),
858
813
  lastName: z.string().nullable().optional(),
859
814
  lookupKey: z.string(),
@@ -861,20 +816,18 @@ var UserCreateBodySchema = z.object({
861
816
  password: z.string().nullable().optional()
862
817
  });
863
818
  var UserListSchema = z.object({
864
- items: z.array(
865
- z.object({
866
- avatarUrl: z.string().nullable(),
867
- createdAt: z.string().datetime(),
868
- email: z.string().email(),
869
- emailVerified: z.boolean(),
870
- firstName: z.string().nullable(),
871
- id: z.string(),
872
- lastLoginAt: z.string().datetime().nullable(),
873
- lastName: z.string().nullable(),
874
- lookupKey: z.string().nullable(),
875
- updatedAt: z.string().datetime()
876
- })
877
- ),
819
+ items: z.object({
820
+ avatarUrl: z.string().nullable(),
821
+ createdAt: z.iso.datetime(),
822
+ email: z.email(),
823
+ emailVerified: z.boolean(),
824
+ firstName: z.string().nullable(),
825
+ id: z.string(),
826
+ lastLoginAt: z.iso.datetime().nullable(),
827
+ lastName: z.string().nullable(),
828
+ lookupKey: z.string().nullable(),
829
+ updatedAt: z.iso.datetime()
830
+ }).array(),
878
831
  limit: z.number(),
879
832
  page: z.number(),
880
833
  total: z.number()
@@ -885,25 +838,29 @@ var UserResourceListSchema = z.array(
885
838
  resource: z.object({
886
839
  id: z.string(),
887
840
  name: z.string(),
888
- parents: z.array(
889
- z.object({
890
- id: z.string(),
891
- type: ResourceTypeSchema
892
- })
893
- ),
894
- type: ResourceTypeSchema
841
+ parents: z.object({
842
+ id: z.string(),
843
+ type: z.string()
844
+ }).array(),
845
+ type: z.string()
895
846
  }).catchall(z.unknown()),
896
847
  role: z.string()
897
848
  })
898
849
  );
899
850
  var UserUpdateBodySchema = z.object({
900
- avatarUrl: z.string().url().nullable().optional(),
901
- email: z.string().email().optional(),
851
+ avatarUrl: z.url().nullable().optional(),
852
+ email: z.email().optional(),
902
853
  firstName: z.string().nullable().optional(),
903
854
  lastName: z.string().nullable().optional(),
904
855
  lookupKey: z.string().optional(),
905
856
  password: z.string().optional()
906
857
  });
858
+ var ResourceListSchema = z.object({
859
+ items: ResourceSchema.array(),
860
+ limit: z.number(),
861
+ page: z.number(),
862
+ total: z.number()
863
+ });
907
864
  var EntitlementsListForResourceQuerySchema = z.object({
908
865
  /** The unique identifier of the user */
909
866
  userId: z.string()
@@ -936,17 +893,13 @@ var RolesListQuerySchema = z.object({
936
893
  /** Filter roles by specific resource ID */
937
894
  resourceId: z.string().optional(),
938
895
  /** Filter roles by resource type */
939
- resourceType: ResourceTypeSchema.optional(),
896
+ resourceType: z.string().optional(),
940
897
  /** Filter by role name */
941
898
  role: z.string().optional()
942
899
  });
943
900
  var UsageGetBalanceQuerySchema = z.object({
944
901
  /** Time period for the balance calculation */
945
- period: z.enum([
946
- "monthly",
947
- "yearly",
948
- "lifetime"
949
- ])
902
+ period: z.enum(["monthly", "yearly", "lifetime"])
950
903
  });
951
904
  var UsageGetTransactionHistoryQuerySchema = z.object({
952
905
  /** End date for filtering transactions (ISO 8601 format) */
@@ -965,28 +918,182 @@ var UsersListQuerySchema = z.object({
965
918
  search: z.string().optional()
966
919
  });
967
920
 
968
- // src/index.ts
969
- var Blimu = class {
921
+ // src/token-verifier.ts
922
+ import * as crypto from "crypto";
923
+ import * as jwt from "jsonwebtoken";
924
+ var TokenVerifier = class {
925
+ cache = /* @__PURE__ */ new Map();
926
+ cacheTTL;
927
+ runtimeApiUrl;
970
928
  constructor(options) {
971
- const core = new CoreClient(options);
972
- this.bulkResources = new BulkResourcesService(core);
973
- this.bulkRoles = new BulkRolesService(core);
974
- this.entitlements = new EntitlementsService(core);
975
- this.plans = new PlansService(core);
976
- this.resourceMembers = new ResourceMembersService(core);
977
- this.resources = new ResourcesService(core);
978
- this.roles = new RolesService(core);
979
- this.usage = new UsageService(core);
980
- this.users = new UsersService(core);
929
+ this.cacheTTL = options?.cacheTTL ?? 60 * 60 * 1e3;
930
+ this.runtimeApiUrl = options?.runtimeApiUrl ?? "https://api.blimu.dev";
931
+ }
932
+ /**
933
+ * Fetch JWK Set from runtime-api
934
+ */
935
+ async fetchJWKSet(endpoint, headers) {
936
+ console.log(`[TokenVerifier] \u{1F4E1} Fetching JWK Set from: ${endpoint}`);
937
+ if (headers) {
938
+ console.log(
939
+ `[TokenVerifier] \u{1F4E1} Request headers: ${JSON.stringify(Object.keys(headers).map((k) => `${k}: ${k === "x-api-key" ? "***" : headers[k]}`))}`
940
+ );
941
+ }
942
+ const response = await fetch(endpoint, {
943
+ method: "GET",
944
+ headers: {
945
+ "Content-Type": "application/json",
946
+ ...headers
947
+ }
948
+ });
949
+ console.log(`[TokenVerifier] \u{1F4E1} Response status: ${response.status} ${response.statusText}`);
950
+ if (!response.ok) {
951
+ const errorText = await response.text();
952
+ console.error(`[TokenVerifier] \u274C Failed to fetch JWKs: ${response.status} ${errorText}`);
953
+ throw new FetchError("Failed to fetch JWKs", response.status, errorText);
954
+ }
955
+ const jwkSet = await response.json();
956
+ console.log(`[TokenVerifier] \u2705 Successfully fetched JWK Set with ${jwkSet.keys.length} keys`);
957
+ return jwkSet;
958
+ }
959
+ /**
960
+ * Convert JWK to KeyObject
961
+ */
962
+ jwkToKeyObject(jwk) {
963
+ return crypto.createPublicKey({
964
+ key: {
965
+ kty: jwk.kty,
966
+ n: jwk.n,
967
+ e: jwk.e,
968
+ alg: jwk.alg
969
+ },
970
+ format: "jwk"
971
+ });
972
+ }
973
+ /**
974
+ * Get public key for a specific key ID
975
+ */
976
+ async getPublicKey(kid, cacheKey, endpoint, headers) {
977
+ const cached = this.cache.get(cacheKey);
978
+ if (cached && cached.expiresAt > Date.now()) {
979
+ console.log(`[TokenVerifier] \u2705 Using cached key for kid: ${kid}`);
980
+ return cached.key;
981
+ }
982
+ console.log(`[TokenVerifier] \u{1F50D} Cache miss or expired. Fetching new key for kid: ${kid}`);
983
+ const jwkSet = await this.fetchJWKSet(endpoint, headers);
984
+ const jwk = jwkSet.keys.find((k) => k.kid === kid);
985
+ if (!jwk) {
986
+ const availableKids = jwkSet.keys.map((k) => k.kid).join(", ");
987
+ console.error(
988
+ `[TokenVerifier] \u274C Key with kid '${kid}' not found in JWK Set. Available kids: ${availableKids}`
989
+ );
990
+ throw new Error(
991
+ `Key with kid '${kid}' not found in JWK Set. Available kids: ${availableKids}`
992
+ );
993
+ }
994
+ console.log(`[TokenVerifier] \u2705 Found key with kid: ${kid}`);
995
+ const keyObject = this.jwkToKeyObject(jwk);
996
+ this.cache.set(cacheKey, {
997
+ key: keyObject,
998
+ kid,
999
+ expiresAt: Date.now() + this.cacheTTL
1000
+ });
1001
+ return keyObject;
1002
+ }
1003
+ /**
1004
+ * Verify JWT token using JWKs from runtime-api
1005
+ */
1006
+ async verifyToken(options) {
1007
+ const { url, secretKey, token, runtimeApiUrl } = options;
1008
+ if (!url && !secretKey) {
1009
+ throw new Error("Either url or secretKey must be provided");
1010
+ }
1011
+ if (url && secretKey) {
1012
+ throw new Error("Cannot provide both url and secretKey");
1013
+ }
1014
+ const decoded = jwt.decode(token, { complete: true });
1015
+ if (!decoded || typeof decoded === "string") {
1016
+ throw new Error("Invalid token format");
1017
+ }
1018
+ const header = decoded.header;
1019
+ if (!header.kid) {
1020
+ throw new Error("Token missing kid in header");
1021
+ }
1022
+ let endpoint;
1023
+ let cacheKey;
1024
+ let headers;
1025
+ if (secretKey) {
1026
+ const apiUrl = runtimeApiUrl ?? this.runtimeApiUrl;
1027
+ endpoint = `${apiUrl}/v1/auth/.well-known/jwks.json`;
1028
+ cacheKey = secretKey;
1029
+ headers = {
1030
+ "x-api-key": secretKey
1031
+ };
1032
+ console.log(
1033
+ `[TokenVerifier] \u{1F50D} Verifying token with kid: ${header.kid}, endpoint: ${endpoint}`
1034
+ );
1035
+ } else {
1036
+ endpoint = url;
1037
+ cacheKey = url;
1038
+ console.log(
1039
+ `[TokenVerifier] \u{1F50D} Verifying token with kid: ${header.kid}, endpoint: ${endpoint}`
1040
+ );
1041
+ }
1042
+ let publicKey;
1043
+ try {
1044
+ publicKey = await this.getPublicKey(header.kid, cacheKey, endpoint, headers);
1045
+ console.log(`[TokenVerifier] \u2705 Successfully retrieved public key for kid: ${header.kid}`);
1046
+ } catch (error) {
1047
+ console.error(
1048
+ `[TokenVerifier] \u274C Failed to get public key (first attempt): ${error instanceof Error ? error.message : String(error)}`
1049
+ );
1050
+ this.clearCache(cacheKey);
1051
+ console.log(`[TokenVerifier] \u{1F504} Retrying after cache clear...`);
1052
+ try {
1053
+ publicKey = await this.getPublicKey(header.kid, cacheKey, endpoint, headers);
1054
+ console.log(
1055
+ `[TokenVerifier] \u2705 Successfully retrieved public key for kid: ${header.kid} (retry)`
1056
+ );
1057
+ } catch (retryError) {
1058
+ console.error(
1059
+ `[TokenVerifier] \u274C Failed to get public key (retry): ${retryError instanceof Error ? retryError.message : String(retryError)}`
1060
+ );
1061
+ throw retryError;
1062
+ }
1063
+ }
1064
+ try {
1065
+ const payload = jwt.verify(token, publicKey, {
1066
+ algorithms: ["RS256"]
1067
+ });
1068
+ console.log(`[TokenVerifier] \u2705 Token verified successfully`);
1069
+ return payload;
1070
+ } catch (error) {
1071
+ console.error(
1072
+ `[TokenVerifier] \u274C JWT verification failed: ${error instanceof Error ? error.message : String(error)}`
1073
+ );
1074
+ throw error;
1075
+ }
1076
+ }
1077
+ /**
1078
+ * Clear cache (useful for testing or key rotation)
1079
+ */
1080
+ clearCache(secretKeyOrUrl) {
1081
+ if (secretKeyOrUrl) {
1082
+ this.cache.delete(secretKeyOrUrl);
1083
+ } else {
1084
+ this.cache.clear();
1085
+ }
981
1086
  }
982
1087
  };
983
- var BlimuError = FetchError;
1088
+ async function verifyToken(options) {
1089
+ const verifier = new TokenVerifier();
1090
+ return verifier.verifyToken(options);
1091
+ }
984
1092
  export {
985
1093
  Blimu,
986
1094
  BlimuError,
987
1095
  BulkResourcesService,
988
1096
  BulkRolesService,
989
- CoreClient,
990
1097
  EntitlementsService,
991
1098
  FetchError,
992
1099
  PlansService,
@@ -994,12 +1101,15 @@ export {
994
1101
  ResourcesService,
995
1102
  RolesService,
996
1103
  schema_exports as Schema,
1104
+ TokenVerifier,
997
1105
  UsageService,
998
1106
  UsersService,
999
1107
  schema_zod_exports as ZodSchema,
1108
+ isNotUndefined,
1000
1109
  listAll,
1001
1110
  paginate,
1002
1111
  parseNDJSONStream,
1003
- parseSSEStream
1112
+ parseSSEStream,
1113
+ verifyToken
1004
1114
  };
1005
1115
  //# sourceMappingURL=index.mjs.map