@thirdweb-dev/service-utils 0.5.0-nightly-6cf298a29-20240308012322 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/cjs/cf-worker/index.js +164 -0
  2. package/dist/cjs/cf-worker/index.js.map +1 -0
  3. package/dist/cjs/cf-worker/usage.js +55 -0
  4. package/dist/cjs/cf-worker/usage.js.map +1 -0
  5. package/dist/cjs/core/api.js +42 -0
  6. package/dist/cjs/core/api.js.map +1 -0
  7. package/dist/cjs/core/authorize/client.js +98 -0
  8. package/dist/cjs/core/authorize/client.js.map +1 -0
  9. package/dist/cjs/core/authorize/index.js +109 -0
  10. package/dist/cjs/core/authorize/index.js.map +1 -0
  11. package/dist/cjs/core/authorize/service.js +50 -0
  12. package/dist/cjs/core/authorize/service.js.map +1 -0
  13. package/dist/cjs/core/authorize/types.js +3 -0
  14. package/dist/cjs/core/authorize/types.js.map +1 -0
  15. package/dist/cjs/core/rateLimit/index.js +60 -0
  16. package/dist/cjs/core/rateLimit/index.js.map +1 -0
  17. package/dist/cjs/core/rateLimit/types.js +3 -0
  18. package/dist/cjs/core/rateLimit/types.js.map +1 -0
  19. package/dist/cjs/core/services.js +85 -0
  20. package/dist/cjs/core/services.js.map +1 -0
  21. package/dist/cjs/core/types.js +3 -0
  22. package/dist/cjs/core/types.js.map +1 -0
  23. package/dist/cjs/core/usage.js +85 -0
  24. package/dist/cjs/core/usage.js.map +1 -0
  25. package/dist/cjs/index.js +13 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/mocks.js +60 -0
  28. package/dist/cjs/mocks.js.map +1 -0
  29. package/dist/cjs/node/index.js +182 -0
  30. package/dist/cjs/node/index.js.map +1 -0
  31. package/dist/cjs/package.json +1 -0
  32. package/dist/esm/cf-worker/index.js +156 -0
  33. package/dist/esm/cf-worker/index.js.map +1 -0
  34. package/dist/esm/cf-worker/usage.js +53 -0
  35. package/dist/esm/cf-worker/usage.js.map +1 -0
  36. package/dist/esm/core/api.js +38 -0
  37. package/dist/esm/core/api.js.map +1 -0
  38. package/dist/esm/core/authorize/client.js +93 -0
  39. package/dist/esm/core/authorize/client.js.map +1 -0
  40. package/dist/esm/core/authorize/index.js +106 -0
  41. package/dist/esm/core/authorize/index.js.map +1 -0
  42. package/dist/esm/core/authorize/service.js +47 -0
  43. package/dist/esm/core/authorize/service.js.map +1 -0
  44. package/dist/esm/core/authorize/types.js +2 -0
  45. package/dist/esm/core/authorize/types.js.map +1 -0
  46. package/dist/esm/core/rateLimit/index.js +57 -0
  47. package/dist/esm/core/rateLimit/index.js.map +1 -0
  48. package/dist/esm/core/rateLimit/types.js +2 -0
  49. package/dist/esm/core/rateLimit/types.js.map +1 -0
  50. package/dist/esm/core/services.js +81 -0
  51. package/dist/esm/core/services.js.map +1 -0
  52. package/dist/esm/core/types.js +2 -0
  53. package/dist/esm/core/types.js.map +1 -0
  54. package/dist/esm/core/usage.js +82 -0
  55. package/dist/esm/core/usage.js.map +1 -0
  56. package/dist/esm/index.js +5 -0
  57. package/dist/esm/index.js.map +1 -0
  58. package/dist/esm/mocks.js +57 -0
  59. package/dist/esm/mocks.js.map +1 -0
  60. package/dist/esm/node/index.js +174 -0
  61. package/dist/esm/node/index.js.map +1 -0
  62. package/dist/esm/package.json +1 -0
  63. package/dist/{declarations/src → types}/cf-worker/index.d.ts +8 -9
  64. package/dist/types/cf-worker/index.d.ts.map +1 -0
  65. package/dist/types/cf-worker/usage.d.ts +24 -0
  66. package/dist/types/cf-worker/usage.d.ts.map +1 -0
  67. package/dist/types/core/api.d.ts +121 -0
  68. package/dist/types/core/api.d.ts.map +1 -0
  69. package/dist/types/core/authorize/client.d.ts +17 -0
  70. package/dist/types/core/authorize/client.d.ts.map +1 -0
  71. package/dist/{declarations/src → types}/core/authorize/index.d.ts +6 -5
  72. package/dist/types/core/authorize/index.d.ts.map +1 -0
  73. package/dist/types/core/authorize/service.d.ts +4 -0
  74. package/dist/types/core/authorize/service.d.ts.map +1 -0
  75. package/dist/types/core/authorize/types.d.ts +10 -0
  76. package/dist/types/core/authorize/types.d.ts.map +1 -0
  77. package/dist/{declarations/src → types}/core/rateLimit/index.d.ts +4 -4
  78. package/dist/types/core/rateLimit/index.d.ts.map +1 -0
  79. package/dist/types/core/rateLimit/types.d.ts.map +1 -0
  80. package/dist/{declarations/src → types}/core/services.d.ts +55 -23
  81. package/dist/types/core/services.d.ts.map +1 -0
  82. package/dist/types/core/types.d.ts.map +1 -0
  83. package/dist/{declarations/src/cf-worker → types/core}/usage.d.ts +84 -30
  84. package/dist/types/core/usage.d.ts.map +1 -0
  85. package/dist/types/index.d.ts +5 -0
  86. package/dist/types/index.d.ts.map +1 -0
  87. package/dist/types/mocks.d.ts +7 -0
  88. package/dist/types/mocks.d.ts.map +1 -0
  89. package/dist/{declarations/src → types}/node/index.d.ts +10 -12
  90. package/dist/types/node/index.d.ts.map +1 -0
  91. package/package.json +42 -45
  92. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.d.ts +0 -2
  93. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.d.ts.map +0 -1
  94. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.dev.js +0 -272
  95. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.js +0 -7
  96. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.prod.js +0 -272
  97. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.esm.js +0 -258
  98. package/cf-worker/package.json +0 -4
  99. package/dist/declarations/src/cf-worker/index.d.ts.map +0 -1
  100. package/dist/declarations/src/cf-worker/usage.d.ts.map +0 -1
  101. package/dist/declarations/src/core/api.d.ts +0 -84
  102. package/dist/declarations/src/core/api.d.ts.map +0 -1
  103. package/dist/declarations/src/core/authorize/client.d.ts +0 -9
  104. package/dist/declarations/src/core/authorize/client.d.ts.map +0 -1
  105. package/dist/declarations/src/core/authorize/index.d.ts.map +0 -1
  106. package/dist/declarations/src/core/authorize/service.d.ts +0 -7
  107. package/dist/declarations/src/core/authorize/service.d.ts.map +0 -1
  108. package/dist/declarations/src/core/authorize/types.d.ts +0 -12
  109. package/dist/declarations/src/core/authorize/types.d.ts.map +0 -1
  110. package/dist/declarations/src/core/rateLimit/index.d.ts.map +0 -1
  111. package/dist/declarations/src/core/rateLimit/types.d.ts.map +0 -1
  112. package/dist/declarations/src/core/services.d.ts.map +0 -1
  113. package/dist/declarations/src/core/types.d.ts.map +0 -1
  114. package/dist/declarations/src/core/usageLimit/index.d.ts +0 -5
  115. package/dist/declarations/src/core/usageLimit/index.d.ts.map +0 -1
  116. package/dist/declarations/src/core/usageLimit/types.d.ts +0 -9
  117. package/dist/declarations/src/core/usageLimit/types.d.ts.map +0 -1
  118. package/dist/declarations/src/index.d.ts +0 -2
  119. package/dist/declarations/src/index.d.ts.map +0 -1
  120. package/dist/declarations/src/node/index.d.ts.map +0 -1
  121. package/dist/index-3b9a0743.esm.js +0 -572
  122. package/dist/index-62b88cac.cjs.dev.js +0 -576
  123. package/dist/index-aa324361.cjs.prod.js +0 -576
  124. package/dist/services-2aecbda8.esm.js +0 -65
  125. package/dist/services-508322f3.cjs.dev.js +0 -70
  126. package/dist/services-5c4d6977.cjs.prod.js +0 -70
  127. package/dist/thirdweb-dev-service-utils.cjs.d.ts +0 -2
  128. package/dist/thirdweb-dev-service-utils.cjs.d.ts.map +0 -1
  129. package/dist/thirdweb-dev-service-utils.cjs.dev.js +0 -12
  130. package/dist/thirdweb-dev-service-utils.cjs.js +0 -7
  131. package/dist/thirdweb-dev-service-utils.cjs.prod.js +0 -12
  132. package/dist/thirdweb-dev-service-utils.esm.js +0 -1
  133. package/node/dist/thirdweb-dev-service-utils-node.cjs.d.ts +0 -2
  134. package/node/dist/thirdweb-dev-service-utils-node.cjs.d.ts.map +0 -1
  135. package/node/dist/thirdweb-dev-service-utils-node.cjs.dev.js +0 -193
  136. package/node/dist/thirdweb-dev-service-utils-node.cjs.js +0 -7
  137. package/node/dist/thirdweb-dev-service-utils-node.cjs.prod.js +0 -193
  138. package/node/dist/thirdweb-dev-service-utils-node.esm.js +0 -180
  139. package/node/package.json +0 -4
  140. /package/dist/{declarations/src → types}/core/rateLimit/types.d.ts +0 -0
  141. /package/dist/{declarations/src → types}/core/types.d.ts +0 -0
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SERVICES = exports.SERVICE_NAMES = exports.SERVICE_DEFINITIONS = void 0;
4
+ exports.getServiceByName = getServiceByName;
5
+ exports.SERVICE_DEFINITIONS = {
6
+ storage: {
7
+ name: "storage",
8
+ title: "Storage",
9
+ description: "IPFS Upload and Download",
10
+ actions: [
11
+ {
12
+ name: "read",
13
+ title: "Download",
14
+ description: "Download a file from Storage",
15
+ },
16
+ {
17
+ name: "write",
18
+ title: "Upload",
19
+ description: "Upload a file to Storage",
20
+ },
21
+ ],
22
+ },
23
+ rpc: {
24
+ name: "rpc",
25
+ title: "RPC",
26
+ description: "Accelerated RPC Edge",
27
+ // all actions allowed
28
+ actions: [],
29
+ },
30
+ bundler: {
31
+ name: "bundler",
32
+ title: "Account Abstraction",
33
+ description: "Bundler & Paymaster services",
34
+ // all actions allowed
35
+ actions: [],
36
+ },
37
+ relayer: {
38
+ name: "relayer",
39
+ title: "Gasless Relayer",
40
+ description: "Enable gasless transactions",
41
+ // all actions allowed
42
+ actions: [],
43
+ },
44
+ embeddedWallets: {
45
+ name: "embeddedWallets",
46
+ title: "In-App Wallets",
47
+ description: "E-mail and social login wallets for easy web3 onboarding",
48
+ // all actions allowed
49
+ actions: [],
50
+ },
51
+ pay: {
52
+ name: "pay",
53
+ title: "Pay",
54
+ description: "Pay for a blockchain transaction with any currency",
55
+ // all actions allowed
56
+ actions: [],
57
+ },
58
+ chainsaw: {
59
+ name: "chainsaw",
60
+ title: "Chainsaw",
61
+ description: "Indexed data for any EVM chain",
62
+ // all actions allowed
63
+ actions: [],
64
+ },
65
+ insight: {
66
+ name: "insight",
67
+ title: "Insight",
68
+ description: "Insight services",
69
+ // all actions allowed
70
+ actions: [],
71
+ },
72
+ nebula: {
73
+ name: "nebula",
74
+ title: "Nebula",
75
+ description: "Advanced blockchain reasoning and execution capabilities with AI",
76
+ // all actions allowed
77
+ actions: [],
78
+ },
79
+ };
80
+ exports.SERVICE_NAMES = Object.keys(exports.SERVICE_DEFINITIONS);
81
+ exports.SERVICES = Object.values(exports.SERVICE_DEFINITIONS);
82
+ function getServiceByName(name) {
83
+ return exports.SERVICE_DEFINITIONS[name];
84
+ }
85
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/core/services.ts"],"names":[],"mappings":";;;AA8FA,4CAEC;AAhGY,QAAA,mBAAmB,GAAG;IACjC,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,UAAU;gBACjB,WAAW,EAAE,8BAA8B;aAC5C;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,0BAA0B;aACxC;SACF;KACF;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,sBAAsB;QACnC,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,8BAA8B;QAC3C,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,6BAA6B;QAC1C,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,eAAe,EAAE;QACf,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,0DAA0D;QACvE,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,oDAAoD;QACjE,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,gCAAgC;QAC7C,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,kBAAkB;QAC/B,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,kEAAkE;QACpE,sBAAsB;QACtB,OAAO,EAAE,EAAE;KACZ;CACO,CAAC;AAEE,QAAA,aAAa,GAAG,MAAM,CAAC,IAAI,CACtC,2BAAmB,CACoB,CAAC;AAE7B,QAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,2BAAmB,CAAC,CAAC;AAa3D,SAAgB,gBAAgB,CAAC,IAAiB;IAChD,OAAO,2BAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.usageEventSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.usageEventSchema = zod_1.z.object({
6
+ source: zod_1.z.string(),
7
+ action: zod_1.z.string(),
8
+ /**
9
+ * The following fields are optional.
10
+ */
11
+ accountId: zod_1.z.string().optional(),
12
+ isClientEvent: zod_1.z.boolean().optional(),
13
+ apiKeyId: zod_1.z.string().optional(),
14
+ creatorWalletAddress: zod_1.z.string().optional(),
15
+ clientId: zod_1.z.string().optional(),
16
+ walletAddress: zod_1.z.string().optional(),
17
+ walletType: zod_1.z.string().optional(),
18
+ chainId: zod_1.z.number().int().positive().optional(),
19
+ provider: zod_1.z.string().optional(),
20
+ mimeType: zod_1.z.string().optional(),
21
+ fileSize: zod_1.z.number().int().nonnegative().optional(),
22
+ fileCid: zod_1.z.string().optional(),
23
+ evmMethod: zod_1.z.string().optional(),
24
+ userOpHash: zod_1.z.string().optional(),
25
+ gasLimit: zod_1.z.number().nonnegative().optional(),
26
+ gasPricePerUnit: zod_1.z.string().optional(),
27
+ transactionFeeUsd: zod_1.z.number().optional(),
28
+ transactionHash: zod_1.z.string().optional(),
29
+ sdkName: zod_1.z.string().optional(),
30
+ sdkVersion: zod_1.z.string().optional(),
31
+ sdkPlatform: zod_1.z.string().optional(),
32
+ sdkOS: zod_1.z.string().optional(),
33
+ productName: zod_1.z.string().optional(),
34
+ transactionValue: zod_1.z.string().optional(),
35
+ pathname: zod_1.z.string().optional(),
36
+ contractAddress: zod_1.z.string().optional(),
37
+ errorCode: zod_1.z.string().optional(),
38
+ httpStatusCode: zod_1.z.number().int().nonnegative().optional(),
39
+ functionName: zod_1.z.string().optional(),
40
+ extension: zod_1.z.string().optional(),
41
+ retryCount: zod_1.z.number().int().nonnegative().optional(),
42
+ policyId: zod_1.z.string().optional(),
43
+ msSinceQueue: zod_1.z.number().nonnegative().optional(),
44
+ msSinceSend: zod_1.z.number().nonnegative().optional(),
45
+ msTotalDuration: zod_1.z.number().nonnegative().optional(),
46
+ swapId: zod_1.z.string().optional(),
47
+ tokenAddress: zod_1.z.string().optional(),
48
+ amountWei: zod_1.z.string().optional(),
49
+ amountUSDCents: zod_1.z.number().nonnegative().optional(),
50
+ httpMethod: zod_1.z
51
+ .enum([
52
+ "GET",
53
+ "POST",
54
+ "PUT",
55
+ "DELETE",
56
+ "PATCH",
57
+ "HEAD",
58
+ "CONNECT",
59
+ "OPTIONS",
60
+ "TRACE",
61
+ ])
62
+ .optional(),
63
+ // Used to identify the ecosystem that the an ecosystem wallet belongs too
64
+ ecosystemId: zod_1.z.string().optional(),
65
+ ecosystemPartnerId: zod_1.z.string().optional(),
66
+ authenticationMethod: zod_1.z.string().optional(),
67
+ chainName: zod_1.z.string().optional(),
68
+ tokenSymbol: zod_1.z.string().optional(),
69
+ dstChainId: zod_1.z.number().optional(),
70
+ dstTokenAddress: zod_1.z.string().optional(),
71
+ dstChainName: zod_1.z.string().optional(),
72
+ dstTokenSymbol: zod_1.z.string().optional(),
73
+ msLatency: zod_1.z.number().optional(),
74
+ toAmountUSDCents: zod_1.z.number().optional(),
75
+ secondaryProvider: zod_1.z.string().optional(),
76
+ onRampId: zod_1.z.string().optional(),
77
+ evmRequestParams: zod_1.z.string().optional(),
78
+ providerIp: zod_1.z.string().optional(),
79
+ promptTokens: zod_1.z.number().int().nonnegative().optional(),
80
+ completionTokens: zod_1.z.number().int().nonnegative().optional(),
81
+ modelName: zod_1.z.string().optional(),
82
+ sessionId: zod_1.z.string().optional(),
83
+ requestId: zod_1.z.string().optional(),
84
+ });
85
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/core/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authorizeDomain = exports.authorizeBundleId = exports.updateRateLimitedAt = exports.fetchTeamAndProject = void 0;
4
+ const tslib_1 = require("tslib");
5
+ // Exports the public service definitions.
6
+ tslib_1.__exportStar(require("./core/services.js"), exports);
7
+ var api_js_1 = require("./core/api.js");
8
+ Object.defineProperty(exports, "fetchTeamAndProject", { enumerable: true, get: function () { return api_js_1.fetchTeamAndProject; } });
9
+ Object.defineProperty(exports, "updateRateLimitedAt", { enumerable: true, get: function () { return api_js_1.updateRateLimitedAt; } });
10
+ var client_js_1 = require("./core/authorize/client.js");
11
+ Object.defineProperty(exports, "authorizeBundleId", { enumerable: true, get: function () { return client_js_1.authorizeBundleId; } });
12
+ Object.defineProperty(exports, "authorizeDomain", { enumerable: true, get: function () { return client_js_1.authorizeDomain; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAAA,0CAA0C;AAC1C,6DAAmC;AAWnC,wCAAyE;AAAhE,6GAAA,mBAAmB,OAAA;AAAE,6GAAA,mBAAmB,OAAA;AAEjD,wDAGoC;AAFlC,8GAAA,iBAAiB,OAAA;AACjB,4GAAA,eAAe,OAAA"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validBundlerServiceConfig = exports.validServiceConfig = exports.validTeamAndProjectResponse = exports.validTeamResponse = exports.validProjectResponse = void 0;
4
+ exports.validProjectResponse = {
5
+ id: "1",
6
+ publishableKey: "your-api-key",
7
+ walletAddresses: ["creator-address"],
8
+ domains: ["example.com", "*.example.com"],
9
+ bundleIds: [],
10
+ services: [
11
+ {
12
+ name: "storage",
13
+ actions: ["read", "write"],
14
+ },
15
+ {
16
+ name: "rpc",
17
+ actions: [],
18
+ },
19
+ {
20
+ name: "bundler",
21
+ actions: [],
22
+ allowedChainIds: [1, 2, 3],
23
+ },
24
+ ],
25
+ teamId: "1",
26
+ createdAt: new Date("2024-06-01"),
27
+ updatedAt: new Date("2024-06-01"),
28
+ name: "test-project",
29
+ slug: "test-project",
30
+ image: "https://example.com/image.png",
31
+ };
32
+ exports.validTeamResponse = {
33
+ id: "1",
34
+ name: "test-team",
35
+ slug: "test-team",
36
+ image: "https://example.com/image.png",
37
+ createdAt: new Date("2024-06-01"),
38
+ updatedAt: new Date("2024-06-01"),
39
+ billingPlan: "free",
40
+ billingEmail: "test@example.com",
41
+ billingStatus: "noCustomer",
42
+ growthTrialEligible: false,
43
+ enabledScopes: ["storage", "rpc", "bundler"],
44
+ };
45
+ exports.validTeamAndProjectResponse = {
46
+ team: exports.validTeamResponse,
47
+ project: exports.validProjectResponse,
48
+ };
49
+ exports.validServiceConfig = {
50
+ apiUrl: "https://api.example.com",
51
+ serviceScope: "storage",
52
+ serviceApiKey: "service-api-key",
53
+ serviceAction: "read",
54
+ };
55
+ exports.validBundlerServiceConfig = {
56
+ apiUrl: "https://api.example.com",
57
+ serviceScope: "bundler",
58
+ serviceApiKey: "service-api-key",
59
+ };
60
+ //# sourceMappingURL=mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/mocks.ts"],"names":[],"mappings":";;;AAOa,QAAA,oBAAoB,GAAoB;IACnD,EAAE,EAAE,GAAG;IACP,cAAc,EAAE,cAAc;IAC9B,eAAe,EAAE,CAAC,iBAAiB,CAAC;IACpC,OAAO,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;IACzC,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SAC3B;QACD;YACE,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,EAAE;SACZ;QACD;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,EAAE;YACX,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC3B;KACF;IACD,MAAM,EAAE,GAAG;IACX,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACjC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACjC,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,+BAA+B;CACvC,CAAC;AAEW,QAAA,iBAAiB,GAAiB;IAC7C,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,+BAA+B;IACtC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACjC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACjC,WAAW,EAAE,MAAM;IACnB,YAAY,EAAE,kBAAkB;IAChC,aAAa,EAAE,YAAY;IAC3B,mBAAmB,EAAE,KAAK;IAC1B,aAAa,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC;CAC7C,CAAC;AAEW,QAAA,2BAA2B,GAA2B;IACjE,IAAI,EAAE,yBAAiB;IACvB,OAAO,EAAE,4BAAoB;CAC9B,CAAC;AAEW,QAAA,kBAAkB,GAAsB;IACnD,MAAM,EAAE,yBAAyB;IACjC,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,iBAAiB;IAChC,aAAa,EAAE,MAAM;CACtB,CAAC;AAEW,QAAA,yBAAyB,GAAsB;IAC1D,MAAM,EAAE,yBAAyB;IACjC,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,iBAAiB;CACjC,CAAC"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authorizeNode = authorizeNode;
4
+ exports.extractAuthorizationData = extractAuthorizationData;
5
+ exports.hashSecretKey = hashSecretKey;
6
+ exports.deriveClientIdFromSecretKeyHash = deriveClientIdFromSecretKeyHash;
7
+ exports.logHttpRequest = logHttpRequest;
8
+ const tslib_1 = require("tslib");
9
+ const node_crypto_1 = require("node:crypto");
10
+ const index_js_1 = require("../core/authorize/index.js");
11
+ tslib_1.__exportStar(require("../core/usage.js"), exports);
12
+ tslib_1.__exportStar(require("../core/rateLimit/index.js"), exports);
13
+ tslib_1.__exportStar(require("../core/services.js"), exports);
14
+ /**
15
+ *
16
+ * @param {AuthInput['req']} authInput.req - The incoming request from which information will be pulled from. These information includes (checks are in order and terminates on first match):
17
+ * - clientId: Checks header `x-client-id`, search param `clientId`
18
+ * - bundleId: Checks header `x-bundle-id`, search param `bundleId`
19
+ * - secretKey: Checks header `x-secret-key`
20
+ * - origin (the requesting domain): Checks header `origin`, `referer`
21
+ * @param {AuthInput['clientId']} authInput.clientId - Overrides any clientId found on the `req` object
22
+ * @param {AuthInput['targetAddress']} authInput.targetAddress - Only used in smart wallets to determine if the request is authorized to interact with the target address.
23
+ * @param {NodeServiceConfig['enforceAuth']} serviceConfig - Always `true` unless you need to turn auth off. Tells the service whether or not to enforce auth.
24
+ * @param {NodeServiceConfig['apiUrl']} serviceConfig.apiUrl - The url of the api server to fetch information for verification. `https://api.thirdweb.com` for production and `https://api.staging.thirdweb.com` for staging
25
+ * @param {NodeServiceConfig['serviceApiKey']} serviceConfig.serviceApiKey - secret key to be used authenticate the caller of the api-server. Check the api-server's env variable for the keys.
26
+ * @param {NodeServiceConfig['serviceScope']} serviceConfig.serviceScope - The service that we are requesting authorization for. E.g. `relayer`, `rpc`, 'bundler', 'storage' etc.
27
+ * @param {NodeServiceConfig['serviceAction']} serviceConfig.serviceAction - Needed when the `serviceScope` is `storage`. Can be either `read` or `write`.
28
+ * @param {NodeServiceConfig['useWalletAuth']} serviceConfig.useWalletAuth - If true it pings the `wallet/me` or else, `account/me`. You most likely can leave this as false.
29
+ * @returns {AuthorizationResult} authorizationResult - contains if the request is authorized, and information about the account if it is authorized. Otherwise, it contains the error message and status code.
30
+ */
31
+ async function authorizeNode(authInput, serviceConfig, cacheOptions) {
32
+ let authData;
33
+ try {
34
+ authData = extractAuthorizationData(authInput);
35
+ }
36
+ catch (e) {
37
+ if (e instanceof Error && e.message === "KEY_CONFLICT") {
38
+ return {
39
+ authorized: false,
40
+ status: 400,
41
+ errorMessage: "Please pass either a client id or a secret key.",
42
+ errorCode: "KEY_CONFLICT",
43
+ };
44
+ }
45
+ return {
46
+ authorized: false,
47
+ status: 500,
48
+ errorMessage: "Internal Server Error",
49
+ errorCode: "INTERNAL_SERVER_ERROR",
50
+ };
51
+ }
52
+ return await (0, index_js_1.authorize)(authData, serviceConfig, cacheOptions);
53
+ }
54
+ function getHeader(headers, headerName) {
55
+ const header = headers[headerName];
56
+ if (Array.isArray(header)) {
57
+ return header?.[0] ?? null;
58
+ }
59
+ return header ?? null;
60
+ }
61
+ function extractAuthorizationData(authInput) {
62
+ let requestUrl;
63
+ try {
64
+ requestUrl = new URL(authInput.req.url || "", `http://${authInput.req.headers.host}`);
65
+ }
66
+ catch (error) {
67
+ console.log("** Node URL Error **", error);
68
+ throw error;
69
+ }
70
+ const headers = authInput.req.headers;
71
+ const secretKey = getHeader(headers, "x-secret-key");
72
+ // prefer clientId that is explicitly passed in
73
+ let clientId = authInput.clientId ?? null;
74
+ if (!clientId) {
75
+ // next preference is clientId from header
76
+ clientId = getHeader(headers, "x-client-id");
77
+ }
78
+ // next preference is search param
79
+ if (!clientId) {
80
+ clientId = requestUrl.searchParams.get("clientId");
81
+ }
82
+ // bundle id from header is first preference
83
+ let bundleId = getHeader(headers, "x-bundle-id");
84
+ // next preference is search param
85
+ if (!bundleId) {
86
+ bundleId = requestUrl.searchParams.get("bundleId");
87
+ }
88
+ let ecosystemId = getHeader(headers, "x-ecosystem-id");
89
+ if (!ecosystemId) {
90
+ ecosystemId = requestUrl.searchParams.get("ecosystemId");
91
+ }
92
+ let ecosystemPartnerId = getHeader(headers, "x-ecosystem-partner-id");
93
+ if (!ecosystemPartnerId) {
94
+ ecosystemPartnerId = requestUrl.searchParams.get("ecosystemPartnerId");
95
+ }
96
+ let origin = getHeader(headers, "origin");
97
+ // if origin header is not available we'll fall back to referrer;
98
+ if (!origin) {
99
+ origin = getHeader(headers, "referer");
100
+ }
101
+ // if we have an origin at this point, normalize it
102
+ if (origin) {
103
+ try {
104
+ origin = new URL(origin).host;
105
+ }
106
+ catch (e) {
107
+ console.warn("failed to parse origin", origin, e);
108
+ }
109
+ }
110
+ // handle if we a secret key is passed in the headers
111
+ let secretKeyHash = null;
112
+ if (secretKey) {
113
+ // hash the secret key
114
+ secretKeyHash = hashSecretKey(secretKey);
115
+ // derive the client id from the secret key hash
116
+ const derivedClientId = deriveClientIdFromSecretKeyHash(secretKeyHash);
117
+ // if we already have a client id passed in we need to make sure they match
118
+ if (clientId && clientId !== derivedClientId) {
119
+ throw new Error("KEY_CONFLICT");
120
+ }
121
+ // otherwise set the client id to the derived client id (client id based off of secret key)
122
+ clientId = derivedClientId;
123
+ }
124
+ let jwt = null;
125
+ let useWalletAuth = null;
126
+ // check for authorization header on the request
127
+ const authorizationHeader = getHeader(headers, "authorization");
128
+ if (authorizationHeader) {
129
+ const [type, token] = authorizationHeader.split(" ");
130
+ if (type?.toLowerCase() === "bearer" && !!token) {
131
+ jwt = token;
132
+ const walletAuthHeader = getHeader(headers, "x-authorize-wallet");
133
+ // IK a stringified boolean is not ideal, but it's required to pass it in the headers.
134
+ if (walletAuthHeader?.toLowerCase() === "true") {
135
+ useWalletAuth = walletAuthHeader;
136
+ }
137
+ }
138
+ }
139
+ return {
140
+ jwt,
141
+ hashedJWT: jwt ? hashSecretKey(jwt) : null,
142
+ secretKeyHash,
143
+ secretKey,
144
+ clientId,
145
+ ecosystemId,
146
+ ecosystemPartnerId,
147
+ origin,
148
+ bundleId,
149
+ targetAddress: authInput.targetAddress,
150
+ useWalletAuth,
151
+ };
152
+ }
153
+ function hashSecretKey(secretKey) {
154
+ return (0, node_crypto_1.createHash)("sha256").update(secretKey).digest("hex");
155
+ }
156
+ function deriveClientIdFromSecretKeyHash(secretKeyHash) {
157
+ return secretKeyHash.slice(0, 32);
158
+ }
159
+ function logHttpRequest({ clientId, req, res, isAuthed, statusMessage, latencyMs, }) {
160
+ try {
161
+ const authorizationData = extractAuthorizationData({ req, clientId });
162
+ const headers = req.headers;
163
+ console.log(JSON.stringify({
164
+ method: req.method,
165
+ pathname: req.url,
166
+ hasSecretKey: !!authorizationData.secretKey,
167
+ hasClientId: !!authorizationData.clientId,
168
+ hasJwt: !!authorizationData.jwt,
169
+ clientId: authorizationData.clientId,
170
+ isAuthed,
171
+ status: res.statusCode,
172
+ statusMessage,
173
+ sdkName: headers["x-sdk-name"] ?? undefined,
174
+ sdkVersion: headers["x-sdk-version"] ?? undefined,
175
+ platform: headers["x-sdk-platform"] ?? undefined,
176
+ os: headers["x-sdk-os"] ?? undefined,
177
+ latencyMs,
178
+ }));
179
+ }
180
+ catch { }
181
+ }
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/node/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,156 @@
1
+ import { authorize } from "../core/authorize/index.js";
2
+ export * from "./usage.js";
3
+ export * from "../core/services.js";
4
+ export * from "../core/rateLimit/index.js";
5
+ const DEFAULT_CACHE_TTL_SECONDS = 60;
6
+ export async function authorizeWorker(authInput, serviceConfig) {
7
+ let authData;
8
+ try {
9
+ authData = await extractAuthorizationData(authInput);
10
+ }
11
+ catch (e) {
12
+ if (e instanceof Error && e.message === "KEY_CONFLICT") {
13
+ return {
14
+ authorized: false,
15
+ status: 400,
16
+ errorMessage: "Please pass either a client id or a secret key.",
17
+ errorCode: "KEY_CONFLICT",
18
+ };
19
+ }
20
+ return {
21
+ authorized: false,
22
+ status: 500,
23
+ errorMessage: "Internal Server Error",
24
+ errorCode: "INTERNAL_SERVER_ERROR",
25
+ };
26
+ }
27
+ return await authorize(authData, serviceConfig, {
28
+ get: async (clientId) => serviceConfig.kvStore.get(clientId),
29
+ put: (clientId, data) => serviceConfig.ctx.waitUntil(serviceConfig.kvStore.put(clientId, JSON.stringify({
30
+ updatedAt: Date.now(),
31
+ data,
32
+ }), {
33
+ expirationTtl: serviceConfig.cacheTtlSeconds &&
34
+ serviceConfig.cacheTtlSeconds >= DEFAULT_CACHE_TTL_SECONDS
35
+ ? serviceConfig.cacheTtlSeconds
36
+ : DEFAULT_CACHE_TTL_SECONDS,
37
+ })),
38
+ cacheTtlSeconds: serviceConfig.cacheTtlSeconds ?? DEFAULT_CACHE_TTL_SECONDS,
39
+ });
40
+ }
41
+ export async function extractAuthorizationData(authInput) {
42
+ const requestUrl = new URL(authInput.req.url);
43
+ const headers = authInput.req.headers;
44
+ const secretKey = headers.get("x-secret-key");
45
+ // prefer clientId that is explicitly passed in
46
+ let clientId = authInput.clientId ?? null;
47
+ if (!clientId) {
48
+ // next preference is clientId from header
49
+ clientId = headers.get("x-client-id");
50
+ }
51
+ // next preference is search param
52
+ if (!clientId) {
53
+ clientId = requestUrl.searchParams.get("clientId");
54
+ }
55
+ // bundle id from header is first preference
56
+ let bundleId = headers.get("x-bundle-id");
57
+ // next preference is search param
58
+ if (!bundleId) {
59
+ bundleId = requestUrl.searchParams.get("bundleId");
60
+ }
61
+ let ecosystemId = headers.get("x-ecosystem-id");
62
+ if (!ecosystemId) {
63
+ ecosystemId = requestUrl.searchParams.get("ecosystemId");
64
+ }
65
+ let ecosystemPartnerId = headers.get("x-ecosystem-partner-id");
66
+ if (!ecosystemPartnerId) {
67
+ ecosystemPartnerId = requestUrl.searchParams.get("ecosystemPartnerId");
68
+ }
69
+ let origin = headers.get("origin");
70
+ // if origin header is not available we'll fall back to referrer;
71
+ if (!origin) {
72
+ origin = headers.get("referer");
73
+ }
74
+ // if we have an origin at this point, normalize it
75
+ if (origin) {
76
+ try {
77
+ origin = new URL(origin).host;
78
+ }
79
+ catch (e) {
80
+ console.warn("failed to parse origin", origin, e);
81
+ }
82
+ }
83
+ // handle if we a secret key is passed in the headers
84
+ let secretKeyHash = null;
85
+ if (secretKey) {
86
+ // hash the secret key
87
+ secretKeyHash = await hashSecretKey(secretKey);
88
+ // derive the client id from the secret key hash
89
+ const derivedClientId = deriveClientIdFromSecretKeyHash(secretKeyHash);
90
+ // if we already have a client id passed in we need to make sure they match
91
+ if (clientId && clientId !== derivedClientId) {
92
+ throw new Error("KEY_CONFLICT");
93
+ }
94
+ // otherwise set the client id to the derived client id (client id based off of secret key)
95
+ clientId = derivedClientId;
96
+ }
97
+ let jwt = null;
98
+ if (headers.has("authorization")) {
99
+ const authHeader = headers.get("authorization");
100
+ if (authHeader) {
101
+ const [type, token] = authHeader.split(" ");
102
+ if (type?.toLowerCase() === "bearer" && !!token) {
103
+ jwt = token;
104
+ }
105
+ }
106
+ }
107
+ return {
108
+ jwt,
109
+ hashedJWT: jwt ? await hashSecretKey(jwt) : null,
110
+ secretKey,
111
+ clientId,
112
+ ecosystemId,
113
+ ecosystemPartnerId,
114
+ origin,
115
+ bundleId,
116
+ secretKeyHash,
117
+ targetAddress: authInput.targetAddress,
118
+ };
119
+ }
120
+ export async function hashSecretKey(secretKey) {
121
+ return bufferToHex(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(secretKey)));
122
+ }
123
+ export function deriveClientIdFromSecretKeyHash(secretKeyHash) {
124
+ return secretKeyHash.slice(0, 32);
125
+ }
126
+ function bufferToHex(buffer) {
127
+ return [...new Uint8Array(buffer)]
128
+ .map((x) => x.toString(16).padStart(2, "0"))
129
+ .join("");
130
+ }
131
+ export async function logHttpRequest({ clientId, req, res, isAuthed, statusMessage, latencyMs, }) {
132
+ try {
133
+ const authorizationData = await extractAuthorizationData({ req, clientId });
134
+ const headers = req.headers;
135
+ console.log(JSON.stringify({
136
+ method: req.method,
137
+ pathname: req.url,
138
+ hasSecretKey: !!authorizationData.secretKey,
139
+ hasClientId: !!authorizationData.clientId,
140
+ hasJwt: !!authorizationData.jwt,
141
+ clientId: authorizationData.clientId,
142
+ isAuthed,
143
+ status: res.status,
144
+ sdkName: headers.get("x-sdk-name") ?? undefined,
145
+ sdkVersion: headers.get("x-sdk-version") ?? undefined,
146
+ platform: headers.get("x-sdk-platform") ?? undefined,
147
+ os: headers.get("x-sdk-os") ?? undefined,
148
+ latencyMs,
149
+ }));
150
+ if (statusMessage) {
151
+ console.log(`statusMessage=${statusMessage}`);
152
+ }
153
+ }
154
+ catch { }
155
+ }
156
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cf-worker/index.ts"],"names":[],"mappings":"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"}