@thirdweb-dev/service-utils 0.5.0-nightly-f5aed34d-20230829001006 → 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 (137) 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 +10 -8
  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/types/core/rateLimit/index.d.ts +20 -0
  78. package/dist/types/core/rateLimit/index.d.ts.map +1 -0
  79. package/dist/types/core/rateLimit/types.d.ts +13 -0
  80. package/dist/types/core/rateLimit/types.d.ts.map +1 -0
  81. package/dist/{declarations/src → types}/core/services.d.ts +84 -4
  82. package/dist/types/core/services.d.ts.map +1 -0
  83. package/dist/types/core/types.d.ts.map +1 -0
  84. package/dist/types/core/usage.d.ts +196 -0
  85. package/dist/types/core/usage.d.ts.map +1 -0
  86. package/dist/types/index.d.ts +5 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/mocks.d.ts +7 -0
  89. package/dist/types/mocks.d.ts.map +1 -0
  90. package/dist/types/node/index.d.ts +41 -0
  91. package/dist/types/node/index.d.ts.map +1 -0
  92. package/package.json +42 -44
  93. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.d.ts +0 -2
  94. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.d.ts.map +0 -1
  95. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.dev.js +0 -240
  96. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.js +0 -7
  97. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.cjs.prod.js +0 -240
  98. package/cf-worker/dist/thirdweb-dev-service-utils-cf-worker.esm.js +0 -227
  99. package/cf-worker/package.json +0 -4
  100. package/dist/declarations/src/cf-worker/index.d.ts.map +0 -1
  101. package/dist/declarations/src/cf-worker/usage.d.ts +0 -79
  102. package/dist/declarations/src/cf-worker/usage.d.ts.map +0 -1
  103. package/dist/declarations/src/core/api.d.ts +0 -48
  104. package/dist/declarations/src/core/api.d.ts.map +0 -1
  105. package/dist/declarations/src/core/authorize/client.d.ts +0 -9
  106. package/dist/declarations/src/core/authorize/client.d.ts.map +0 -1
  107. package/dist/declarations/src/core/authorize/index.d.ts.map +0 -1
  108. package/dist/declarations/src/core/authorize/service.d.ts +0 -7
  109. package/dist/declarations/src/core/authorize/service.d.ts.map +0 -1
  110. package/dist/declarations/src/core/authorize/types.d.ts +0 -12
  111. package/dist/declarations/src/core/authorize/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/index.d.ts +0 -2
  115. package/dist/declarations/src/index.d.ts.map +0 -1
  116. package/dist/declarations/src/node/index.d.ts +0 -23
  117. package/dist/declarations/src/node/index.d.ts.map +0 -1
  118. package/dist/index-6e0ecc5f.cjs.prod.js +0 -424
  119. package/dist/index-cd4f96ef.cjs.dev.js +0 -424
  120. package/dist/index-ffddf746.esm.js +0 -422
  121. package/dist/services-86283509.esm.js +0 -44
  122. package/dist/services-9e185105.cjs.prod.js +0 -49
  123. package/dist/services-a3f36057.cjs.dev.js +0 -49
  124. package/dist/thirdweb-dev-service-utils.cjs.d.ts +0 -2
  125. package/dist/thirdweb-dev-service-utils.cjs.d.ts.map +0 -1
  126. package/dist/thirdweb-dev-service-utils.cjs.dev.js +0 -12
  127. package/dist/thirdweb-dev-service-utils.cjs.js +0 -7
  128. package/dist/thirdweb-dev-service-utils.cjs.prod.js +0 -12
  129. package/dist/thirdweb-dev-service-utils.esm.js +0 -1
  130. package/node/dist/thirdweb-dev-service-utils-node.cjs.d.ts +0 -2
  131. package/node/dist/thirdweb-dev-service-utils-node.cjs.d.ts.map +0 -1
  132. package/node/dist/thirdweb-dev-service-utils-node.cjs.dev.js +0 -167
  133. package/node/dist/thirdweb-dev-service-utils-node.cjs.js +0 -7
  134. package/node/dist/thirdweb-dev-service-utils-node.cjs.prod.js +0 -167
  135. package/node/dist/thirdweb-dev-service-utils-node.esm.js +0 -155
  136. package/node/package.json +0 -4
  137. /package/dist/{declarations/src → types}/core/types.d.ts +0 -0
@@ -0,0 +1,53 @@
1
+ import { AwsClient } from "aws4fetch";
2
+ import { usageEventSchema } from "../core/usage.js";
3
+ // Initialize a singleton for AWS usage.
4
+ let _aws;
5
+ function getAws(options) {
6
+ if (!_aws) {
7
+ _aws = new AwsClient(options);
8
+ }
9
+ return _aws;
10
+ }
11
+ /**
12
+ * Publish usage events. Provide the relevant fields for your application.
13
+ *
14
+ * Usage in Cloudflare Workers:
15
+ * ctx.waitUntil(
16
+ * publishUsageEvents(
17
+ * [event1, event2],
18
+ * { queueUrl, accessKeyId, secretAccessKey },
19
+ * )
20
+ * )
21
+ *
22
+ * @param usageEvents
23
+ * @param config
24
+ */
25
+ async function publishUsageEvents(usageEvents, config) {
26
+ const { queueUrl, accessKeyId, secretAccessKey, region = "us-west-2", } = config;
27
+ const entries = usageEvents.map((event) => {
28
+ // Enforce schema of usage event.
29
+ const parsed = usageEventSchema.parse(event);
30
+ return {
31
+ Id: crypto.randomUUID(),
32
+ MessageBody: JSON.stringify(parsed),
33
+ };
34
+ });
35
+ const aws = getAws({
36
+ accessKeyId,
37
+ secretAccessKey,
38
+ region,
39
+ });
40
+ await aws.fetch(`https://sqs.${region}.amazonaws.com`, {
41
+ headers: {
42
+ "X-Amz-Target": "AmazonSQS.SendMessageBatch",
43
+ "X-Amz-Date": new Date().toISOString(),
44
+ "Content-Type": "application/x-amz-json-1.0",
45
+ },
46
+ body: JSON.stringify({
47
+ QueueUrl: queueUrl,
48
+ Entries: entries,
49
+ }),
50
+ });
51
+ }
52
+ export { publishUsageEvents };
53
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/cf-worker/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAmB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGrE,wCAAwC;AACxC,IAAI,IAA2B,CAAC;AAChC,SAAS,MAAM,CAAC,OAAmD;IACjE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,kBAAkB,CAC/B,WAAyB,EACzB,MAKC;IAED,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,eAAe,EACf,MAAM,GAAG,WAAW,GACrB,GAAG,MAAM,CAAC;IAEX,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxC,iCAAiC;QACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC;QACjB,WAAW;QACX,eAAe;QACf,MAAM;KACP,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,KAAK,CAAC,eAAe,MAAM,gBAAgB,EAAE;QACrD,OAAO,EAAE;YACP,cAAc,EAAE,4BAA4B;YAC5C,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,cAAc,EAAE,4BAA4B;SAC7C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;SACjB,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ export async function fetchTeamAndProject(authData, config) {
2
+ const { apiUrl, serviceApiKey } = config;
3
+ const clientId = authData.clientId;
4
+ const url = `${apiUrl}/v2/keys/use${clientId ? `?clientId=${clientId}` : ""}`;
5
+ const response = await fetch(url, {
6
+ method: "GET",
7
+ headers: {
8
+ ...(authData.secretKey ? { "x-secret-key": authData.secretKey } : {}),
9
+ ...(authData.jwt ? { Authorization: `Bearer ${authData.jwt}` } : {}),
10
+ "x-service-api-key": serviceApiKey,
11
+ "content-type": "application/json",
12
+ },
13
+ });
14
+ let text = "";
15
+ try {
16
+ text = await response.text();
17
+ return JSON.parse(text);
18
+ }
19
+ catch {
20
+ throw new Error(`Error fetching key metadata from API: ${response.status} - ${text}`);
21
+ }
22
+ }
23
+ export async function updateRateLimitedAt(projectId, config) {
24
+ const { apiUrl, serviceScope: scope, serviceApiKey } = config;
25
+ const url = `${apiUrl}/usage/rateLimit`;
26
+ await fetch(url, {
27
+ method: "PUT",
28
+ headers: {
29
+ "x-service-api-key": serviceApiKey,
30
+ "content-type": "application/json",
31
+ },
32
+ body: JSON.stringify({
33
+ apiKeyId: projectId, // projectId is the apiKeyId
34
+ scope,
35
+ }),
36
+ });
37
+ }
38
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/core/api.ts"],"names":[],"mappings":"AAuIA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAA4B,EAC5B,MAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAEzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,MAAM,GAAG,GAAG,GAAG,MAAM,eAAe,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,mBAAmB,EAAE,aAAa;YAClC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,yCAAyC,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,MAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAE9D,MAAM,GAAG,GAAG,GAAG,MAAM,kBAAkB,CAAC;IAExC,MAAM,KAAK,CAAC,GAAG,EAAE;QACf,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,mBAAmB,EAAE,aAAa;YAClC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,SAAS,EAAE,4BAA4B;YACjD,KAAK;SACN,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,93 @@
1
+ export function authorizeClient(authOptions, teamAndProjectResponse) {
2
+ const { origin, bundleId } = authOptions;
3
+ const { team, project } = teamAndProjectResponse;
4
+ const authResult = {
5
+ authorized: true,
6
+ team,
7
+ project,
8
+ };
9
+ if (!project) {
10
+ return authResult;
11
+ }
12
+ // check for public restrictions
13
+ if (project.domains.includes("*")) {
14
+ return authResult;
15
+ }
16
+ // validate domains
17
+ if (origin) {
18
+ if (authorizeDomain({
19
+ domains: project.domains,
20
+ origin,
21
+ })) {
22
+ return authResult;
23
+ }
24
+ return {
25
+ authorized: false,
26
+ errorMessage: `Invalid request: Unauthorized domain: ${origin}. You can view the restrictions on this API key at https://thirdweb.com/create-api-key`,
27
+ errorCode: "ORIGIN_UNAUTHORIZED",
28
+ status: 401,
29
+ };
30
+ }
31
+ // validate bundleId
32
+ if (bundleId) {
33
+ if (authorizeBundleId({
34
+ bundleIds: project.bundleIds,
35
+ bundleId,
36
+ })) {
37
+ return authResult;
38
+ }
39
+ return {
40
+ authorized: false,
41
+ errorMessage: `Invalid request: Unauthorized Bundle ID: ${bundleId}. You can view the restrictions on this API key at https://thirdweb.com/create-api-key`,
42
+ errorCode: "BUNDLE_UNAUTHORIZED",
43
+ status: 401,
44
+ };
45
+ }
46
+ return {
47
+ authorized: false,
48
+ errorMessage: "The keys are invalid. Please check the secret-key/clientId and try again.",
49
+ errorCode: "UNAUTHORIZED",
50
+ status: 401,
51
+ };
52
+ }
53
+ // Exposed for use in validating ecosystem partners settings
54
+ export function authorizeDomain({ domains, origin, }) {
55
+ // find matching domain, or if all domains allowed
56
+ // embedded-wallet.thirdweb(-dev).com is automatically allowed
57
+ // because the rpc is passed from user's domain to embedded-wallet.thirdweb.com iframe for use.
58
+ // Note this doesn't allow embedded-wallets from being used if it's disabled. The service check that runs after enforces that.
59
+ return !![
60
+ ...domains,
61
+ "embedded-wallet.thirdweb.com",
62
+ "embedded-wallet.thirdweb-dev.com",
63
+ ].find((d) => {
64
+ // if any domain is allowed, we'll return true
65
+ if (d === "*") {
66
+ return true;
67
+ }
68
+ // special rule for `localhost`
69
+ // if the domain is localhost, we'll allow any origin that starts with localhost
70
+ if (d === "localhost" && origin.startsWith("localhost")) {
71
+ return true;
72
+ }
73
+ // If the allowedDomain has a wildcard,
74
+ // we'll check that the ending of our domain matches the wildcard
75
+ if (d.startsWith("*.")) {
76
+ // get rid of the * and check if it ends with the `.<domain>.<tld>`
77
+ const domainRoot = d.slice(1);
78
+ return origin.endsWith(domainRoot);
79
+ }
80
+ // If there's no wildcard, we'll check for an exact match
81
+ return d === origin;
82
+ });
83
+ }
84
+ export function authorizeBundleId({ bundleIds, bundleId, }) {
85
+ // find matching bundle id, or if all bundles allowed
86
+ return !!bundleIds.find((b) => {
87
+ if (b === "*") {
88
+ return true;
89
+ }
90
+ return b === bundleId;
91
+ });
92
+ }
93
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/core/authorize/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { fetchTeamAndProject, } from "../api.js";
2
+ import { authorizeClient } from "./client.js";
3
+ import { authorizeService } from "./service.js";
4
+ export async function authorize(authData, serviceConfig, cacheOptions) {
5
+ let teamAndProjectResponse = null;
6
+ const cacheKey = `key_v2_${authData.clientId ?? authData.secretKeyHash ?? authData.hashedJWT}`;
7
+ // TODO if we have cache options we want to check the cache first
8
+ if (cacheOptions) {
9
+ try {
10
+ const cachedKey = await cacheOptions.get(cacheKey);
11
+ if (cachedKey) {
12
+ const parsed = JSON.parse(cachedKey);
13
+ if ("updatedAt" in parsed) {
14
+ // we want to compare the updatedAt time to the current time
15
+ // if the difference is greater than the cacheTtl we want to ignore the cached data
16
+ const now = Date.now();
17
+ const diff = now - parsed.updatedAt;
18
+ const cacheTtlMs = cacheOptions.cacheTtlSeconds * 1000;
19
+ // only if the diff is less than the cacheTtl do we want to use the cached key
20
+ if (diff < cacheTtlMs) {
21
+ teamAndProjectResponse = parsed.teamAndProjectResponse;
22
+ }
23
+ }
24
+ else {
25
+ teamAndProjectResponse = parsed;
26
+ }
27
+ }
28
+ }
29
+ catch {
30
+ // ignore errors, proceed as if not in cache
31
+ }
32
+ }
33
+ // if we don't have a cached key, fetch from the API
34
+ if (!teamAndProjectResponse) {
35
+ try {
36
+ const { data, error } = await fetchTeamAndProject(authData, serviceConfig);
37
+ if (error) {
38
+ return {
39
+ authorized: false,
40
+ errorCode: error.code,
41
+ errorMessage: error.message,
42
+ status: error.statusCode,
43
+ };
44
+ }
45
+ if (!data) {
46
+ return {
47
+ authorized: false,
48
+ errorCode: "NO_KEY",
49
+ errorMessage: "No error but also no key returned.",
50
+ status: 500,
51
+ };
52
+ }
53
+ // if we have a key for sure then assign it
54
+ teamAndProjectResponse = data;
55
+ // cache the retrieved key if we have cache options
56
+ if (cacheOptions) {
57
+ // we await this always because it can be a promise or not
58
+ await cacheOptions.put(cacheKey, data);
59
+ }
60
+ }
61
+ catch (err) {
62
+ console.warn("failed to fetch key metadata from api", err);
63
+ return {
64
+ authorized: false,
65
+ status: 500,
66
+ errorMessage: "Failed to fetch key metadata. Please check your secret-key/clientId.",
67
+ errorCode: "FAILED_TO_FETCH_KEY",
68
+ };
69
+ }
70
+ }
71
+ if (!teamAndProjectResponse) {
72
+ return {
73
+ authorized: false,
74
+ status: 401,
75
+ errorMessage: "Key is invalid. Please check your secret-key/clientId.",
76
+ errorCode: "INVALID_KEY",
77
+ };
78
+ }
79
+ // now we can validate the key itself
80
+ const clientAuth = authorizeClient(authData, teamAndProjectResponse);
81
+ if (!clientAuth.authorized) {
82
+ return {
83
+ errorCode: clientAuth.errorCode,
84
+ authorized: false,
85
+ status: 401,
86
+ errorMessage: clientAuth.errorMessage,
87
+ };
88
+ }
89
+ // if we've made it this far we need to check service specific authorization
90
+ const serviceAuth = authorizeService(teamAndProjectResponse, serviceConfig);
91
+ if (!serviceAuth.authorized) {
92
+ return {
93
+ errorCode: serviceAuth.errorCode,
94
+ authorized: false,
95
+ status: 403,
96
+ errorMessage: serviceAuth.errorMessage,
97
+ };
98
+ }
99
+ // if we reach this point we are authorized!
100
+ return {
101
+ authorized: true,
102
+ team: teamAndProjectResponse.team,
103
+ project: teamAndProjectResponse.project,
104
+ };
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/authorize/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export function authorizeService(teamAndProjectResponse, serviceConfig) {
2
+ const { team, project } = teamAndProjectResponse;
3
+ if (!team.enabledScopes.includes(serviceConfig.serviceScope)) {
4
+ return {
5
+ authorized: false,
6
+ errorMessage: `Invalid request: Unauthorized service: ${serviceConfig.serviceScope}. You can view the restrictions for this team in your dashboard: https://thirdweb.com`,
7
+ errorCode: "SERVICE_UNAUTHORIZED",
8
+ status: 403,
9
+ };
10
+ }
11
+ if (!project) {
12
+ // acting on behalf of the team (ie. coming from dashboard), authorize
13
+ return {
14
+ authorized: true,
15
+ team,
16
+ };
17
+ }
18
+ // validate services
19
+ const services = project.services;
20
+ const service = services.find((srv) => srv.name === serviceConfig.serviceScope);
21
+ if (!service) {
22
+ return {
23
+ authorized: false,
24
+ errorMessage: `Invalid request: Unauthorized service: ${serviceConfig.serviceScope}. You can view the restrictions on this project in your dashboard: https://thirdweb.com`,
25
+ errorCode: "SERVICE_UNAUTHORIZED",
26
+ status: 403,
27
+ };
28
+ }
29
+ // validate service actions
30
+ if (serviceConfig.serviceAction) {
31
+ const isActionAllowed = service.actions.includes(serviceConfig.serviceAction);
32
+ if (!isActionAllowed) {
33
+ return {
34
+ authorized: false,
35
+ errorMessage: `Invalid request: Unauthorized action: ${serviceConfig.serviceScope} ${serviceConfig.serviceAction}. You can view the restrictions on this API key in your dashboard: https://thirdweb.com/create-api-key`,
36
+ errorCode: "SERVICE_ACTION_UNAUTHORIZED",
37
+ status: 403,
38
+ };
39
+ }
40
+ }
41
+ return {
42
+ authorized: true,
43
+ team,
44
+ project,
45
+ };
46
+ }
47
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/core/authorize/service.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gBAAgB,CAC9B,sBAA8C,EAC9C,aAAgC;IAEhC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC;IAEjD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,0CAA0C,aAAa,CAAC,YAAY,uFAAuF;YACzK,SAAS,EAAE,sBAAsB;YACjC,MAAM,EAAE,GAAG;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,sEAAsE;QACtE,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,IAAI;SACL,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC,YAAY,CACjD,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,0CAA0C,aAAa,CAAC,YAAY,yFAAyF;YAC3K,SAAS,EAAE,sBAAsB;YACjC,MAAM,EAAE,GAAG;SACZ,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IAAI,aAAa,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,eAAe,GAAI,OAAO,CAAC,OAAoB,CAAC,QAAQ,CAC5D,aAAa,CAAC,aAAa,CAC5B,CAAC;QACF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,yCAAyC,aAAa,CAAC,YAAY,IAAI,aAAa,CAAC,aAAa,yGAAyG;gBACzN,SAAS,EAAE,6BAA6B;gBACxC,MAAM,EAAE,GAAG;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/authorize/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { updateRateLimitedAt, } from "../api.js";
2
+ const RATE_LIMIT_WINDOW_SECONDS = 10;
3
+ export async function rateLimit(args) {
4
+ const { project, limitPerSecond, serviceConfig, redis, sampleRate = 1.0, } = args;
5
+ const shouldSampleRequest = Math.random() < sampleRate;
6
+ if (!shouldSampleRequest) {
7
+ return {
8
+ rateLimited: false,
9
+ requestCount: 0,
10
+ rateLimit: 0,
11
+ };
12
+ }
13
+ if (limitPerSecond === 0) {
14
+ // No rate limit is provided. Assume the request is not rate limited.
15
+ return {
16
+ rateLimited: false,
17
+ requestCount: 0,
18
+ rateLimit: 0,
19
+ };
20
+ }
21
+ const serviceScope = serviceConfig.serviceScope;
22
+ // Gets the 10-second window for the current timestamp.
23
+ const timestampWindow = Math.floor(Date.now() / (1000 * RATE_LIMIT_WINDOW_SECONDS)) *
24
+ RATE_LIMIT_WINDOW_SECONDS;
25
+ const key = `rate-limit:${serviceScope}:${project?.id}:${timestampWindow}`;
26
+ // Increment and get the current request count in this window.
27
+ const requestCount = await redis.incr(key);
28
+ if (requestCount === 1) {
29
+ // For the first increment, set an expiration to clean up this key.
30
+ await redis.expire(key, RATE_LIMIT_WINDOW_SECONDS);
31
+ }
32
+ // Get the limit for this window accounting for the sample rate.
33
+ const limitPerWindow = limitPerSecond * sampleRate * RATE_LIMIT_WINDOW_SECONDS;
34
+ if (requestCount > limitPerWindow) {
35
+ // Report rate limit hits.
36
+ if (project?.id) {
37
+ await updateRateLimitedAt(project.id, serviceConfig);
38
+ }
39
+ // Reject requests when they've exceeded 2x the rate limit.
40
+ if (requestCount > 2 * limitPerWindow) {
41
+ return {
42
+ rateLimited: true,
43
+ requestCount,
44
+ rateLimit: limitPerWindow,
45
+ status: 429,
46
+ errorMessage: `You've exceeded your ${serviceScope} rate limit at ${limitPerSecond} reqs/sec. To get higher rate limits, contact us at https://thirdweb.com/contact-us.`,
47
+ errorCode: "RATE_LIMIT_EXCEEDED",
48
+ };
49
+ }
50
+ }
51
+ return {
52
+ rateLimited: false,
53
+ requestCount,
54
+ rateLimit: limitPerWindow,
55
+ };
56
+ }
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/rateLimit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAQrC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAW/B;IACC,MAAM,EACJ,OAAO,EACP,cAAc,EACd,aAAa,EACb,KAAK,EACL,UAAU,GAAG,GAAG,GACjB,GAAG,IAAI,CAAC;IAET,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC;IACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,qEAAqE;QACrE,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAEhD,uDAAuD;IACvD,MAAM,eAAe,GACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,yBAAyB,CAAC,CAAC;QAC3D,yBAAyB,CAAC;IAC5B,MAAM,GAAG,GAAG,cAAc,YAAY,IAAI,OAAO,EAAE,EAAE,IAAI,eAAe,EAAE,CAAC;IAE3E,8DAA8D;IAC9D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,mEAAmE;QACnE,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IACrD,CAAC;IAED,gEAAgE;IAChE,MAAM,cAAc,GAClB,cAAc,GAAG,UAAU,GAAG,yBAAyB,CAAC;IAE1D,IAAI,YAAY,GAAG,cAAc,EAAE,CAAC;QAClC,0BAA0B;QAC1B,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YAChB,MAAM,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACvD,CAAC;QAED,2DAA2D;QAC3D,IAAI,YAAY,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC;YACtC,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,YAAY;gBACZ,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,GAAG;gBACX,YAAY,EAAE,wBAAwB,YAAY,kBAAkB,cAAc,sFAAsF;gBACxK,SAAS,EAAE,qBAAqB;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,YAAY;QACZ,SAAS,EAAE,cAAc;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/rateLimit/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ export const SERVICE_DEFINITIONS = {
2
+ storage: {
3
+ name: "storage",
4
+ title: "Storage",
5
+ description: "IPFS Upload and Download",
6
+ actions: [
7
+ {
8
+ name: "read",
9
+ title: "Download",
10
+ description: "Download a file from Storage",
11
+ },
12
+ {
13
+ name: "write",
14
+ title: "Upload",
15
+ description: "Upload a file to Storage",
16
+ },
17
+ ],
18
+ },
19
+ rpc: {
20
+ name: "rpc",
21
+ title: "RPC",
22
+ description: "Accelerated RPC Edge",
23
+ // all actions allowed
24
+ actions: [],
25
+ },
26
+ bundler: {
27
+ name: "bundler",
28
+ title: "Account Abstraction",
29
+ description: "Bundler & Paymaster services",
30
+ // all actions allowed
31
+ actions: [],
32
+ },
33
+ relayer: {
34
+ name: "relayer",
35
+ title: "Gasless Relayer",
36
+ description: "Enable gasless transactions",
37
+ // all actions allowed
38
+ actions: [],
39
+ },
40
+ embeddedWallets: {
41
+ name: "embeddedWallets",
42
+ title: "In-App Wallets",
43
+ description: "E-mail and social login wallets for easy web3 onboarding",
44
+ // all actions allowed
45
+ actions: [],
46
+ },
47
+ pay: {
48
+ name: "pay",
49
+ title: "Pay",
50
+ description: "Pay for a blockchain transaction with any currency",
51
+ // all actions allowed
52
+ actions: [],
53
+ },
54
+ chainsaw: {
55
+ name: "chainsaw",
56
+ title: "Chainsaw",
57
+ description: "Indexed data for any EVM chain",
58
+ // all actions allowed
59
+ actions: [],
60
+ },
61
+ insight: {
62
+ name: "insight",
63
+ title: "Insight",
64
+ description: "Insight services",
65
+ // all actions allowed
66
+ actions: [],
67
+ },
68
+ nebula: {
69
+ name: "nebula",
70
+ title: "Nebula",
71
+ description: "Advanced blockchain reasoning and execution capabilities with AI",
72
+ // all actions allowed
73
+ actions: [],
74
+ },
75
+ };
76
+ export const SERVICE_NAMES = Object.keys(SERVICE_DEFINITIONS);
77
+ export const SERVICES = Object.values(SERVICE_DEFINITIONS);
78
+ export function getServiceByName(name) {
79
+ return SERVICE_DEFINITIONS[name];
80
+ }
81
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/core/services.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,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;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CACtC,mBAAmB,CACoB,CAAC;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAa3D,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { z } from "zod";
2
+ export const usageEventSchema = z.object({
3
+ source: z.string(),
4
+ action: z.string(),
5
+ /**
6
+ * The following fields are optional.
7
+ */
8
+ accountId: z.string().optional(),
9
+ isClientEvent: z.boolean().optional(),
10
+ apiKeyId: z.string().optional(),
11
+ creatorWalletAddress: z.string().optional(),
12
+ clientId: z.string().optional(),
13
+ walletAddress: z.string().optional(),
14
+ walletType: z.string().optional(),
15
+ chainId: z.number().int().positive().optional(),
16
+ provider: z.string().optional(),
17
+ mimeType: z.string().optional(),
18
+ fileSize: z.number().int().nonnegative().optional(),
19
+ fileCid: z.string().optional(),
20
+ evmMethod: z.string().optional(),
21
+ userOpHash: z.string().optional(),
22
+ gasLimit: z.number().nonnegative().optional(),
23
+ gasPricePerUnit: z.string().optional(),
24
+ transactionFeeUsd: z.number().optional(),
25
+ transactionHash: z.string().optional(),
26
+ sdkName: z.string().optional(),
27
+ sdkVersion: z.string().optional(),
28
+ sdkPlatform: z.string().optional(),
29
+ sdkOS: z.string().optional(),
30
+ productName: z.string().optional(),
31
+ transactionValue: z.string().optional(),
32
+ pathname: z.string().optional(),
33
+ contractAddress: z.string().optional(),
34
+ errorCode: z.string().optional(),
35
+ httpStatusCode: z.number().int().nonnegative().optional(),
36
+ functionName: z.string().optional(),
37
+ extension: z.string().optional(),
38
+ retryCount: z.number().int().nonnegative().optional(),
39
+ policyId: z.string().optional(),
40
+ msSinceQueue: z.number().nonnegative().optional(),
41
+ msSinceSend: z.number().nonnegative().optional(),
42
+ msTotalDuration: z.number().nonnegative().optional(),
43
+ swapId: z.string().optional(),
44
+ tokenAddress: z.string().optional(),
45
+ amountWei: z.string().optional(),
46
+ amountUSDCents: z.number().nonnegative().optional(),
47
+ httpMethod: z
48
+ .enum([
49
+ "GET",
50
+ "POST",
51
+ "PUT",
52
+ "DELETE",
53
+ "PATCH",
54
+ "HEAD",
55
+ "CONNECT",
56
+ "OPTIONS",
57
+ "TRACE",
58
+ ])
59
+ .optional(),
60
+ // Used to identify the ecosystem that the an ecosystem wallet belongs too
61
+ ecosystemId: z.string().optional(),
62
+ ecosystemPartnerId: z.string().optional(),
63
+ authenticationMethod: z.string().optional(),
64
+ chainName: z.string().optional(),
65
+ tokenSymbol: z.string().optional(),
66
+ dstChainId: z.number().optional(),
67
+ dstTokenAddress: z.string().optional(),
68
+ dstChainName: z.string().optional(),
69
+ dstTokenSymbol: z.string().optional(),
70
+ msLatency: z.number().optional(),
71
+ toAmountUSDCents: z.number().optional(),
72
+ secondaryProvider: z.string().optional(),
73
+ onRampId: z.string().optional(),
74
+ evmRequestParams: z.string().optional(),
75
+ providerIp: z.string().optional(),
76
+ promptTokens: z.number().int().nonnegative().optional(),
77
+ completionTokens: z.number().int().nonnegative().optional(),
78
+ modelName: z.string().optional(),
79
+ sessionId: z.string().optional(),
80
+ requestId: z.string().optional(),
81
+ });
82
+ //# 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,5 @@
1
+ // Exports the public service definitions.
2
+ export * from "./core/services.js";
3
+ export { fetchTeamAndProject, updateRateLimitedAt } from "./core/api.js";
4
+ export { authorizeBundleId, authorizeDomain, } from "./core/authorize/client.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,cAAc,oBAAoB,CAAC;AAWnC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAChB,MAAM,4BAA4B,CAAC"}