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
package/dist/Surface.js CHANGED
@@ -1 +1,255 @@
1
- 'use strict';const _0x352af3=_0x5e96;function _0x1b53(){const _0x435d26=['AM9PBG','mtHHywTMr0S','AND0','r0vu','C2rR','zgLNzxn0','x19LC01VzhvSzq','C2rRoG','ntf2r0f5rxe','zgf0yq','mZi3ndy3mfv2CunwCa','CgfYC2vbCgLfCNjVCKnVzgu','y3jLyxrLsg1HyW','DMvYC2LVBG','l3nKAY9ZDxjMywnL','rMfPBgvKihrVigXVywqGC3vYzMfJzq','u3vYzMfJzsbYB290igLZig5VDcbJywXSywjSzq','C3vYzMfJzvbYB21PC2u','DxbKyxrL','zMLUza','Dg9tDhjPBMC','yM9KEq','Aw52B2TLqMfZzvvYBa','xhTCEW','C2HHmJu2','Aw52B2TL','z2v0','mJmXndC1mfjLz0Dyvq','ndGZs1vJCxrd','y2XPB2rVDefWAuvYCM9YrNjVBuf4Aw9Z','CgfYC2vbCgLfCNjVCLn0yxr1CW','C2rRvMvYC2LVBG','yxbPs2v5','CMfUzg9TqNL0zxm','yxbWBgLJyxrPB24VANnVBG','DxrMoa','u0rlig9WzxjHDgLVBIbUB3qGzxHWB3nLzdOG','CgfYC2vbCgLfCNjVCK1LC3nHz2u','CM9VDejHC2vvCMW','zMfPBfjLC3bVBNnL','x19PBxbVCNrezwzHDwX0','yxnqCM94Eq','n3ffuLz5yq','zxjYB3i','qMvHCMvYia','C2XPy2u','u3vYzMfJzsbYzxf1zxn0igzHAwXLzcaO','yxr0zxn0yxrPB25izwfKzxjZ','mJq5ndy5nNLJEeTsra','u3vYzMfJzq','DhjPBq','CMvXDwvZDa','u1vsrKfdrv9mt0fex0zbsuXfra','lI9ODhrWl3bHCNnLlwfWAs1LCNjVCG','C3vYzMfJzq','Bg9Hzfn1CMzHy2u','mJGYndjWrhnLBNK','zgvMyxvSDa','zxzLCNK','yxbPs2v5sgvHzgvY','C3rYAw5NAwz5','ms4YlJe','BM9Uy2u','q29UDgvUDc1uExbL','CxvLCNLFC2nOzw1H','mtfVBKDJzhC','zMLUze9W','w1n1CMzHy2vD','C3rHCNrZv2L0Aa','BgvUz3rO','C3rHDhvZ','z2f0zxDHEq','yxHPB3m','zw5KCg9PBNrFCgf0Aa','odiXnKP0s2rjqW','u0rlx09qx05pvf9fwfbpu0ve','BM93','mJG2mtu3nevWrxv5rW','CMvWBgfJzq','Bwv0Ag9K','nduZodC0ohrvtenqqG','rMfPBgvKihrVigXVywqGC3vYzMfJzsaO','C2rRx3bHDgG','yMfZzvvYBa','C3LTyM9S','Agv4','C2X1zW','q2XPB2rVDefWAuvYCM9Y'];_0x1b53=function(){return _0x435d26;};return _0x1b53();}(function(_0x499543,_0x3a350c){const _0x53f61e=_0x5e96,_0x2722fc=_0x499543();while(!![]){try{const _0x2fb3b2=-parseInt(_0x53f61e(0xeb))/0x1*(parseInt(_0x53f61e(0x11b))/0x2)+parseInt(_0x53f61e(0xff))/0x3*(parseInt(_0x53f61e(0xd5))/0x4)+parseInt(_0x53f61e(0xed))/0x5+parseInt(_0x53f61e(0xd8))/0x6*(-parseInt(_0x53f61e(0x10d))/0x7)+parseInt(_0x53f61e(0x113))/0x8*(parseInt(_0x53f61e(0xe4))/0x9)+-parseInt(_0x53f61e(0xfe))/0xa+parseInt(_0x53f61e(0x124))/0xb*(parseInt(_0x53f61e(0xdb))/0xc);if(_0x2fb3b2===_0x3a350c)break;else _0x2722fc['push'](_0x2722fc['shift']());}catch(_0x29f3f8){_0x2722fc['push'](_0x2722fc['shift']());}}}(_0x1b53,0x8876c));function _0x5e96(_0x1b8896,_0x5a1eb8){_0x1b8896=_0x1b8896-0xcf;const _0x1b53d3=_0x1b53();let _0x5e967a=_0x1b53d3[_0x1b8896];if(_0x5e96['rXlcPI']===undefined){var _0x4bae1b=function(_0x347d61){const _0x38efe5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x42f408='',_0x181485='';for(let _0x331ddd=0x0,_0x561d23,_0x299fb6,_0x244b21=0x0;_0x299fb6=_0x347d61['charAt'](_0x244b21++);~_0x299fb6&&(_0x561d23=_0x331ddd%0x4?_0x561d23*0x40+_0x299fb6:_0x299fb6,_0x331ddd++%0x4)?_0x42f408+=String['fromCharCode'](0xff&_0x561d23>>(-0x2*_0x331ddd&0x6)):0x0){_0x299fb6=_0x38efe5['indexOf'](_0x299fb6);}for(let _0x24709b=0x0,_0x114464=_0x42f408['length'];_0x24709b<_0x114464;_0x24709b++){_0x181485+='%'+('00'+_0x42f408['charCodeAt'](_0x24709b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x181485);};_0x5e96['WANWPD']=_0x4bae1b,_0x5e96['fvbpRz']={},_0x5e96['rXlcPI']=!![];}const _0x479fee=_0x1b53d3[0x0],_0x26ae22=_0x1b8896+_0x479fee,_0x16a0a3=_0x5e96['fvbpRz'][_0x26ae22];return!_0x16a0a3?(_0x5e967a=_0x5e96['WANWPD'](_0x5e967a),_0x5e96['fvbpRz'][_0x26ae22]=_0x5e967a):_0x5e967a=_0x16a0a3,_0x5e967a;}var __importDefault=this&&this[_0x352af3(0x10b)]||function(_0x42f408){return _0x42f408&&_0x42f408['__esModule']?_0x42f408:{'default':_0x42f408};};Object['defineProperty'](exports,_0x352af3(0xe9),{'value':!![]}),exports[_0x352af3(0x114)]=void 0x0;const axios_1=__importDefault(require(_0x352af3(0xd3))),crypto_1=__importDefault(require('crypto')),errors_1=require('./errors'),parse_api_error_1=require(_0x352af3(0x118)),DEFAULT_SDK_VERSION=_0x352af3(0x120);function trimBaseUrl(_0x181485){const _0x25693b=_0x352af3;return _0x181485['trim']()[_0x25693b(0xd9)](/\/+$/,'');}function sha256Hex(value){const _0x4bda75=_0x352af3;return crypto_1['default']['createHash'](_0x4bda75(0xfb))[_0x4bda75(0xf5)](value,_0x4bda75(0x106))['digest'](_0x4bda75(0xe0));}function hmacSha256Hex(_0x331ddd,_0x561d23){const _0x49c3a8=_0x352af3;return crypto_1[_0x49c3a8(0x11c)][_0x49c3a8(0xef)](_0x49c3a8(0xfb),_0x331ddd)[_0x49c3a8(0xf5)](_0x561d23,'utf8')[_0x49c3a8(0xe8)]('hex');}function randomNonce(){const _0x447822=_0x352af3;return crypto_1[_0x447822(0x11c)][_0x447822(0x104)](0x10)[_0x447822(0xf7)](_0x447822(0xe0));}function buildCanonical(_0x299fb6){const _0x3227c6=_0x352af3,_0x244b21=_0x299fb6[_0x3227c6(0xf8)]===undefined||_0x299fb6[_0x3227c6(0xf8)]===null?'':typeof _0x299fb6[_0x3227c6(0xf8)]==='string'?_0x299fb6[_0x3227c6(0xf8)]:JSON[_0x3227c6(0x11f)](_0x299fb6['body']);return[_0x299fb6['timestamp'],_0x299fb6[_0x3227c6(0x121)],(_0x299fb6['method']||_0x3227c6(0xe6))['toUpperCase'](),_0x299fb6['path']||'/',sha256Hex(_0x244b21)]['join']('.');}function fillEndpointPath(_0x24709b,_0x114464){const _0x991a50=_0x352af3;let _0x380dfe=_0x24709b;for(const [_0x43388a,value]of Object['entries'](_0x114464)){_0x380dfe=_0x380dfe[_0x991a50(0xd9)](new RegExp(':'+_0x43388a+'\x5cb','g'),encodeURIComponent(value))[_0x991a50(0xd9)](new RegExp(_0x991a50(0xfa)+_0x43388a+'\x5c}\x5c}','g'),encodeURIComponent(value))[_0x991a50(0xd9)](new RegExp('\x5c{'+_0x43388a+'\x5c}','g'),encodeURIComponent(value));}if(!_0x380dfe[_0x991a50(0xcf)]('/'))_0x380dfe='/'+_0x380dfe;return _0x380dfe;}class SurfaceRuntime{constructor(_0x388262){const _0x465808=_0x352af3;this[_0x465808(0xf4)]=null,this[_0x465808(0x119)]=null;if(!_0x388262[_0x465808(0xde)]?.[_0x465808(0x115)]())throw new errors_1[(_0x465808(0xe2))]('Surface\x20requires\x20baseUrl');this[_0x465808(0x109)]=trimBaseUrl(_0x388262[_0x465808(0xde)]),this['slug']=_0x388262[_0x465808(0xe1)]?.[_0x465808(0x115)]()||undefined,this[_0x465808(0x103)]=_0x388262[_0x465808(0x103)]?.[_0x465808(0x115)]()||undefined,this[_0x465808(0xe5)]=_0x388262[_0x465808(0xe5)]?.[_0x465808(0x115)]()||undefined,this[_0x465808(0x11e)]=_0x388262[_0x465808(0x11e)]?.[_0x465808(0x115)]()||'X-API-Key',this[_0x465808(0x102)]=_0x388262[_0x465808(0xf0)]?.['trim']()||DEFAULT_SDK_VERSION,this['invokeBaseUrl']=this[_0x465808(0xe1)]?this[_0x465808(0x109)]+'/'+this['slug']:this['rootBaseUrl'],this[_0x465808(0xd3)]=axios_1[_0x465808(0x11c)]['create']({'timeout':0xea60,'validateStatus':()=>!![]});}[_0x352af3(0x10a)](_0x1f227b,_0x1a3289,_0x1d4d6a){const _0x379be8=_0x352af3,_0x4b158e=_0x1f227b?.['data'],_0x133e9a=(0x0,parse_api_error_1[_0x379be8(0x108)])(_0x4b158e)||(typeof _0x4b158e?.[_0x379be8(0x10e)]==='string'?_0x4b158e['error']:undefined)||_0x1a3289;throw new errors_1[(_0x379be8(0xe2))](_0x133e9a,{'status':(0x0,parse_api_error_1[_0x379be8(0x101)])(_0x4b158e,_0x1f227b?.[_0x379be8(0xd1)]),'data':_0x4b158e,'code':_0x1d4d6a||(0x0,parse_api_error_1[_0x379be8(0xee)])(_0x4b158e)});}['signingSecret'](){const _0x49bb77=_0x352af3;if(this[_0x49bb77(0x103)])return this[_0x49bb77(0x103)];if(this['jwt'])return this['jwt'];return _0x49bb77(0xea)+(this[_0x49bb77(0xe1)]||_0x49bb77(0xd2));}[_0x352af3(0x112)](_0x45d825,_0x36a1ab,_0x260b40){const _0x8d831b=_0x352af3,_0x2c6d45=String(Date[_0x8d831b(0xd7)]()),_0x4c28e2=randomNonce(),_0x1fcb34=buildCanonical({'timestamp':_0x2c6d45,'nonce':_0x4c28e2,'method':_0x45d825,'path':_0x36a1ab,'body':_0x260b40}),_0x228289=hmacSha256Hex(this['signingSecret'](),_0x1fcb34),_0x21d14f={'X-Cliodot-Client':_0x8d831b(0xe7),'X-Cliodot-SDK-Version':this[_0x8d831b(0x102)],'X-Cliodot-SDK-Timestamp':_0x2c6d45,'X-Cliodot-SDK-Nonce':_0x4c28e2,'X-Cliodot-SDK-Signature':_0x228289};return this[_0x8d831b(0x103)]&&(_0x21d14f[this[_0x8d831b(0x11e)]]=this['apiKey']),this[_0x8d831b(0xe5)]&&(_0x21d14f['Authorization']=_0x8d831b(0x10f)+this[_0x8d831b(0xe5)]),_0x21d14f;}async[_0x352af3(0x11a)](_0x7f43d=![]){const _0x3e10a2=_0x352af3;if(!_0x7f43d&&this[_0x3e10a2(0x119)])return this[_0x3e10a2(0x119)];if(!_0x7f43d&&this[_0x3e10a2(0xf4)])return this[_0x3e10a2(0xf4)];return this[_0x3e10a2(0xf4)]=((async()=>{const _0x27bc64=_0x3e10a2,_0x5a1a32=_0x27bc64(0xf1),_0x4da51a=''+this[_0x27bc64(0xf9)]+_0x5a1a32;try{const _0x26c682=await this[_0x27bc64(0xd3)][_0x27bc64(0xfd)](_0x4da51a,{'headers':this[_0x27bc64(0x112)](_0x27bc64(0xe6),_0x5a1a32)});return(_0x26c682[_0x27bc64(0xd1)]>=0x190||_0x26c682[_0x27bc64(0xec)]?.['ok']===![])&&this[_0x27bc64(0x10a)](_0x26c682,_0x27bc64(0xdc)+_0x26c682['status']+')',_0x27bc64(0x117)),this[_0x27bc64(0x119)]=_0x26c682[_0x27bc64(0xec)][_0x27bc64(0x119)],this[_0x27bc64(0x119)];}catch(_0x35746b){this['surfacePromise']=null;if(_0x35746b instanceof errors_1[_0x27bc64(0xe2)])throw _0x35746b;throw(0x0,errors_1['cliodotApiErrorFromAxios'])(_0x35746b,_0x27bc64(0xf2));}})()),this[_0x3e10a2(0xf4)];}[_0x352af3(0x125)](_0x1e638b,_0x440478,_0x3813d1){const _0x499f25=_0x352af3,_0xf411be=_0x3813d1['ops'][_0x499f25(0xf6)](_0x4026d2=>_0x4026d2['op']===_0x440478&&_0x4026d2[_0x499f25(0xdd)][_0x499f25(0xd0)]===_0x1e638b[_0x499f25(0xd0)]&&_0x4026d2['sdk_path'][_0x499f25(0x11d)]((_0x55f5b2,_0x30e016)=>_0x55f5b2===_0x1e638b[_0x30e016]));if(!_0xf411be){const _0x501043=[..._0x1e638b,_0x440478][_0x499f25(0xe3)]('.');throw new errors_1['CliodotApiError'](_0x499f25(0x107)+_0x501043,{'code':_0x499f25(0xd6)});}return _0xf411be;}async['invoke'](_0x2feab9,_0x533f46,_0x5957d7){const _0x4d20bf=_0x352af3,_0x24d1f8=await this[_0x4d20bf(0x11a)](),_0x51e392=this[_0x4d20bf(0x125)](_0x2feab9,_0x533f46,_0x24d1f8);let _0x14332f=0x0;const _0x3c8e15={};for(const _0x19302f of _0x51e392['path_params']||[]){const value=_0x5957d7[_0x14332f++];if(value===undefined||value===null)throw new errors_1[(_0x4d20bf(0xe2))]('Missing\x20path\x20argument:\x20'+_0x19302f);_0x3c8e15[_0x19302f]=String(value);}let _0x26fb71,_0x3aec59;_0x51e392[_0x4d20bf(0xf8)]&&(_0x26fb71=_0x5957d7[_0x14332f++]);_0x51e392[_0x4d20bf(0x123)]&&(_0x3aec59=_0x5957d7[_0x14332f++]||undefined);const _0x5a55dd=fillEndpointPath(_0x51e392[_0x4d20bf(0xd4)],_0x3c8e15),_0x3d318d=''+this[_0x4d20bf(0xf9)]+_0x5a55dd,_0x1e9eb2=!!_0x51e392['body']&&_0x26fb71!==undefined,_0x4830f3=this[_0x4d20bf(0x112)](_0x51e392[_0x4d20bf(0xda)],_0x5a55dd,_0x1e9eb2?_0x26fb71:undefined);_0x1e9eb2&&(_0x4830f3[_0x4d20bf(0x122)]=_0x4d20bf(0x105));try{const _0xc1f9b6=await this[_0x4d20bf(0xd3)][_0x4d20bf(0x116)]({'url':_0x3d318d,'method':_0x51e392['method'],'headers':_0x4830f3,'params':_0x3aec59,'data':_0x1e9eb2?_0x26fb71:undefined});return(_0xc1f9b6[_0x4d20bf(0xd1)]>=0x190||_0xc1f9b6[_0x4d20bf(0xec)]?.['ok']===![])&&this['failResponse'](_0xc1f9b6,_0x4d20bf(0x111)+_0xc1f9b6[_0x4d20bf(0xd1)]+')','SURFACE_REQUEST_FAILED'),_0xc1f9b6[_0x4d20bf(0xec)]?.['data']!==undefined?_0xc1f9b6['data'][_0x4d20bf(0xec)]:_0xc1f9b6[_0x4d20bf(0xec)];}catch(_0x544cc8){if(_0x544cc8 instanceof errors_1[_0x4d20bf(0xe2)])throw _0x544cc8;throw(0x0,errors_1[_0x4d20bf(0x100)])(_0x544cc8,'Surface\x20request\x20failed');}}[_0x352af3(0x10c)](_0x336fbd=[]){const _0x360d43=this,_0x39ecff=(..._0x442a27)=>{const _0x529f5c=_0x5e96;if(_0x336fbd[_0x529f5c(0xd0)]===0x0)throw new errors_1[(_0x529f5c(0xe2))](_0x529f5c(0xf3));const _0x3995c9=_0x336fbd[_0x336fbd[_0x529f5c(0xd0)]-0x1],_0x201e69=_0x336fbd[_0x529f5c(0x110)](0x0,-0x1);return _0x360d43[_0x529f5c(0xfc)](_0x201e69,_0x3995c9,_0x442a27);};return new Proxy(_0x39ecff,{'get'(_target,_0x5cde83){const _0x50ad2b=_0x5e96;if(typeof _0x5cde83===_0x50ad2b(0xdf))return undefined;if(_0x5cde83==='then')return undefined;if(_0x5cde83==='loadSurface')return _0x2ef27c=>_0x360d43[_0x50ad2b(0x11a)](_0x2ef27c);if(_0x5cde83===_0x50ad2b(0xf7))return()=>_0x50ad2b(0x126);return _0x360d43[_0x50ad2b(0x10c)]([..._0x336fbd,String(_0x5cde83)]);},'apply'(_target,_0x318d39,_0x2da0d2){return _0x39ecff(..._0x2da0d2||[]);}});}}exports[_0x352af3(0x114)]=function Surface(_0x297c4c){const _0x44bb2c=_0x352af3,_0x1e34bb=new SurfaceRuntime(_0x297c4c);return _0x1e34bb[_0x44bb2c(0x10c)]();};
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.Surface = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const errors_1 = require("./errors");
10
+ const parse_api_error_1 = require("./http/parse-api-error");
11
+ const cliodot_request_1 = require("./http/cliodot-request");
12
+ const DEFAULT_SDK_VERSION = "1.2.1";
13
+ function trimBaseUrl(url) {
14
+ return url.trim().replace(/\/+$/, "");
15
+ }
16
+ function sha256Hex(value) {
17
+ return crypto_1.default.createHash("sha256").update(value, "utf8").digest("hex");
18
+ }
19
+ function hmacSha256Hex(secret, payload) {
20
+ return crypto_1.default.createHmac("sha256", secret).update(payload, "utf8").digest("hex");
21
+ }
22
+ function randomNonce() {
23
+ return crypto_1.default.randomBytes(16).toString("hex");
24
+ }
25
+ function buildCanonical(input) {
26
+ const bodyRaw = input.body === undefined ||
27
+ input.body === null ||
28
+ (typeof input.body === "object" &&
29
+ !Array.isArray(input.body) &&
30
+ Object.keys(input.body).length === 0)
31
+ ? ""
32
+ : typeof input.body === "string"
33
+ ? input.body
34
+ : JSON.stringify(input.body);
35
+ return [
36
+ input.timestamp,
37
+ input.nonce,
38
+ (input.method || "GET").toUpperCase(),
39
+ input.path || "/",
40
+ sha256Hex(bodyRaw),
41
+ ].join(".");
42
+ }
43
+ function sanitizePathParamKey(name) {
44
+ return String(name || "")
45
+ .replace(/[^a-zA-Z0-9_]+/g, "_")
46
+ .replace(/_+/g, "_")
47
+ .replace(/^_|_$/g, "");
48
+ }
49
+ function fillEndpointPath(template, pathParams) {
50
+ let path = template;
51
+ const entries = Object.entries(pathParams).sort((a, b) => b[0].length - a[0].length);
52
+ const replaceName = (current, name, encoded) => {
53
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
54
+ return current
55
+ .replace(new RegExp(`:${escaped}(?=$|[/?#&]|[^a-zA-Z0-9_-])`, "g"), encoded)
56
+ .replace(new RegExp(`\\{\\{\\s*${escaped}\\s*\\}\\}`, "g"), encoded)
57
+ .replace(new RegExp(`\\{${escaped}\\}`, "g"), encoded);
58
+ };
59
+ for (const [name, value] of entries) {
60
+ path = replaceName(path, name, encodeURIComponent(value));
61
+ }
62
+ const remaining = [
63
+ ...path.matchAll(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_-]*)\s*\}\}/g),
64
+ ...path.matchAll(/:([a-zA-Z_][a-zA-Z0-9_-]*)(?=$|[/?#&]|[^a-zA-Z0-9_-])/g),
65
+ ...path.matchAll(/\{([a-zA-Z_][a-zA-Z0-9_-]*)\}/g),
66
+ ].map((match) => match[1]);
67
+ for (const placeholder of remaining) {
68
+ const normalizedPlaceholder = sanitizePathParamKey(placeholder);
69
+ const match = entries.find(([key]) => sanitizePathParamKey(key) === normalizedPlaceholder);
70
+ if (!match)
71
+ continue;
72
+ path = replaceName(path, placeholder, encodeURIComponent(match[1]));
73
+ }
74
+ if (!path.startsWith("/"))
75
+ path = `/${path}`;
76
+ return path;
77
+ }
78
+ class SurfaceRuntime {
79
+ constructor(config) {
80
+ this.surfacePromise = null;
81
+ this.surface = null;
82
+ if (!config.baseUrl?.trim()) {
83
+ throw new errors_1.CliodotApiError("Surface requires baseUrl");
84
+ }
85
+ this.rootBaseUrl = trimBaseUrl(config.baseUrl);
86
+ this.slug = config.slug?.trim() || undefined;
87
+ this.apiKey = config.apiKey?.trim() || undefined;
88
+ this.jwt = config.jwt?.trim() || undefined;
89
+ this.apiKeyHeader = config.apiKeyHeader?.trim() || "X-API-Key";
90
+ this.sdkVersion = config.version?.trim() || DEFAULT_SDK_VERSION;
91
+ this.environment = config.environment;
92
+ this.invokeBaseUrl = this.slug
93
+ ? `${this.rootBaseUrl}/${this.slug}`
94
+ : this.rootBaseUrl;
95
+ this.axios = axios_1.default.create({
96
+ timeout: 60000,
97
+ validateStatus: () => true,
98
+ });
99
+ }
100
+ failResponse(response, fallback, code) {
101
+ const data = response?.data;
102
+ const message = (0, parse_api_error_1.parseApiErrorMessage)(data) ||
103
+ (typeof data?.error === "string" ? data.error : undefined) ||
104
+ fallback;
105
+ throw new errors_1.CliodotApiError(message, {
106
+ status: (0, parse_api_error_1.parseApiErrorStatus)(data, response?.status),
107
+ data,
108
+ code: code || (0, parse_api_error_1.parseApiErrorCode)(data),
109
+ });
110
+ }
111
+ signingSecret() {
112
+ if (this.apiKey)
113
+ return this.apiKey;
114
+ if (this.jwt)
115
+ return this.jwt;
116
+ return `sdk:${this.slug || "gateway"}`;
117
+ }
118
+ attestationHeaders(method, path, body) {
119
+ const timestamp = String(Date.now());
120
+ const nonce = randomNonce();
121
+ const canonical = buildCanonical({ timestamp, nonce, method, path, body });
122
+ const signature = hmacSha256Hex(this.signingSecret(), canonical);
123
+ const headers = {
124
+ "X-Cliodot-Client": "sdk",
125
+ "X-Cliodot-SDK-Version": this.sdkVersion,
126
+ "X-Cliodot-SDK-Timestamp": timestamp,
127
+ "X-Cliodot-SDK-Nonce": nonce,
128
+ "X-Cliodot-SDK-Signature": signature,
129
+ };
130
+ if (this.apiKey) {
131
+ headers[this.apiKeyHeader] = this.apiKey;
132
+ }
133
+ if (this.jwt) {
134
+ headers.Authorization = `Bearer ${this.jwt}`;
135
+ }
136
+ return (0, cliodot_request_1.applyEnvironmentHeader)(headers, this.environment);
137
+ }
138
+ async loadSurface(force = false) {
139
+ if (!force && this.surface)
140
+ return this.surface;
141
+ if (!force && this.surfacePromise)
142
+ return this.surfacePromise;
143
+ this.surfacePromise = (async () => {
144
+ const path = "/sdk/surface";
145
+ const url = `${this.invokeBaseUrl}${path}`;
146
+ try {
147
+ const response = await this.axios.get(url, {
148
+ headers: this.attestationHeaders("GET", path),
149
+ });
150
+ if (response.status >= 400 || response.data?.ok === false) {
151
+ this.failResponse(response, `Failed to load surface (${response.status})`, "SURFACE_LOAD_FAILED");
152
+ }
153
+ this.surface = response.data.surface;
154
+ return this.surface;
155
+ }
156
+ catch (error) {
157
+ this.surfacePromise = null;
158
+ if (error instanceof errors_1.CliodotApiError)
159
+ throw error;
160
+ throw (0, errors_1.cliodotApiErrorFromAxios)(error, "Failed to load surface");
161
+ }
162
+ })();
163
+ return this.surfacePromise;
164
+ }
165
+ findOp(sdkPath, op, catalog) {
166
+ const match = catalog.ops.find((item) => item.op === op &&
167
+ item.sdk_path.length === sdkPath.length &&
168
+ item.sdk_path.every((segment, index) => segment === sdkPath[index]));
169
+ if (!match) {
170
+ const fluent = [...sdkPath, op].join(".");
171
+ throw new errors_1.CliodotApiError(`SDK operation not exposed: ${fluent}`, {
172
+ code: "SDK_OP_NOT_EXPOSED",
173
+ });
174
+ }
175
+ return match;
176
+ }
177
+ async invoke(sdkPath, opName, args) {
178
+ const catalog = await this.loadSurface();
179
+ const op = this.findOp(sdkPath, opName, catalog);
180
+ let argIndex = 0;
181
+ const pathParams = {};
182
+ for (const name of op.path_params || []) {
183
+ const value = args[argIndex++];
184
+ if (value === undefined || value === null) {
185
+ throw new errors_1.CliodotApiError(`Missing path argument: ${name}`);
186
+ }
187
+ pathParams[name] = String(value);
188
+ }
189
+ let body;
190
+ let query;
191
+ if (op.body) {
192
+ body = args[argIndex++];
193
+ }
194
+ if (op.query_schema) {
195
+ query = args[argIndex++] || undefined;
196
+ }
197
+ const endpointPath = fillEndpointPath(op.endpoint_path, pathParams);
198
+ const url = `${this.invokeBaseUrl}${endpointPath}`;
199
+ const hasBody = !!op.body && body !== undefined;
200
+ const headers = this.attestationHeaders(op.method, endpointPath, hasBody ? body : undefined);
201
+ if (hasBody) {
202
+ headers["Content-Type"] = "application/json";
203
+ }
204
+ try {
205
+ const response = await this.axios.request({
206
+ url,
207
+ method: op.method,
208
+ headers,
209
+ params: query,
210
+ data: hasBody ? body : undefined,
211
+ });
212
+ if (response.status >= 400 || response.data?.ok === false) {
213
+ this.failResponse(response, `Surface request failed (${response.status})`, "SURFACE_REQUEST_FAILED");
214
+ }
215
+ return response.data?.data !== undefined ? response.data.data : response.data;
216
+ }
217
+ catch (error) {
218
+ if (error instanceof errors_1.CliodotApiError)
219
+ throw error;
220
+ throw (0, errors_1.cliodotApiErrorFromAxios)(error, "Surface request failed");
221
+ }
222
+ }
223
+ asProxy(path = []) {
224
+ const runtime = this;
225
+ const callable = (...args) => {
226
+ if (path.length === 0) {
227
+ throw new errors_1.CliodotApiError("Surface root is not callable");
228
+ }
229
+ const op = path[path.length - 1];
230
+ const sdkPath = path.slice(0, -1);
231
+ return runtime.invoke(sdkPath, op, args);
232
+ };
233
+ return new Proxy(callable, {
234
+ get(_target, prop) {
235
+ if (typeof prop === "symbol")
236
+ return undefined;
237
+ if (prop === "then")
238
+ return undefined;
239
+ if (prop === "loadSurface") {
240
+ return (force) => runtime.loadSurface(force);
241
+ }
242
+ if (prop === "toString")
243
+ return () => "[Surface]";
244
+ return runtime.asProxy([...path, String(prop)]);
245
+ },
246
+ apply(_target, _thisArg, argArray) {
247
+ return callable(...(argArray || []));
248
+ },
249
+ });
250
+ }
251
+ }
252
+ exports.Surface = function Surface(config) {
253
+ const runtime = new SurfaceRuntime(config);
254
+ return runtime.asProxy();
255
+ };
@@ -1 +1,24 @@
1
- 'use strict';var _0x5a1720=_0x2082;(function(_0x5c52fe,_0x3103c8){var _0x193dbd=_0x2082,_0x5cb84e=_0x5c52fe();while(!![]){try{var _0x40992b=parseInt(_0x193dbd(0xb7))/0x1*(-parseInt(_0x193dbd(0xb6))/0x2)+parseInt(_0x193dbd(0xbd))/0x3+-parseInt(_0x193dbd(0xb5))/0x4+parseInt(_0x193dbd(0xb8))/0x5*(parseInt(_0x193dbd(0xc4))/0x6)+-parseInt(_0x193dbd(0xb9))/0x7*(parseInt(_0x193dbd(0xc0))/0x8)+-parseInt(_0x193dbd(0xc1))/0x9+parseInt(_0x193dbd(0xb3))/0xa*(parseInt(_0x193dbd(0xbe))/0xb);if(_0x40992b===_0x3103c8)break;else _0x5cb84e['push'](_0x5cb84e['shift']());}catch(_0x4f4f68){_0x5cb84e['push'](_0x5cb84e['shift']());}}}(_0xf560,0xcfc84));function _0x2082(_0x5965f4,_0x21c026){_0x5965f4=_0x5965f4-0xb3;var _0xf5607f=_0xf560();var _0x2082eb=_0xf5607f[_0x5965f4];if(_0x2082['zIjEzB']===undefined){var _0x5174a0=function(_0x4cfdf1){var _0x411ff0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x374c57='',_0x2de863='';for(var _0x23e980=0x0,_0x4f96a1,_0x73709b,_0x425ed0=0x0;_0x73709b=_0x4cfdf1['charAt'](_0x425ed0++);~_0x73709b&&(_0x4f96a1=_0x23e980%0x4?_0x4f96a1*0x40+_0x73709b:_0x73709b,_0x23e980++%0x4)?_0x374c57+=String['fromCharCode'](0xff&_0x4f96a1>>(-0x2*_0x23e980&0x6)):0x0){_0x73709b=_0x411ff0['indexOf'](_0x73709b);}for(var _0x17d3dd=0x0,_0x39ac8d=_0x374c57['length'];_0x17d3dd<_0x39ac8d;_0x17d3dd++){_0x2de863+='%'+('00'+_0x374c57['charCodeAt'](_0x17d3dd)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2de863);};_0x2082['mPwvpe']=_0x5174a0,_0x2082['YyoLRo']={},_0x2082['zIjEzB']=!![];}var _0x4d658d=_0xf5607f[0x0],_0x49c07d=_0x5965f4+_0x4d658d,_0x35629c=_0x2082['YyoLRo'][_0x49c07d];return!_0x35629c?(_0x2082eb=_0x2082['mPwvpe'](_0x2082eb),_0x2082['YyoLRo'][_0x49c07d]=_0x2082eb):_0x2082eb=_0x35629c,_0x2082eb;}Object['defineProperty'](exports,_0x5a1720(0xc3),{'value':!![]}),exports[_0x5a1720(0xba)]=void 0x0,exports['validationGroups']=validationGroups;function _0xf560(){var _0x325c5c=['ntK0mtq1tNHUwerW','mJG2oda0qKXXEuHb','vMfSAwrHDg9YqNvPBgrLCG','x2DYB3vWCW','ywrKr3jVDxa','mJaWmdG0n2L0D05vBG','ndqXnZm2ntDqA0jVwxm','yNvPBgq','mtzqv1fHD3a','oteWnZy0me94D1vnBG','z3jVDxa','x19LC01VzhvSzq','mtHWChfHqKW','mtbLugDyywu','ChvZAa','nJu5nZmWofnHr1brBa','nJu2nZH4vefgr3C','ndrwC055vfq'];_0xf560=function(){return _0x325c5c;};return _0xf560();}class ValidatorBuilder{constructor(){var _0x1262a2=_0x5a1720;this[_0x1262a2(0xbb)]=[];}[_0x5a1720(0xc2)](_0x374c57,_0x2de863){var _0x11c464=_0x5a1720;return this[_0x11c464(0xbb)][_0x11c464(0xb4)]({'fields':_0x374c57,'validators':_0x2de863}),this;}[_0x5a1720(0xbc)](_0x23e980){var _0x3e7974=_0x5a1720;return this[_0x3e7974(0xbb)][_0x3e7974(0xb4)](_0x23e980),this;}[_0x5a1720(0xbf)](){var _0x2f524d=_0x5a1720;return this[_0x2f524d(0xbb)];}}exports['ValidatorBuilder']=ValidatorBuilder;function validationGroups(){return new ValidatorBuilder();}
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidatorBuilder = void 0;
4
+ exports.validationGroups = validationGroups;
5
+ class ValidatorBuilder {
6
+ constructor() {
7
+ this._groups = [];
8
+ }
9
+ group(fields, validators) {
10
+ this._groups.push({ fields, validators });
11
+ return this;
12
+ }
13
+ addGroup(group) {
14
+ this._groups.push(group);
15
+ return this;
16
+ }
17
+ build() {
18
+ return this._groups;
19
+ }
20
+ }
21
+ exports.ValidatorBuilder = ValidatorBuilder;
22
+ function validationGroups() {
23
+ return new ValidatorBuilder();
24
+ }
@@ -0,0 +1,20 @@
1
+ export type WebhooksConfig = {
2
+ domain: string;
3
+ appSlug: string;
4
+ endpointSlug: string;
5
+ scheme?: "http" | "https";
6
+ };
7
+ export declare function buildWebhookReceiveUrl(config: WebhooksConfig): string;
8
+ export declare function signCliodotWebhookPayload(secret: string, timestamp: number, body: string): string;
9
+ export declare function verifyCliodotWebhookSignature(input: {
10
+ secret: string;
11
+ body: string;
12
+ signatureHeader: string | string[] | undefined;
13
+ toleranceSeconds?: number;
14
+ }): boolean;
15
+ export declare class Webhooks {
16
+ static buildReceiveUrl: typeof buildWebhookReceiveUrl;
17
+ static sign: typeof signCliodotWebhookPayload;
18
+ static verify: typeof verifyCliodotWebhookSignature;
19
+ }
20
+ //# sourceMappingURL=Webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Webhooks.d.ts","sourceRoot":"","sources":["../src/Webhooks.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAMrE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,MAAM,CAMR;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAkCV;AAED,qBAAa,QAAQ;IACnB,MAAM,CAAC,eAAe,gCAA0B;IAChD,MAAM,CAAC,IAAI,mCAA6B;IACxC,MAAM,CAAC,MAAM,uCAAiC;CAC/C"}
@@ -0,0 +1,61 @@
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.Webhooks = void 0;
7
+ exports.buildWebhookReceiveUrl = buildWebhookReceiveUrl;
8
+ exports.signCliodotWebhookPayload = signCliodotWebhookPayload;
9
+ exports.verifyCliodotWebhookSignature = verifyCliodotWebhookSignature;
10
+ const crypto_1 = __importDefault(require("crypto"));
11
+ function buildWebhookReceiveUrl(config) {
12
+ const domain = config.domain.trim().replace(/^https?:\/\//, "").split("/")[0];
13
+ const appSlug = config.appSlug.trim().toLowerCase();
14
+ const endpointSlug = config.endpointSlug.trim().toLowerCase();
15
+ const scheme = config.scheme || "https";
16
+ return `${scheme}://${domain}/webhook/${appSlug}/${endpointSlug}`;
17
+ }
18
+ function signCliodotWebhookPayload(secret, timestamp, body) {
19
+ const digest = crypto_1.default
20
+ .createHmac("sha256", secret)
21
+ .update(`${timestamp}.${body}`)
22
+ .digest("hex");
23
+ return `t=${timestamp},v1=${digest}`;
24
+ }
25
+ function verifyCliodotWebhookSignature(input) {
26
+ const header = Array.isArray(input.signatureHeader)
27
+ ? input.signatureHeader[0]
28
+ : input.signatureHeader;
29
+ if (!header)
30
+ return false;
31
+ const parts = header.split(",").map((p) => p.trim());
32
+ let timestamp;
33
+ let v1;
34
+ for (const part of parts) {
35
+ const [k, v] = part.split("=");
36
+ if (k === "t" && v)
37
+ timestamp = Number(v);
38
+ if (k === "v1" && v)
39
+ v1 = v;
40
+ }
41
+ if (!timestamp || !v1 || Number.isNaN(timestamp))
42
+ return false;
43
+ const tolerance = input.toleranceSeconds ?? 300;
44
+ const now = Math.floor(Date.now() / 1000);
45
+ if (Math.abs(now - timestamp) > tolerance)
46
+ return false;
47
+ const expected = signCliodotWebhookPayload(input.secret, timestamp, input.body);
48
+ const expectedDigest = expected.split("v1=")[1];
49
+ try {
50
+ return crypto_1.default.timingSafeEqual(Buffer.from(expectedDigest, "hex"), Buffer.from(v1, "hex"));
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ class Webhooks {
57
+ }
58
+ exports.Webhooks = Webhooks;
59
+ Webhooks.buildReceiveUrl = buildWebhookReceiveUrl;
60
+ Webhooks.sign = signCliodotWebhookPayload;
61
+ Webhooks.verify = verifyCliodotWebhookSignature;