cliodot 1.2.2 → 1.2.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 (147) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +81 -0
  3. package/dist/AuthAppClient.d.ts +1 -0
  4. package/dist/AuthAppClient.d.ts.map +1 -1
  5. package/dist/AuthAppClient.js +199 -1
  6. package/dist/CommercialAppClient.d.ts +178 -0
  7. package/dist/CommercialAppClient.d.ts.map +1 -0
  8. package/dist/CommercialAppClient.js +576 -0
  9. package/dist/ConnectorBuilder.js +104 -1
  10. package/dist/Events.d.ts +2 -0
  11. package/dist/Events.d.ts.map +1 -1
  12. package/dist/Events.js +325 -1
  13. package/dist/Flosync.js +296 -1
  14. package/dist/FlosyncClient.js +429 -1
  15. package/dist/FunctionBuilder.js +65 -1
  16. package/dist/IdentityAppClient.d.ts +23 -0
  17. package/dist/IdentityAppClient.d.ts.map +1 -0
  18. package/dist/IdentityAppClient.js +197 -0
  19. package/dist/MemoryAppClient.d.ts +28 -0
  20. package/dist/MemoryAppClient.d.ts.map +1 -0
  21. package/dist/MemoryAppClient.js +149 -0
  22. package/dist/MemoryClient.d.ts +8 -0
  23. package/dist/MemoryClient.d.ts.map +1 -0
  24. package/dist/MemoryClient.js +20 -0
  25. package/dist/OAuthAppClient.d.ts +1 -0
  26. package/dist/OAuthAppClient.d.ts.map +1 -1
  27. package/dist/OAuthAppClient.js +269 -1
  28. package/dist/ProviderServicesClient.d.ts +24 -0
  29. package/dist/ProviderServicesClient.d.ts.map +1 -0
  30. package/dist/ProviderServicesClient.js +158 -0
  31. package/dist/Surface.d.ts +2 -0
  32. package/dist/Surface.d.ts.map +1 -1
  33. package/dist/Surface.js +255 -1
  34. package/dist/ValidatorBuilder.js +24 -1
  35. package/dist/Webhooks.d.ts +20 -0
  36. package/dist/Webhooks.d.ts.map +1 -0
  37. package/dist/Webhooks.js +61 -0
  38. package/dist/WorkflowBuilder.js +279 -1
  39. package/dist/__tests__/CommercialAppClient.test.d.ts +2 -0
  40. package/dist/__tests__/CommercialAppClient.test.d.ts.map +1 -0
  41. package/dist/__tests__/CommercialAppClient.test.js +217 -0
  42. package/dist/__tests__/Events.test.js +191 -1
  43. package/dist/__tests__/IdentityAppClient.test.d.ts +2 -0
  44. package/dist/__tests__/IdentityAppClient.test.d.ts.map +1 -0
  45. package/dist/__tests__/IdentityAppClient.test.js +232 -0
  46. package/dist/__tests__/OAuthAppClient.test.js +300 -1
  47. package/dist/__tests__/ProviderServicesClient.test.d.ts +2 -0
  48. package/dist/__tests__/ProviderServicesClient.test.d.ts.map +1 -0
  49. package/dist/__tests__/ProviderServicesClient.test.js +131 -0
  50. package/dist/__tests__/Surface.test.js +150 -1
  51. package/dist/__tests__/errors.test.js +54 -1
  52. package/dist/__tests__/function.test.js +58 -1
  53. package/dist/__tests__/helpers.d.ts +5 -0
  54. package/dist/__tests__/helpers.d.ts.map +1 -0
  55. package/dist/__tests__/helpers.js +10 -0
  56. package/dist/__tests__/localhost-lookup.test.d.ts +2 -0
  57. package/dist/__tests__/localhost-lookup.test.d.ts.map +1 -0
  58. package/dist/__tests__/localhost-lookup.test.js +26 -0
  59. package/dist/__tests__/parse-api-error.test.js +26 -1
  60. package/dist/__tests__/runner.test.js +156 -1
  61. package/dist/connectors/builtin.js +354 -1
  62. package/dist/connectors/registry.js +300 -1
  63. package/dist/decorators/build.js +105 -1
  64. package/dist/decorators/connector.js +56 -1
  65. package/dist/decorators/index.js +34 -1
  66. package/dist/decorators/metadata.js +338 -1
  67. package/dist/decorators/steps.js +220 -1
  68. package/dist/decorators/workflow.js +52 -1
  69. package/dist/errors.js +76 -1
  70. package/dist/http/__tests__/cliodot-request.environment.test.d.ts +2 -0
  71. package/dist/http/__tests__/cliodot-request.environment.test.d.ts.map +1 -0
  72. package/dist/http/__tests__/cliodot-request.environment.test.js +37 -0
  73. package/dist/http/__tests__/cliodot-result.test.d.ts +2 -0
  74. package/dist/http/__tests__/cliodot-result.test.d.ts.map +1 -0
  75. package/dist/http/__tests__/cliodot-result.test.js +57 -0
  76. package/dist/http/__tests__/events-instance-id.test.d.ts +2 -0
  77. package/dist/http/__tests__/events-instance-id.test.d.ts.map +1 -0
  78. package/dist/http/__tests__/events-instance-id.test.js +45 -0
  79. package/dist/http/cliodot-request.d.ts +35 -0
  80. package/dist/http/cliodot-request.d.ts.map +1 -0
  81. package/dist/http/cliodot-request.js +105 -0
  82. package/dist/http/cliodot-result.d.ts +40 -0
  83. package/dist/http/cliodot-result.d.ts.map +1 -0
  84. package/dist/http/cliodot-result.js +139 -0
  85. package/dist/http/create-client.d.ts +3 -0
  86. package/dist/http/create-client.d.ts.map +1 -0
  87. package/dist/http/create-client.js +14 -0
  88. package/dist/http/events-instance-id.d.ts +11 -0
  89. package/dist/http/events-instance-id.d.ts.map +1 -0
  90. package/dist/http/events-instance-id.js +86 -0
  91. package/dist/http/localhost-lookup.d.ts +12 -0
  92. package/dist/http/localhost-lookup.d.ts.map +1 -0
  93. package/dist/http/localhost-lookup.js +67 -0
  94. package/dist/http/parse-api-error.js +56 -1
  95. package/dist/http/sanitize-execution-headers.js +79 -1
  96. package/dist/identity-offline-verify.d.ts +6 -0
  97. package/dist/identity-offline-verify.d.ts.map +1 -0
  98. package/dist/identity-offline-verify.js +174 -0
  99. package/dist/identity-token-cache.d.ts +6 -0
  100. package/dist/identity-token-cache.d.ts.map +1 -0
  101. package/dist/identity-token-cache.js +51 -0
  102. package/dist/index.d.ts +10 -0
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +108 -1
  105. package/dist/runner/ProcessorEngine.js +1311 -1
  106. package/dist/runner/connector.executor.js +1786 -1
  107. package/dist/runner/utilities/math.executor.js +153 -1
  108. package/dist/runner/utilities/random.executor.js +151 -1
  109. package/dist/runner/utilities/string.executor.js +825 -1
  110. package/dist/template.js +127 -1
  111. package/dist/transformers/StepsToNodesTransformer.js +214 -1
  112. package/dist/transformers/WorkflowTransformer.js +189 -1
  113. package/dist/types/auth-app.api.d.ts +2 -0
  114. package/dist/types/auth-app.api.d.ts.map +1 -1
  115. package/dist/types/auth-app.api.js +2 -1
  116. package/dist/types/builtin.js +2 -1
  117. package/dist/types/client.api.js +2 -1
  118. package/dist/types/commercial-app.api.d.ts +963 -0
  119. package/dist/types/commercial-app.api.d.ts.map +1 -0
  120. package/dist/types/commercial-app.api.js +2 -0
  121. package/dist/types/connector.js +2 -1
  122. package/dist/types/context.js +2 -1
  123. package/dist/types/event-app.api.d.ts +8 -0
  124. package/dist/types/event-app.api.d.ts.map +1 -1
  125. package/dist/types/event-app.api.js +2 -1
  126. package/dist/types/function.js +2 -1
  127. package/dist/types/identity-app.api.d.ts +99 -0
  128. package/dist/types/identity-app.api.d.ts.map +1 -0
  129. package/dist/types/identity-app.api.js +2 -0
  130. package/dist/types/index.js +23 -1
  131. package/dist/types/memory-app.api.d.ts +140 -0
  132. package/dist/types/memory-app.api.d.ts.map +1 -0
  133. package/dist/types/memory-app.api.js +2 -0
  134. package/dist/types/oauth-app.api.d.ts +2 -0
  135. package/dist/types/oauth-app.api.d.ts.map +1 -1
  136. package/dist/types/oauth-app.api.js +105 -1
  137. package/dist/types/provider-services.api.d.ts +98 -0
  138. package/dist/types/provider-services.api.d.ts.map +1 -0
  139. package/dist/types/provider-services.api.js +2 -0
  140. package/dist/types/validator.js +2 -1
  141. package/dist/types/webhook-app.api.d.ts +2 -0
  142. package/dist/types/webhook-app.api.d.ts.map +1 -0
  143. package/dist/types/webhook-app.api.js +2 -0
  144. package/dist/types/workflow.js +33 -1
  145. package/dist/validators/validators.js +478 -1
  146. package/dist/variable.js +37 -1
  147. package/package.json +3 -2
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createCliodotAxios = createCliodotAxios;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const localhost_lookup_1 = require("./localhost-lookup");
9
+ function createCliodotAxios(config = {}) {
10
+ return axios_1.default.create({
11
+ ...(0, localhost_lookup_1.cliodotHttpAgents)(),
12
+ ...config,
13
+ });
14
+ }
@@ -0,0 +1,11 @@
1
+ export declare const CLIODOT_INSTANCE_HEADER = "x-cliodot-instance-id";
2
+ /**
3
+ * Stable id for this Event app on this computer.
4
+ * Same machine always hashes the same; a different computer gets a new id.
5
+ */
6
+ export declare function resolveEventsInstanceId(input: {
7
+ appId: string;
8
+ instanceId?: string;
9
+ }): string;
10
+ export declare function applyInstanceHeader(headers: Record<string, string>, instanceId: string): Record<string, string>;
11
+ //# sourceMappingURL=events-instance-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-instance-id.d.ts","sourceRoot":"","sources":["../../src/http/events-instance-id.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AA+D/D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAWT;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxB"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLIODOT_INSTANCE_HEADER = void 0;
4
+ exports.resolveEventsInstanceId = resolveEventsInstanceId;
5
+ exports.applyInstanceHeader = applyInstanceHeader;
6
+ const crypto_1 = require("crypto");
7
+ exports.CLIODOT_INSTANCE_HEADER = "x-cliodot-instance-id";
8
+ const INSTANCE_ID_RE = /^[A-Za-z0-9._-]{8,128}$/;
9
+ function sha256Hex(value) {
10
+ return (0, crypto_1.createHash)("sha256").update(value).digest("hex");
11
+ }
12
+ function isNodeRuntime() {
13
+ return typeof process !== "undefined" && Boolean(process.versions?.node);
14
+ }
15
+ function nodeMachineSeed() {
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
17
+ const os = require("os");
18
+ let username = "";
19
+ try {
20
+ username = os.userInfo()?.username || "";
21
+ }
22
+ catch {
23
+ username = "";
24
+ }
25
+ return [
26
+ os.hostname?.() || "",
27
+ os.platform?.() || "",
28
+ os.arch?.() || "",
29
+ username,
30
+ os.homedir?.() || "",
31
+ os.cpus?.()?.[0]?.model || "",
32
+ ].join("|");
33
+ }
34
+ function readGlobal(name) {
35
+ return globalThis[name];
36
+ }
37
+ function browserInstanceSeed(appId) {
38
+ const key = `cliodot.events.instance.${appId}`;
39
+ const storage = readGlobal("localStorage");
40
+ try {
41
+ if (storage && typeof storage.getItem === "function") {
42
+ let stored = String(storage.getItem(key) || "");
43
+ if (!stored) {
44
+ stored =
45
+ typeof crypto_1.randomUUID === "function"
46
+ ? (0, crypto_1.randomUUID)()
47
+ : sha256Hex(`${Date.now()}.${Math.random()}`);
48
+ storage.setItem(key, stored);
49
+ }
50
+ return stored;
51
+ }
52
+ }
53
+ catch {
54
+ // private mode / disabled storage
55
+ }
56
+ const nav = readGlobal("navigator");
57
+ const scr = readGlobal("screen");
58
+ return [
59
+ nav?.userAgent || "",
60
+ nav?.language || "",
61
+ String(scr?.width || ""),
62
+ String(scr?.height || ""),
63
+ ].join("|");
64
+ }
65
+ /**
66
+ * Stable id for this Event app on this computer.
67
+ * Same machine always hashes the same; a different computer gets a new id.
68
+ */
69
+ function resolveEventsInstanceId(input) {
70
+ const override = input.instanceId?.trim();
71
+ if (override) {
72
+ if (INSTANCE_ID_RE.test(override))
73
+ return override;
74
+ return sha256Hex(`cliodot-events:${input.appId}:override:${override}`);
75
+ }
76
+ const seed = isNodeRuntime()
77
+ ? nodeMachineSeed()
78
+ : browserInstanceSeed(input.appId);
79
+ return sha256Hex(`cliodot-events|${input.appId}|${seed}`);
80
+ }
81
+ function applyInstanceHeader(headers, instanceId) {
82
+ if (instanceId) {
83
+ headers[exports.CLIODOT_INSTANCE_HEADER] = instanceId;
84
+ }
85
+ return headers;
86
+ }
@@ -0,0 +1,12 @@
1
+ import http from "http";
2
+ import https from "https";
3
+ import type { LookupAddress, LookupOptions } from "dns";
4
+ type LookupCallback = (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family?: number) => void;
5
+ export declare function isLoopbackHostname(hostname: string): boolean;
6
+ export declare function localhostAwareLookup(hostname: string, options: LookupOptions | number | LookupCallback, callback?: LookupCallback): void;
7
+ export declare function cliodotHttpAgents(): {
8
+ httpAgent?: http.Agent;
9
+ httpsAgent?: https.Agent;
10
+ };
11
+ export {};
12
+ //# sourceMappingURL=localhost-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localhost-lookup.d.ts","sourceRoot":"","sources":["../../src/http/localhost-lookup.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAExD,KAAK,cAAc,GAAG,CACpB,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EACjC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,EACjC,MAAM,CAAC,EAAE,MAAM,KACZ,IAAI,CAAC;AAEV,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,cAAc,EAChD,QAAQ,CAAC,EAAE,cAAc,GACxB,IAAI,CA4BN;AASD,wBAAgB,iBAAiB,IAAI;IACnC,SAAS,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;CAC1B,CAeA"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isLoopbackHostname = isLoopbackHostname;
7
+ exports.localhostAwareLookup = localhostAwareLookup;
8
+ exports.cliodotHttpAgents = cliodotHttpAgents;
9
+ const dns_1 = __importDefault(require("dns"));
10
+ const http_1 = __importDefault(require("http"));
11
+ const https_1 = __importDefault(require("https"));
12
+ function isLoopbackHostname(hostname) {
13
+ const host = String(hostname || "")
14
+ .trim()
15
+ .toLowerCase()
16
+ .replace(/\.$/, "");
17
+ return host === "localhost" || host.endsWith(".localhost");
18
+ }
19
+ function localhostAwareLookup(hostname, options, callback) {
20
+ if (typeof options === "function") {
21
+ callback = options;
22
+ options = {};
23
+ }
24
+ const cb = callback;
25
+ if (!cb)
26
+ return;
27
+ const opts = typeof options === "number" ? { family: options } : options || {};
28
+ if (isLoopbackHostname(hostname)) {
29
+ if (opts.family === 6) {
30
+ if (opts.all) {
31
+ cb(null, [{ address: "::1", family: 6 }]);
32
+ return;
33
+ }
34
+ cb(null, "::1", 6);
35
+ return;
36
+ }
37
+ if (opts.all) {
38
+ cb(null, [{ address: "127.0.0.1", family: 4 }]);
39
+ return;
40
+ }
41
+ cb(null, "127.0.0.1", 4);
42
+ return;
43
+ }
44
+ dns_1.default.lookup(hostname, opts, cb);
45
+ }
46
+ function isNodeRuntime() {
47
+ return typeof process !== "undefined" && Boolean(process.versions?.node);
48
+ }
49
+ let httpAgent;
50
+ let httpsAgent;
51
+ function cliodotHttpAgents() {
52
+ if (!isNodeRuntime())
53
+ return {};
54
+ if (!httpAgent) {
55
+ httpAgent = new http_1.default.Agent({
56
+ keepAlive: true,
57
+ lookup: localhostAwareLookup,
58
+ });
59
+ }
60
+ if (!httpsAgent) {
61
+ httpsAgent = new https_1.default.Agent({
62
+ keepAlive: true,
63
+ lookup: localhostAwareLookup,
64
+ });
65
+ }
66
+ return { httpAgent, httpsAgent };
67
+ }
@@ -1 +1,56 @@
1
- 'use strict';const _0x11d727=_0x3133;(function(_0x5beb2c,_0x339dff){const _0x24b8ed=_0x3133,_0x505c49=_0x5beb2c();while(!![]){try{const _0x52540a=parseInt(_0x24b8ed(0xef))/0x1+parseInt(_0x24b8ed(0xe8))/0x2*(-parseInt(_0x24b8ed(0xed))/0x3)+-parseInt(_0x24b8ed(0xd9))/0x4*(-parseInt(_0x24b8ed(0xde))/0x5)+parseInt(_0x24b8ed(0xe0))/0x6*(parseInt(_0x24b8ed(0xe9))/0x7)+-parseInt(_0x24b8ed(0xda))/0x8*(-parseInt(_0x24b8ed(0xea))/0x9)+parseInt(_0x24b8ed(0xdc))/0xa*(-parseInt(_0x24b8ed(0xee))/0xb)+parseInt(_0x24b8ed(0xec))/0xc;if(_0x52540a===_0x339dff)break;else _0x505c49['push'](_0x505c49['shift']());}catch(_0x137597){_0x505c49['push'](_0x505c49['shift']());}}}(_0xaa1d,0xabb99));Object['defineProperty'](exports,_0x11d727(0xe6),{'value':!![]}),exports[_0x11d727(0xe4)]=parseApiErrorMessage,exports[_0x11d727(0xe5)]=parseApiErrorCode,exports[_0x11d727(0xdf)]=parseApiErrorStatus;function _0x3133(_0x1bf49f,_0x558dba){_0x1bf49f=_0x1bf49f-0xd9;const _0xaa1dc=_0xaa1d();let _0x313325=_0xaa1dc[_0x1bf49f];if(_0x3133['AEJtUL']===undefined){var _0xfa982f=function(_0x29ae7e){const _0x4e34f3='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x41cfdb='',_0x402463='';for(let _0x29674a=0x0,_0x648a84,_0x434d27,_0x3b0c2a=0x0;_0x434d27=_0x29ae7e['charAt'](_0x3b0c2a++);~_0x434d27&&(_0x648a84=_0x29674a%0x4?_0x648a84*0x40+_0x434d27:_0x434d27,_0x29674a++%0x4)?_0x41cfdb+=String['fromCharCode'](0xff&_0x648a84>>(-0x2*_0x29674a&0x6)):0x0){_0x434d27=_0x4e34f3['indexOf'](_0x434d27);}for(let _0xa5a88d=0x0,_0x3bae76=_0x41cfdb['length'];_0xa5a88d<_0x3bae76;_0xa5a88d++){_0x402463+='%'+('00'+_0x41cfdb['charCodeAt'](_0xa5a88d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x402463);};_0x3133['OXXrWV']=_0xfa982f,_0x3133['aWNQeF']={},_0x3133['AEJtUL']=!![];}const _0x252947=_0xaa1dc[0x0],_0x5032eb=_0x1bf49f+_0x252947,_0x30d7ce=_0x3133['aWNQeF'][_0x5032eb];return!_0x30d7ce?(_0x313325=_0x3133['OXXrWV'](_0x313325),_0x3133['aWNQeF'][_0x5032eb]=_0x313325):_0x313325=_0x30d7ce,_0x313325;}function parseApiErrorMessage(_0x41cfdb){const _0x8c0058=_0x11d727;if(!_0x41cfdb||typeof _0x41cfdb!==_0x8c0058(0xe1))return typeof _0x41cfdb===_0x8c0058(0xdb)&&_0x41cfdb[_0x8c0058(0xeb)]()?_0x41cfdb[_0x8c0058(0xeb)]():undefined;const _0x402463=_0x41cfdb;if(typeof _0x402463[_0x8c0058(0xe2)]===_0x8c0058(0xdb)&&_0x402463[_0x8c0058(0xe2)][_0x8c0058(0xeb)]())return _0x402463[_0x8c0058(0xe2)]['trim']();if(typeof _0x402463[_0x8c0058(0xe3)]===_0x8c0058(0xdb)&&_0x402463[_0x8c0058(0xe3)]['trim']())return _0x402463['error']['trim']();if(_0x402463[_0x8c0058(0xe3)]&&typeof _0x402463[_0x8c0058(0xe3)]===_0x8c0058(0xe1)){const _0x29674a=_0x402463['error'];if(typeof _0x29674a['message']===_0x8c0058(0xdb)&&_0x29674a[_0x8c0058(0xe2)][_0x8c0058(0xeb)]())return _0x29674a[_0x8c0058(0xe2)][_0x8c0058(0xeb)]();}return undefined;}function parseApiErrorCode(_0x648a84){const _0x5e35a3=_0x11d727;if(!_0x648a84||typeof _0x648a84!=='object')return undefined;const _0x434d27=_0x648a84;if(_0x434d27[_0x5e35a3(0xe3)]&&typeof _0x434d27[_0x5e35a3(0xe3)]==='object'){const _0x3b0c2a=_0x434d27[_0x5e35a3(0xe3)];if(typeof _0x3b0c2a[_0x5e35a3(0xe7)]===_0x5e35a3(0xdb)&&_0x3b0c2a[_0x5e35a3(0xe7)]['trim']())return _0x3b0c2a[_0x5e35a3(0xe7)]['trim']();}if(typeof _0x434d27[_0x5e35a3(0xe7)]===_0x5e35a3(0xdb)&&_0x434d27[_0x5e35a3(0xe7)][_0x5e35a3(0xeb)]())return _0x434d27[_0x5e35a3(0xe7)][_0x5e35a3(0xeb)]();return undefined;}function _0xaa1d(){const _0x553c0a=['owj5t3bxAW','DhjPBq','mZG5ntyWoejqv3LfuW','mZLIAunsv0W','mtmZmJG4mwTyv0X6sq','otG4nZeWuxrOAurA','BNvTyMvY','nZqYmtu2z1jgCM1L','mtiZnZK4nez4wfLeBq','C3rYAw5N','odbZwhr0sMq','C3rHDhvZq29Kzq','mtb5s3nOwwm','CgfYC2vbCgLfCNjVCLn0yxr1CW','mJKZmJKZmML3BKHmvq','B2jQzwn0','BwvZC2fNzq','zxjYB3i','CgfYC2vbCgLfCNjVCK1LC3nHz2u','CgfYC2vbCgLfCNjVCKnVzgu','x19LC01VzhvSzq','y29Kzq','mtaWoda2ufHez0XT','n0nLrLbpAG'];_0xaa1d=function(){return _0x553c0a;};return _0xaa1d();}function parseApiErrorStatus(_0xa5a88d,_0x3bae76){const _0x47d5f1=_0x11d727;if(!_0xa5a88d||typeof _0xa5a88d!==_0x47d5f1(0xe1))return _0x3bae76;const _0xe716fa=_0xa5a88d;if(typeof _0xe716fa[_0x47d5f1(0xdd)]==='number')return _0xe716fa[_0x47d5f1(0xdd)];if(_0xe716fa[_0x47d5f1(0xe3)]&&typeof _0xe716fa[_0x47d5f1(0xe3)]===_0x47d5f1(0xe1)){const _0x144081=_0xe716fa[_0x47d5f1(0xe3)];if(typeof _0x144081[_0x47d5f1(0xdd)]===_0x47d5f1(0xf0))return _0x144081[_0x47d5f1(0xdd)];}return _0x3bae76;}
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseApiErrorMessage = parseApiErrorMessage;
4
+ exports.parseApiErrorCode = parseApiErrorCode;
5
+ exports.parseApiErrorStatus = parseApiErrorStatus;
6
+ function parseApiErrorMessage(data) {
7
+ if (!data || typeof data !== "object") {
8
+ return typeof data === "string" && data.trim() ? data.trim() : undefined;
9
+ }
10
+ const body = data;
11
+ if (typeof body.message === "string" && body.message.trim()) {
12
+ return body.message.trim();
13
+ }
14
+ if (typeof body.error === "string" && body.error.trim()) {
15
+ return body.error.trim();
16
+ }
17
+ if (body.error && typeof body.error === "object") {
18
+ const nested = body.error;
19
+ if (typeof nested.message === "string" && nested.message.trim()) {
20
+ return nested.message.trim();
21
+ }
22
+ }
23
+ return undefined;
24
+ }
25
+ function parseApiErrorCode(data) {
26
+ if (!data || typeof data !== "object") {
27
+ return undefined;
28
+ }
29
+ const body = data;
30
+ if (body.error && typeof body.error === "object") {
31
+ const nested = body.error;
32
+ if (typeof nested.code === "string" && nested.code.trim()) {
33
+ return nested.code.trim();
34
+ }
35
+ }
36
+ if (typeof body.code === "string" && body.code.trim()) {
37
+ return body.code.trim();
38
+ }
39
+ return undefined;
40
+ }
41
+ function parseApiErrorStatus(data, fallback) {
42
+ if (!data || typeof data !== "object") {
43
+ return fallback;
44
+ }
45
+ const body = data;
46
+ if (typeof body.statusCode === "number") {
47
+ return body.statusCode;
48
+ }
49
+ if (body.error && typeof body.error === "object") {
50
+ const nested = body.error;
51
+ if (typeof nested.statusCode === "number") {
52
+ return nested.statusCode;
53
+ }
54
+ }
55
+ return fallback;
56
+ }
@@ -1 +1,79 @@
1
- 'use strict';function _0x15e7(){const _0x2003e4=['A2vLCc1HBgL2zq','ndi5mJHkv2nYs2G','DhjHAwXLCG','C3rYAw5N','nJaYmtq2zgniENPR','mJmZmZGYmZb5DwH2ruu','Bwf4vMfSDwvmzw4','Bwf4vg90ywXwywX1zunOyxjZ','yM9VBgvHBG','DxbNCMfKzq','BgvUz3rO','AgfZ','mtyYmdGWtfDkA0Df','mtK5oeLlthHNta','y29UBMvJDgLVBG','zMfSC2u','zMLUza','mtmYnJzvvfrrru4','C2XPy2u','D3D3lwf1DgHLBNrPy2f0zq','C3rHCNrZv2L0Aa','x19LC01VzhvSzq','Bwf4tMfTzuXLBG','C2fUAxrPEMvfEgvJDxrPB25izwfKzxjZ','zxHWzwn0','C2v0lwnVB2TPzq','Bwf4s2v5CW','AxngAw5PDgu','DhjHBNnMzxiTzw5JB2rPBMC','mtvIsLzdDKi','mZiWvu9xqNzA','zw50CMLLCW','zgvMAw5LuhjVCgvYDhK','B2jQzwn0','y29VA2LL','AxnbCNjHEq','ndu5odi3ovH4v3rOyG','ChjVEhKT','ndq3nti4zeT3AMXN','BNvTyMvY','DhjPBq','Dg9mB3DLCKnHC2u','Ag9ZDa'];_0x15e7=function(){return _0x2003e4;};return _0x15e7();}const _0x329a6d=_0x348d;(function(_0x1fbd2b,_0x348a97){const _0x53c0c2=_0x348d,_0x4cab0e=_0x1fbd2b();while(!![]){try{const _0x41dbc1=-parseInt(_0x53c0c2(0xde))/0x1+-parseInt(_0x53c0c2(0xd6))/0x2+-parseInt(_0x53c0c2(0xc4))/0x3*(parseInt(_0x53c0c2(0xcd))/0x4)+-parseInt(_0x53c0c2(0xc5))/0x5*(parseInt(_0x53c0c2(0xb8))/0x6)+parseInt(_0x53c0c2(0xcb))/0x7+parseInt(_0x53c0c2(0xd3))/0x8*(-parseInt(_0x53c0c2(0xdf))/0x9)+parseInt(_0x53c0c2(0xd7))/0xa;if(_0x41dbc1===_0x348a97)break;else _0x4cab0e['push'](_0x4cab0e['shift']());}catch(_0x232945){_0x4cab0e['push'](_0x4cab0e['shift']());}}}(_0x15e7,0x9b209));Object[_0x329a6d(0xc7)](exports,_0x329a6d(0xbc),{'value':!![]}),exports[_0x329a6d(0xbe)]=sanitizeExecutionHeaders;function _0x348d(_0x471ae9,_0x1103dd){_0x471ae9=_0x471ae9-0xb6;const _0x15e757=_0x15e7();let _0x348d9f=_0x15e757[_0x471ae9];if(_0x348d['ZQKLZA']===undefined){var _0x179adc=function(_0x2fc9ff){const _0x417de1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3dcbc9='',_0x38b870='';for(let _0x57b0cf=0x0,_0x50b6e8,_0xf373c7,_0x11a0f3=0x0;_0xf373c7=_0x2fc9ff['charAt'](_0x11a0f3++);~_0xf373c7&&(_0x50b6e8=_0x57b0cf%0x4?_0x50b6e8*0x40+_0xf373c7:_0xf373c7,_0x57b0cf++%0x4)?_0x3dcbc9+=String['fromCharCode'](0xff&_0x50b6e8>>(-0x2*_0x57b0cf&0x6)):0x0){_0xf373c7=_0x417de1['indexOf'](_0xf373c7);}for(let _0x31e400=0x0,_0xabe84c=_0x3dcbc9['length'];_0x31e400<_0xabe84c;_0x31e400++){_0x38b870+='%'+('00'+_0x3dcbc9['charCodeAt'](_0x31e400)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x38b870);};_0x348d['gFuSVI']=_0x179adc,_0x348d['CuCdZN']={},_0x348d['ZQKLZA']=!![];}const _0x2a6342=_0x15e757[0x0],_0x5ae2ba=_0x471ae9+_0x2a6342,_0x1e2795=_0x348d['CuCdZN'][_0x5ae2ba];return!_0x1e2795?(_0x348d9f=_0x348d['gFuSVI'](_0x348d9f),_0x348d['CuCdZN'][_0x5ae2ba]=_0x348d9f):_0x348d9f=_0x1e2795,_0x348d9f;}const BLOCKED_FOR_EXPLICIT_HEADERS=new Set(['proxy-authorization',_0x329a6d(0xc9),_0x329a6d(0xc0),_0x329a6d(0xd1),_0x329a6d(0xe0),'content-length',_0x329a6d(0xbf),_0x329a6d(0xdb),'te',_0x329a6d(0xd4),_0x329a6d(0xc3),_0x329a6d(0xd2),_0x329a6d(0xba)]),DEFAULT_MAX_KEYS=0x30,DEFAULT_MAX_NAME_LEN=0x80,DEFAULT_MAX_VALUE_LEN=0x2000,DEFAULT_MAX_TOTAL_VALUE_CHARS=0x10000;function isBlockedForExplicitExecutionHeaders(_0x3dcbc9){const _0xe8060d=_0x329a6d;if(BLOCKED_FOR_EXPLICIT_HEADERS[_0xe8060d(0xdd)](_0x3dcbc9))return!![];if(_0x3dcbc9[_0xe8060d(0xbb)]('sec-'))return!![];if(_0x3dcbc9[_0xe8060d(0xbb)](_0xe8060d(0xcc)))return!![];return![];}function coerceHeaderValue(value){const _0x4a274d=_0x329a6d;if(value===undefined||value===null)return null;if(typeof value===_0x4a274d(0xd5))return value;if(typeof value===_0x4a274d(0xce)&&Number[_0x4a274d(0xc2)](value))return String(value);if(typeof value===_0x4a274d(0xda))return value?'true':_0x4a274d(0xb6);if(Array['isArray'](value)){const _0x38b870=value[_0x4a274d(0xb7)](_0x57b0cf=>_0x57b0cf!==undefined&&_0x57b0cf!==null);return coerceHeaderValue(_0x38b870);}return null;}function sanitizeExecutionHeaders(_0x50b6e8,_0xf373c7){const _0x1a63d4=_0x329a6d,_0x11a0f3=_0xf373c7?.[_0x1a63d4(0xc1)]??DEFAULT_MAX_KEYS,_0x31e400=_0xf373c7?.[_0x1a63d4(0xbd)]??DEFAULT_MAX_NAME_LEN,_0xabe84c=_0xf373c7?.[_0x1a63d4(0xd8)]??DEFAULT_MAX_VALUE_LEN,_0x163ddf=_0xf373c7?.[_0x1a63d4(0xd9)]??DEFAULT_MAX_TOTAL_VALUE_CHARS;if(!_0x50b6e8||typeof _0x50b6e8!==_0x1a63d4(0xc8)||Array[_0x1a63d4(0xca)](_0x50b6e8))return{};let _0x11babd=0x0;const _0x382091={};let _0x49270b=0x0;for(const [_0x1eebb7,_0x2d651e]of Object[_0x1a63d4(0xc6)](_0x50b6e8)){if(_0x49270b>=_0x11a0f3)break;if(typeof _0x1eebb7!==_0x1a63d4(0xd5))continue;const _0x45683f=_0x1eebb7[_0x1a63d4(0xcf)]();if(!_0x45683f||_0x45683f['length']>_0x31e400)continue;const _0x1a4bc2=_0x45683f[_0x1a63d4(0xd0)]();if(isBlockedForExplicitExecutionHeaders(_0x1a4bc2))continue;const _0x272b43=coerceHeaderValue(_0x2d651e);if(_0x272b43===null)continue;const _0x4c584f=_0x272b43[_0x1a63d4(0xdc)]>_0xabe84c?_0x272b43[_0x1a63d4(0xb9)](0x0,_0xabe84c):_0x272b43;if(_0x11babd+_0x4c584f['length']>_0x163ddf)break;_0x11babd+=_0x4c584f['length'],_0x382091[_0x1a4bc2]=_0x4c584f,_0x49270b+=0x1;}return _0x382091;}
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeExecutionHeaders = sanitizeExecutionHeaders;
4
+ const BLOCKED_FOR_EXPLICIT_HEADERS = new Set([
5
+ "proxy-authorization",
6
+ "cookie",
7
+ "set-cookie",
8
+ "host",
9
+ "connection",
10
+ "content-length",
11
+ "expect",
12
+ "upgrade",
13
+ "te",
14
+ "trailer",
15
+ "transfer-encoding",
16
+ "keep-alive",
17
+ "www-authenticate",
18
+ ]);
19
+ const DEFAULT_MAX_KEYS = 48;
20
+ const DEFAULT_MAX_NAME_LEN = 128;
21
+ const DEFAULT_MAX_VALUE_LEN = 8192;
22
+ const DEFAULT_MAX_TOTAL_VALUE_CHARS = 65536;
23
+ function isBlockedForExplicitExecutionHeaders(lower) {
24
+ if (BLOCKED_FOR_EXPLICIT_HEADERS.has(lower))
25
+ return true;
26
+ if (lower.startsWith("sec-"))
27
+ return true;
28
+ if (lower.startsWith("proxy-"))
29
+ return true;
30
+ return false;
31
+ }
32
+ function coerceHeaderValue(value) {
33
+ if (value === undefined || value === null)
34
+ return null;
35
+ if (typeof value === "string")
36
+ return value;
37
+ if (typeof value === "number" && Number.isFinite(value))
38
+ return String(value);
39
+ if (typeof value === "boolean")
40
+ return value ? "true" : "false";
41
+ if (Array.isArray(value)) {
42
+ const first = value.find((x) => x !== undefined && x !== null);
43
+ return coerceHeaderValue(first);
44
+ }
45
+ return null;
46
+ }
47
+ function sanitizeExecutionHeaders(raw, limits) {
48
+ const maxKeys = limits?.maxKeys ?? DEFAULT_MAX_KEYS;
49
+ const maxNameLen = limits?.maxNameLen ?? DEFAULT_MAX_NAME_LEN;
50
+ const maxValueLen = limits?.maxValueLen ?? DEFAULT_MAX_VALUE_LEN;
51
+ const maxTotalValueChars = limits?.maxTotalValueChars ?? DEFAULT_MAX_TOTAL_VALUE_CHARS;
52
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
53
+ return {};
54
+ let totalChars = 0;
55
+ const out = {};
56
+ let count = 0;
57
+ for (const [k, v] of Object.entries(raw)) {
58
+ if (count >= maxKeys)
59
+ break;
60
+ if (typeof k !== "string")
61
+ continue;
62
+ const name = k.trim();
63
+ if (!name || name.length > maxNameLen)
64
+ continue;
65
+ const lower = name.toLowerCase();
66
+ if (isBlockedForExplicitExecutionHeaders(lower))
67
+ continue;
68
+ const val = coerceHeaderValue(v);
69
+ if (val === null)
70
+ continue;
71
+ const clipped = val.length > maxValueLen ? val.slice(0, maxValueLen) : val;
72
+ if (totalChars + clipped.length > maxTotalValueChars)
73
+ break;
74
+ totalChars += clipped.length;
75
+ out[lower] = clipped;
76
+ count += 1;
77
+ }
78
+ return out;
79
+ }
@@ -0,0 +1,6 @@
1
+ import type { IdentityOfflineVerifyOptions } from "./types/identity-app.api";
2
+ export declare function clearIdentityJwksCache(): void;
3
+ export declare function verifyIdentityTokenOffline(token: string, options: IdentityOfflineVerifyOptions): Promise<Record<string, unknown>>;
4
+ export declare function parseIdentityScopeClaim(tokenOrClaims: string | Record<string, unknown>): string[];
5
+ export declare function tokenHasScopes(tokenOrClaims: string | Record<string, unknown>, required: string[]): boolean;
6
+ //# sourceMappingURL=identity-offline-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-offline-verify.d.ts","sourceRoot":"","sources":["../src/identity-offline-verify.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,4BAA4B,EAC7B,MAAM,0BAA0B,CAAC;AAoElC,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4ElC;AAED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9C,MAAM,EAAE,CA8BV;AAED,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAQT"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.clearIdentityJwksCache = clearIdentityJwksCache;
7
+ exports.verifyIdentityTokenOffline = verifyIdentityTokenOffline;
8
+ exports.parseIdentityScopeClaim = parseIdentityScopeClaim;
9
+ exports.tokenHasScopes = tokenHasScopes;
10
+ const crypto_1 = __importDefault(require("crypto"));
11
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
12
+ const errors_1 = require("./errors");
13
+ const jwksCache = new Map();
14
+ function decodeJwtHeader(token) {
15
+ const parts = token.split(".");
16
+ if (parts.length < 2) {
17
+ throw new errors_1.CliodotApiError("Invalid JWT", { code: "IDENTITY_TOKEN_INVALID" });
18
+ }
19
+ try {
20
+ return JSON.parse(Buffer.from(parts[0], "base64url").toString("utf8"));
21
+ }
22
+ catch {
23
+ throw new errors_1.CliodotApiError("Invalid JWT header", {
24
+ code: "IDENTITY_TOKEN_INVALID",
25
+ });
26
+ }
27
+ }
28
+ function jwkToPem(jwk) {
29
+ return crypto_1.default
30
+ .createPublicKey({ key: jwk, format: "jwk" })
31
+ .export({ type: "spki", format: "pem" })
32
+ .toString();
33
+ }
34
+ async function loadJwksKeys(jwksUrl, cacheTtlMs, fetchImpl) {
35
+ const cached = jwksCache.get(jwksUrl);
36
+ if (cached && cached.expiresAt > Date.now()) {
37
+ return cached.keys;
38
+ }
39
+ const res = await fetchImpl(jwksUrl);
40
+ if (!res.ok) {
41
+ throw new errors_1.CliodotApiError(`JWKS fetch failed (${res.status})`, {
42
+ status: res.status,
43
+ code: "IDENTITY_JWT_KEYS_NOT_FOUND",
44
+ });
45
+ }
46
+ const body = (await res.json());
47
+ const keys = body.keys || [];
48
+ jwksCache.set(jwksUrl, {
49
+ keys,
50
+ expiresAt: Date.now() + cacheTtlMs,
51
+ });
52
+ return keys;
53
+ }
54
+ function pickRs256Key(keys, kid) {
55
+ if (kid) {
56
+ const match = keys.find((k) => k.kid === kid);
57
+ if (match)
58
+ return match;
59
+ }
60
+ return keys[0];
61
+ }
62
+ function clearIdentityJwksCache() {
63
+ jwksCache.clear();
64
+ }
65
+ async function verifyIdentityTokenOffline(token, options) {
66
+ if (!token?.trim()) {
67
+ throw new errors_1.CliodotApiError("token is required", {
68
+ code: "IDENTITY_TOKEN_INVALID",
69
+ });
70
+ }
71
+ const header = decodeJwtHeader(token.trim());
72
+ if (options.algorithm === "HS256") {
73
+ if (!options.secret?.trim()) {
74
+ throw new errors_1.CliodotApiError("HS256 verify requires secret");
75
+ }
76
+ try {
77
+ return jsonwebtoken_1.default.verify(token.trim(), options.secret, {
78
+ algorithms: ["HS256"],
79
+ });
80
+ }
81
+ catch (err) {
82
+ if (err?.name === "TokenExpiredError") {
83
+ throw new errors_1.CliodotApiError("Access token expired", {
84
+ code: "IDENTITY_TOKEN_EXPIRED",
85
+ status: 401,
86
+ });
87
+ }
88
+ throw new errors_1.CliodotApiError("Invalid access token", {
89
+ code: "IDENTITY_TOKEN_INVALID",
90
+ status: 401,
91
+ });
92
+ }
93
+ }
94
+ const fetchImpl = options.fetch || fetch;
95
+ let publicKeyPem = options.publicKeyPem?.trim();
96
+ if (!publicKeyPem) {
97
+ if (!options.jwksUrl?.trim()) {
98
+ throw new errors_1.CliodotApiError("RS256 verify requires jwksUrl or publicKeyPem");
99
+ }
100
+ const cacheTtlMs = options.cacheTtlMs ?? 300000;
101
+ let keys = await loadJwksKeys(options.jwksUrl.trim(), cacheTtlMs, fetchImpl);
102
+ let jwk = pickRs256Key(keys, header.kid);
103
+ if (!jwk && header.kid) {
104
+ jwksCache.delete(options.jwksUrl.trim());
105
+ keys = await loadJwksKeys(options.jwksUrl.trim(), cacheTtlMs, fetchImpl);
106
+ jwk = pickRs256Key(keys, header.kid);
107
+ }
108
+ if (!jwk) {
109
+ throw new errors_1.CliodotApiError("No matching JWKS key", {
110
+ code: "IDENTITY_JWT_KEYS_NOT_FOUND",
111
+ status: 401,
112
+ });
113
+ }
114
+ publicKeyPem = jwkToPem(jwk);
115
+ }
116
+ try {
117
+ return jsonwebtoken_1.default.verify(token.trim(), publicKeyPem, {
118
+ algorithms: ["RS256"],
119
+ });
120
+ }
121
+ catch (err) {
122
+ if (err?.name === "TokenExpiredError") {
123
+ throw new errors_1.CliodotApiError("Access token expired", {
124
+ code: "IDENTITY_TOKEN_EXPIRED",
125
+ status: 401,
126
+ });
127
+ }
128
+ throw new errors_1.CliodotApiError("Invalid access token", {
129
+ code: "IDENTITY_TOKEN_INVALID",
130
+ status: 401,
131
+ });
132
+ }
133
+ }
134
+ function parseIdentityScopeClaim(tokenOrClaims) {
135
+ let claims;
136
+ if (typeof tokenOrClaims === "string") {
137
+ const parts = tokenOrClaims.split(".");
138
+ if (parts.length < 2)
139
+ return [];
140
+ try {
141
+ claims = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
142
+ }
143
+ catch {
144
+ return [];
145
+ }
146
+ }
147
+ else {
148
+ claims = tokenOrClaims;
149
+ }
150
+ const raw = claims.scope;
151
+ if (Array.isArray(raw)) {
152
+ return [...new Set(raw.map(String).map((s) => s.trim()).filter(Boolean))];
153
+ }
154
+ if (typeof raw === "string") {
155
+ return [
156
+ ...new Set(raw
157
+ .split(/[\s,]+/)
158
+ .map((s) => s.trim())
159
+ .filter(Boolean)),
160
+ ];
161
+ }
162
+ return [];
163
+ }
164
+ function tokenHasScopes(tokenOrClaims, required) {
165
+ const have = new Set(parseIdentityScopeClaim(tokenOrClaims));
166
+ for (const name of required || []) {
167
+ const n = String(name || "").trim();
168
+ if (!n)
169
+ continue;
170
+ if (!have.has(n))
171
+ return false;
172
+ }
173
+ return true;
174
+ }
@@ -0,0 +1,6 @@
1
+ import type { IdentityTokenCacheOptions } from "./types/identity-app.api";
2
+ export declare function createIdentityTokenCache(options: IdentityTokenCacheOptions): {
3
+ getAccessToken: (targetAppId: string) => Promise<string>;
4
+ clear: (targetAppId?: string) => void;
5
+ };
6
+ //# sourceMappingURL=identity-token-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-token-cache.d.ts","sourceRoot":"","sources":["../src/identity-token-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB;kCAI9B,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;0BAoCtC,MAAM,KAAG,IAAI;EAS3C"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIdentityTokenCache = createIdentityTokenCache;
4
+ const errors_1 = require("./errors");
5
+ function createIdentityTokenCache(options) {
6
+ const store = new Map();
7
+ const skewSeconds = options.skewSeconds ?? 60;
8
+ async function getAccessToken(targetAppId) {
9
+ if (!targetAppId?.trim()) {
10
+ throw new errors_1.CliodotApiError("targetAppId is required");
11
+ }
12
+ const key = targetAppId.trim();
13
+ const cached = store.get(key);
14
+ const now = Date.now();
15
+ if (cached && cached.expires_at - skewSeconds * 1000 > now) {
16
+ return cached.access_token;
17
+ }
18
+ let tokens;
19
+ if (cached?.refresh_token) {
20
+ try {
21
+ tokens = await options.client.refresh({
22
+ refresh_token: cached.refresh_token,
23
+ });
24
+ }
25
+ catch {
26
+ tokens = await options.client.authenticate({
27
+ target_app_id: key,
28
+ });
29
+ }
30
+ }
31
+ else {
32
+ tokens = await options.client.authenticate({
33
+ target_app_id: key,
34
+ });
35
+ }
36
+ store.set(key, {
37
+ access_token: tokens.access_token,
38
+ refresh_token: tokens.refresh_token,
39
+ expires_at: Date.now() + Math.max(1, tokens.expires_in) * 1000,
40
+ });
41
+ return tokens.access_token;
42
+ }
43
+ function clear(targetAppId) {
44
+ if (targetAppId?.trim()) {
45
+ store.delete(targetAppId.trim());
46
+ return;
47
+ }
48
+ store.clear();
49
+ }
50
+ return { getAccessToken, clear };
51
+ }
package/dist/index.d.ts CHANGED
@@ -10,6 +10,13 @@ export type { FlosyncClientConfig } from "./FlosyncClient";
10
10
  export { OAuthAppClient } from "./OAuthAppClient";
11
11
  export { AuthAppClient } from "./AuthAppClient";
12
12
  export { Events } from "./Events";
13
+ export { MemoryAppClient } from "./MemoryAppClient";
14
+ export { MemoryClient } from "./MemoryClient";
15
+ export { IdentityAppClient } from "./IdentityAppClient";
16
+ export { CommercialAppClient } from "./CommercialAppClient";
17
+ export { verifyIdentityTokenOffline, clearIdentityJwksCache, tokenHasScopes, parseIdentityScopeClaim, } from "./identity-offline-verify";
18
+ export { createIdentityTokenCache } from "./identity-token-cache";
19
+ export { Webhooks, buildWebhookReceiveUrl, signCliodotWebhookPayload, verifyCliodotWebhookSignature } from "./Webhooks";
13
20
  export { Surface } from "./Surface";
14
21
  export type { SurfaceConfig, SurfaceCatalog, SurfaceOp, SurfaceClient, SurfaceHelpers, } from "./Surface";
15
22
  export { sanitizeExecutionHeaders } from "./http/sanitize-execution-headers";
@@ -19,6 +26,9 @@ export type { OAuthAppClientConfig, OAuthAppClientApi, OAuthAppErrorCode, OAuthC
19
26
  export { OAuthAppProtocol, OAuthConnectionStorage, OAuthConnectionStatus, OAuthTokenExposurePolicy, OAUTH_GRANT_TYPE_AUTHORIZATION_CODE, OAUTH_GRANT_TYPE_CLIENT_CREDENTIALS, OAUTH_GRANT_TYPE_DEVICE_CODE, OAUTH_GRANT_TYPE_JWT_BEARER, OAUTH_GRANT_TYPE_SAML2_BEARER, OAUTH_GRANT_TYPE_TOKEN_EXCHANGE, isOidcProtocol, isSamlProtocol, normalizeOAuthGrantType, isBrowserAuthorizationResponse, isDeviceConnectResponse, isImmediateConnectResponse, isDeviceAuthorizationPendingError, pollDeviceConnectWithBackoff, } from "./types/oauth-app.api";
20
27
  export type { AuthAppClientConfig, AuthAppClientApi, AuthMfaApi, AuthUsersApi, AuthMfaStatusResponse, AuthTotpEnrollResponse, AuthTotpVerifyResponse, AuthRecoveryCodesResponse, AuthUpsertUserInput, AuthOtpSendInput, AuthOtpSendResponse, AuthOtpVerifyResponse, AuthOtpStatusResponse, AuthOtpProviderApi, AuthProvidersApi, AuthMagicLinkSendResponse, AuthMagicLinkVerifyResponse, AuthMagicLinkProviderApi, } from "./types/auth-app.api";
21
28
  export type { EventsConfig, EventsApi, EventPublishOptions, EventPublishResponse, EventSubscribeInput, EventSubscribeResponse, EventUnsubscribeResponse, EventListenOptions, EventListenHandle, EventListenHandler, EventListenMessage, EventListenConnected, EventEnvelope, } from "./types/event-app.api";
29
+ export type { MemoryAppClientConfig, MemoryAppClientApi, MemoryClientConfig, MemoryClientApi, MemoryStoreInput, MemoryStoreResponse, MemoryStoreManyInput, MemoryStoreManyResponse, MemoryAddressInput, MemoryUpdateInput, MemoryDeleteInput, MemoryFindInput, MemoryFindResponse, MemorySearchInput, MemorySearchResponse, MemoryCrossSearchInput, MemorySearchHit, MemoryObject, MemorySearchMode, MemoryDeleteMode, } from "./types/memory-app.api";
30
+ export type { IdentityAppClientConfig, IdentityAppClientApi, IdentityAuthenticateInput, IdentityAuthenticateResponse, IdentityMeResponse, IdentityVerifyInput, IdentityVerifyResponse, IdentityRefreshInput, IdentityRevokeInput, IdentityRevokeResponse, IdentityJwks, IdentityOfflineVerifyOptions, IdentityOfflineVerifyHs256, IdentityOfflineVerifyRs256, IdentityTokenCacheOptions, IdentityProviderHandle, } from "./types/identity-app.api";
31
+ export type { CommercialAppClientConfig, CommercialAppClientApi, CommercialPaginationMeta, CommercialListParams, CommercialCustomer, CommercialFeature, CommercialPlan, CommercialPlanInterval, CommercialPlanEntitlement, CommercialPrice, CommercialSubscription, CommercialCheckInput, CommercialCheckResult, CommercialConsumeInput, CommercialConsumeResult, CommercialConsumeBreakdown, CommercialStateInput, CommercialStateResult, CommercialListCustomersResponse, CommercialListFeaturesResponse, CommercialListPlansResponse, CommercialListSubscriptionsParams, CommercialListSubscriptionsResponse, CommercialCreateSubscriptionInput, CommercialChangePlanInput, CommercialUpdatePendingSubscriptionInput, CommercialUpdateSubscriptionStatusInput, CommercialPricingQuoteInput, CommercialPricingQuote, CommercialInvoice, CommercialInvoiceLineItem, CommercialInitiatePaymentInput, CommercialInitiatePaymentResult, CommercialConfirmPaymentInput, CommercialConfirmPaymentResult, CommercialChargeUsageInput, CommercialChargeUsageResult, CommercialRenewSubscriptionInput, CommercialRenewSubscriptionResult, CommercialCreditBalance, CommercialCreditLedgerEvent, CommercialListCreditsParams, CommercialListCreditsResponse, CommercialCustomerCard, CommercialAddCardInput, CommercialListCardsParams, CommercialListCardsResponse, CommercialLifecycleEvent, CommercialUsageEvent, CommercialListEventsParams, CommercialListEventsResponse, CommercialListUsageEventsResponse, CommercialEntitlementTopupInput, CommercialCreditsTopupInput, CommercialDiscount, CommercialTaxRate, CommercialAddon, CommercialSeatAssignInput, CommercialSeatAssignment, CommercialLicenseIssueInput, CommercialLicenseValidateInput, CommercialLicense, CommercialAnalyticsParams, } from "./types/commercial-app.api";
22
32
  export { stepsToNodes } from "./transformers/StepsToNodesTransformer";
23
33
  export { WorkflowBuilder, StepBuilder, StepResult } from "./WorkflowBuilder";
24
34
  export { ConnectorBuilder, connector } from "./ConnectorBuilder";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}