@shware/http 1.0.3 → 1.0.5
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.
- package/dist/error/index.cjs +63 -0
- package/dist/error/index.cjs.map +1 -0
- package/dist/error/index.d.cts +19 -0
- package/dist/error/index.d.ts +19 -0
- package/dist/error/index.mjs +35 -0
- package/dist/error/index.mjs.map +1 -0
- package/dist/index.cjs +10 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +11 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{webhook.cjs → webhook/index.cjs} +3 -3
- package/dist/webhook/index.cjs.map +1 -0
- package/dist/{webhook.mjs → webhook/index.mjs} +3 -3
- package/dist/webhook/index.mjs.map +1 -0
- package/package.json +6 -1
- package/dist/webhook.cjs.map +0 -1
- package/dist/webhook.mjs.map +0 -1
- /package/dist/{webhook.d.cts → webhook/index.d.cts} +0 -0
- /package/dist/{webhook.d.ts → webhook/index.d.ts} +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/error/index.ts
|
|
21
|
+
var error_exports = {};
|
|
22
|
+
__export(error_exports, {
|
|
23
|
+
CheckoutCreateError: () => CheckoutCreateError,
|
|
24
|
+
LoginCanceledError: () => LoginCanceledError,
|
|
25
|
+
LoginTimeoutError: () => LoginTimeoutError,
|
|
26
|
+
PurchaseError: () => PurchaseError
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(error_exports);
|
|
29
|
+
var LoginTimeoutError = class extends Error {
|
|
30
|
+
constructor(timeout) {
|
|
31
|
+
super(`Login timeout after ${timeout}ms`);
|
|
32
|
+
this.name = "LoginTimeoutError";
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var LoginCanceledError = class extends Error {
|
|
36
|
+
constructor() {
|
|
37
|
+
super("Login canceled by user");
|
|
38
|
+
this.name = "LoginCanceledError";
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var CheckoutCreateError = class extends Error {
|
|
42
|
+
constructor() {
|
|
43
|
+
super("Failed to create checkout session");
|
|
44
|
+
this.name = "SessionCreateError";
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var PurchaseError = /* @__PURE__ */ ((PurchaseError2) => {
|
|
48
|
+
PurchaseError2["LOGIN_TIMEOUT"] = "LOGIN_TIMEOUT";
|
|
49
|
+
PurchaseError2["LOGIN_CANCELED"] = "LOGIN_CANCELED";
|
|
50
|
+
PurchaseError2["CHECKOUT_CANCELED"] = "CHECKOUT_CANCELED";
|
|
51
|
+
PurchaseError2["CHECKOUT_CREATE_FAILED"] = "CHECKOUT_CREATE_FAILED";
|
|
52
|
+
PurchaseError2["CHECKOUT_SESSION_ID_NOT_FOUND"] = "CHECKOUT_SESSION_ID_NOT_FOUND";
|
|
53
|
+
PurchaseError2["UNKNOWN"] = "UNKNOWN";
|
|
54
|
+
return PurchaseError2;
|
|
55
|
+
})(PurchaseError || {});
|
|
56
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
57
|
+
0 && (module.exports = {
|
|
58
|
+
CheckoutCreateError,
|
|
59
|
+
LoginCanceledError,
|
|
60
|
+
LoginTimeoutError,
|
|
61
|
+
PurchaseError
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/error/index.ts"],"sourcesContent":["export class LoginTimeoutError extends Error {\n constructor(timeout: number) {\n super(`Login timeout after ${timeout}ms`);\n this.name = 'LoginTimeoutError';\n }\n}\n\nexport class LoginCanceledError extends Error {\n constructor() {\n super('Login canceled by user');\n this.name = 'LoginCanceledError';\n }\n}\n\nexport class CheckoutCreateError extends Error {\n constructor() {\n super('Failed to create checkout session');\n this.name = 'SessionCreateError';\n }\n}\n\nexport enum PurchaseError {\n LOGIN_TIMEOUT = 'LOGIN_TIMEOUT',\n LOGIN_CANCELED = 'LOGIN_CANCELED',\n CHECKOUT_CANCELED = 'CHECKOUT_CANCELED',\n CHECKOUT_CREATE_FAILED = 'CHECKOUT_CREATE_FAILED',\n CHECKOUT_SESSION_ID_NOT_FOUND = 'CHECKOUT_SESSION_ID_NOT_FOUND',\n UNKNOWN = 'UNKNOWN',\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,SAAiB;AAC3B,UAAM,uBAAuB,OAAO,IAAI;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,cAAc;AACZ,UAAM,wBAAwB;AAC9B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,cAAc;AACZ,UAAM,mCAAmC;AACzC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAK,gBAAL,kBAAKA,mBAAL;AACL,EAAAA,eAAA,mBAAgB;AAChB,EAAAA,eAAA,oBAAiB;AACjB,EAAAA,eAAA,uBAAoB;AACpB,EAAAA,eAAA,4BAAyB;AACzB,EAAAA,eAAA,mCAAgC;AAChC,EAAAA,eAAA,aAAU;AANA,SAAAA;AAAA,GAAA;","names":["PurchaseError"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
declare class LoginTimeoutError extends Error {
|
|
2
|
+
constructor(timeout: number);
|
|
3
|
+
}
|
|
4
|
+
declare class LoginCanceledError extends Error {
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
declare class CheckoutCreateError extends Error {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
declare enum PurchaseError {
|
|
11
|
+
LOGIN_TIMEOUT = "LOGIN_TIMEOUT",
|
|
12
|
+
LOGIN_CANCELED = "LOGIN_CANCELED",
|
|
13
|
+
CHECKOUT_CANCELED = "CHECKOUT_CANCELED",
|
|
14
|
+
CHECKOUT_CREATE_FAILED = "CHECKOUT_CREATE_FAILED",
|
|
15
|
+
CHECKOUT_SESSION_ID_NOT_FOUND = "CHECKOUT_SESSION_ID_NOT_FOUND",
|
|
16
|
+
UNKNOWN = "UNKNOWN"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { CheckoutCreateError, LoginCanceledError, LoginTimeoutError, PurchaseError };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
declare class LoginTimeoutError extends Error {
|
|
2
|
+
constructor(timeout: number);
|
|
3
|
+
}
|
|
4
|
+
declare class LoginCanceledError extends Error {
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
declare class CheckoutCreateError extends Error {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
declare enum PurchaseError {
|
|
11
|
+
LOGIN_TIMEOUT = "LOGIN_TIMEOUT",
|
|
12
|
+
LOGIN_CANCELED = "LOGIN_CANCELED",
|
|
13
|
+
CHECKOUT_CANCELED = "CHECKOUT_CANCELED",
|
|
14
|
+
CHECKOUT_CREATE_FAILED = "CHECKOUT_CREATE_FAILED",
|
|
15
|
+
CHECKOUT_SESSION_ID_NOT_FOUND = "CHECKOUT_SESSION_ID_NOT_FOUND",
|
|
16
|
+
UNKNOWN = "UNKNOWN"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { CheckoutCreateError, LoginCanceledError, LoginTimeoutError, PurchaseError };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/error/index.ts
|
|
2
|
+
var LoginTimeoutError = class extends Error {
|
|
3
|
+
constructor(timeout) {
|
|
4
|
+
super(`Login timeout after ${timeout}ms`);
|
|
5
|
+
this.name = "LoginTimeoutError";
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
var LoginCanceledError = class extends Error {
|
|
9
|
+
constructor() {
|
|
10
|
+
super("Login canceled by user");
|
|
11
|
+
this.name = "LoginCanceledError";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var CheckoutCreateError = class extends Error {
|
|
15
|
+
constructor() {
|
|
16
|
+
super("Failed to create checkout session");
|
|
17
|
+
this.name = "SessionCreateError";
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var PurchaseError = /* @__PURE__ */ ((PurchaseError2) => {
|
|
21
|
+
PurchaseError2["LOGIN_TIMEOUT"] = "LOGIN_TIMEOUT";
|
|
22
|
+
PurchaseError2["LOGIN_CANCELED"] = "LOGIN_CANCELED";
|
|
23
|
+
PurchaseError2["CHECKOUT_CANCELED"] = "CHECKOUT_CANCELED";
|
|
24
|
+
PurchaseError2["CHECKOUT_CREATE_FAILED"] = "CHECKOUT_CREATE_FAILED";
|
|
25
|
+
PurchaseError2["CHECKOUT_SESSION_ID_NOT_FOUND"] = "CHECKOUT_SESSION_ID_NOT_FOUND";
|
|
26
|
+
PurchaseError2["UNKNOWN"] = "UNKNOWN";
|
|
27
|
+
return PurchaseError2;
|
|
28
|
+
})(PurchaseError || {});
|
|
29
|
+
export {
|
|
30
|
+
CheckoutCreateError,
|
|
31
|
+
LoginCanceledError,
|
|
32
|
+
LoginTimeoutError,
|
|
33
|
+
PurchaseError
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/error/index.ts"],"sourcesContent":["export class LoginTimeoutError extends Error {\n constructor(timeout: number) {\n super(`Login timeout after ${timeout}ms`);\n this.name = 'LoginTimeoutError';\n }\n}\n\nexport class LoginCanceledError extends Error {\n constructor() {\n super('Login canceled by user');\n this.name = 'LoginCanceledError';\n }\n}\n\nexport class CheckoutCreateError extends Error {\n constructor() {\n super('Failed to create checkout session');\n this.name = 'SessionCreateError';\n }\n}\n\nexport enum PurchaseError {\n LOGIN_TIMEOUT = 'LOGIN_TIMEOUT',\n LOGIN_CANCELED = 'LOGIN_CANCELED',\n CHECKOUT_CANCELED = 'CHECKOUT_CANCELED',\n CHECKOUT_CREATE_FAILED = 'CHECKOUT_CREATE_FAILED',\n CHECKOUT_SESSION_ID_NOT_FOUND = 'CHECKOUT_SESSION_ID_NOT_FOUND',\n UNKNOWN = 'UNKNOWN',\n}\n"],"mappings":";AAAO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,SAAiB;AAC3B,UAAM,uBAAuB,OAAO,IAAI;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,cAAc;AACZ,UAAM,wBAAwB;AAC9B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,cAAc;AACZ,UAAM,mCAAmC;AACzC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAK,gBAAL,kBAAKA,mBAAL;AACL,EAAAA,eAAA,mBAAgB;AAChB,EAAAA,eAAA,oBAAiB;AACjB,EAAAA,eAAA,uBAAoB;AACpB,EAAAA,eAAA,4BAAyB;AACzB,EAAAA,eAAA,mCAAgC;AAChC,EAAAA,eAAA,aAAU;AANA,SAAAA;AAAA,GAAA;","names":["PurchaseError"]}
|
package/dist/index.cjs
CHANGED
|
@@ -31,12 +31,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
// src/index.ts
|
|
32
32
|
var index_exports = {};
|
|
33
33
|
__export(index_exports, {
|
|
34
|
+
CheckoutCreateError: () => import_error.CheckoutCreateError,
|
|
35
|
+
LoginCanceledError: () => import_error.LoginCanceledError,
|
|
36
|
+
LoginTimeoutError: () => import_error.LoginTimeoutError,
|
|
34
37
|
MAX_LENGTH: () => MAX_LENGTH,
|
|
38
|
+
PurchaseError: () => import_error.PurchaseError,
|
|
35
39
|
TokenBucket: () => import_token_bucket.TokenBucket,
|
|
36
40
|
hasText: () => import_string.hasText,
|
|
37
41
|
invariant: () => import_invariant.invariant,
|
|
38
|
-
timing: () => import_timing.timing
|
|
39
|
-
verifyStandardWebhook: () => import_webhook.verifyStandardWebhook
|
|
42
|
+
timing: () => import_timing.timing
|
|
40
43
|
});
|
|
41
44
|
module.exports = __toCommonJS(index_exports);
|
|
42
45
|
__reExport(index_exports, require("./detail.cjs"), module.exports);
|
|
@@ -47,17 +50,20 @@ __reExport(index_exports, require("./response.cjs"), module.exports);
|
|
|
47
50
|
var MAX_LENGTH = __toESM(require("./max-length/index.cjs"), 1);
|
|
48
51
|
var import_string = require("./utils/string.cjs");
|
|
49
52
|
var import_timing = require("./utils/timing.cjs");
|
|
50
|
-
var import_webhook = require("./webhook.cjs");
|
|
51
53
|
var import_invariant = require("./utils/invariant.cjs");
|
|
52
54
|
var import_token_bucket = require("./utils/token-bucket.cjs");
|
|
55
|
+
var import_error = require("./error/index.cjs");
|
|
53
56
|
// Annotate the CommonJS export names for ESM import in node:
|
|
54
57
|
0 && (module.exports = {
|
|
58
|
+
CheckoutCreateError,
|
|
59
|
+
LoginCanceledError,
|
|
60
|
+
LoginTimeoutError,
|
|
55
61
|
MAX_LENGTH,
|
|
62
|
+
PurchaseError,
|
|
56
63
|
TokenBucket,
|
|
57
64
|
hasText,
|
|
58
65
|
invariant,
|
|
59
66
|
timing,
|
|
60
|
-
verifyStandardWebhook,
|
|
61
67
|
...require("./detail.cjs"),
|
|
62
68
|
...require("./status.cjs"),
|
|
63
69
|
...require("./vaild.cjs"),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './reason';\n\nexport * from './detail';\nexport * from './status';\nexport * from './vaild';\nexport * from './snowflake';\nexport * from './response';\nexport * as MAX_LENGTH from './max-length/index';\nexport { hasText } from './utils/string';\nexport { timing } from './utils/timing';\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './reason';\n\nexport * from './detail';\nexport * from './status';\nexport * from './vaild';\nexport * from './snowflake';\nexport * from './response';\nexport * as MAX_LENGTH from './max-length/index';\nexport { hasText } from './utils/string';\nexport { timing } from './utils/timing';\nexport { invariant } from './utils/invariant';\nexport { TokenBucket, type TokenBucketOptions } from './utils/token-bucket';\n\nexport {\n LoginTimeoutError,\n LoginCanceledError,\n CheckoutCreateError,\n PurchaseError,\n} from './error/index';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA,0BAAc,yBAvBd;AAwBA,0BAAc,yBAxBd;AAyBA,0BAAc,wBAzBd;AA0BA,0BAAc,4BA1Bd;AA2BA,0BAAc,2BA3Bd;AA4BA,iBAA4B;AAC5B,oBAAwB;AACxB,oBAAuB;AACvB,uBAA0B;AAC1B,0BAAqD;AAErD,mBAKO;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -7,8 +7,8 @@ export { Cursor, Empty, Entity, EntityId, InitParams, NextParams, PageParams, Pa
|
|
|
7
7
|
export { i as MAX_LENGTH } from './index-BnPgRQDl.cjs';
|
|
8
8
|
export { hasText } from './utils/string.cjs';
|
|
9
9
|
export { timing } from './utils/timing.cjs';
|
|
10
|
-
export { verifyStandardWebhook } from './webhook.cjs';
|
|
11
10
|
export { invariant } from './utils/invariant.cjs';
|
|
12
11
|
export { TokenBucket, TokenBucketOptions } from './utils/token-bucket.cjs';
|
|
12
|
+
export { CheckoutCreateError, LoginCanceledError, LoginTimeoutError, PurchaseError } from './error/index.cjs';
|
|
13
13
|
import 'zod/v4-mini';
|
|
14
14
|
import 'zod/v4/core';
|
package/dist/index.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export { Cursor, Empty, Entity, EntityId, InitParams, NextParams, PageParams, Pa
|
|
|
7
7
|
export { i as MAX_LENGTH } from './index-BnPgRQDl.js';
|
|
8
8
|
export { hasText } from './utils/string.js';
|
|
9
9
|
export { timing } from './utils/timing.js';
|
|
10
|
-
export { verifyStandardWebhook } from './webhook.js';
|
|
11
10
|
export { invariant } from './utils/invariant.js';
|
|
12
11
|
export { TokenBucket, TokenBucketOptions } from './utils/token-bucket.js';
|
|
12
|
+
export { CheckoutCreateError, LoginCanceledError, LoginTimeoutError, PurchaseError } from './error/index.js';
|
|
13
13
|
import 'zod/v4-mini';
|
|
14
14
|
import 'zod/v4/core';
|
package/dist/index.mjs
CHANGED
|
@@ -7,15 +7,23 @@ export * from "./response.mjs";
|
|
|
7
7
|
import * as MAX_LENGTH from "./max-length/index.mjs";
|
|
8
8
|
import { hasText } from "./utils/string.mjs";
|
|
9
9
|
import { timing } from "./utils/timing.mjs";
|
|
10
|
-
import { verifyStandardWebhook } from "./webhook.mjs";
|
|
11
10
|
import { invariant } from "./utils/invariant.mjs";
|
|
12
11
|
import { TokenBucket } from "./utils/token-bucket.mjs";
|
|
12
|
+
import {
|
|
13
|
+
LoginTimeoutError,
|
|
14
|
+
LoginCanceledError,
|
|
15
|
+
CheckoutCreateError,
|
|
16
|
+
PurchaseError
|
|
17
|
+
} from "./error/index.mjs";
|
|
13
18
|
export {
|
|
19
|
+
CheckoutCreateError,
|
|
20
|
+
LoginCanceledError,
|
|
21
|
+
LoginTimeoutError,
|
|
14
22
|
MAX_LENGTH,
|
|
23
|
+
PurchaseError,
|
|
15
24
|
TokenBucket,
|
|
16
25
|
hasText,
|
|
17
26
|
invariant,
|
|
18
|
-
timing
|
|
19
|
-
verifyStandardWebhook
|
|
27
|
+
timing
|
|
20
28
|
};
|
|
21
29
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './reason';\n\nexport * from './detail';\nexport * from './status';\nexport * from './vaild';\nexport * from './snowflake';\nexport * from './response';\nexport * as MAX_LENGTH from './max-length/index';\nexport { hasText } from './utils/string';\nexport { timing } from './utils/timing';\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './reason';\n\nexport * from './detail';\nexport * from './status';\nexport * from './vaild';\nexport * from './snowflake';\nexport * from './response';\nexport * as MAX_LENGTH from './max-length/index';\nexport { hasText } from './utils/string';\nexport { timing } from './utils/timing';\nexport { invariant } from './utils/invariant';\nexport { TokenBucket, type TokenBucketOptions } from './utils/token-bucket';\n\nexport {\n LoginTimeoutError,\n LoginCanceledError,\n CheckoutCreateError,\n PurchaseError,\n} from './error/index';\n"],"mappings":";AAuBA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,YAAY,gBAAgB;AAC5B,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,mBAA4C;AAErD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -17,14 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
|
|
20
|
-
// src/webhook.ts
|
|
20
|
+
// src/webhook/index.ts
|
|
21
21
|
var webhook_exports = {};
|
|
22
22
|
__export(webhook_exports, {
|
|
23
23
|
verifyStandardWebhook: () => verifyStandardWebhook
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(webhook_exports);
|
|
26
26
|
var import_crypto = require("crypto");
|
|
27
|
-
var import_status = require("
|
|
27
|
+
var import_status = require("../status.cjs");
|
|
28
28
|
var WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60;
|
|
29
29
|
function verifyTimestamp(webhookTimestamp) {
|
|
30
30
|
const now = Math.floor(Date.now() / 1e3);
|
|
@@ -74,4 +74,4 @@ function verifyStandardWebhook(headers, payload, secret) {
|
|
|
74
74
|
0 && (module.exports = {
|
|
75
75
|
verifyStandardWebhook
|
|
76
76
|
});
|
|
77
|
-
//# sourceMappingURL=
|
|
77
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/webhook/index.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\nimport { Status } from '../status';\n\nconst WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60; // 5 minutes\n\nfunction verifyTimestamp(webhookTimestamp: string) {\n const now = Math.floor(Date.now() / 1000);\n const timestamp = parseInt(webhookTimestamp, 10);\n if (isNaN(timestamp)) {\n throw Status.invalidArgument('invalid webhook timestamp').error();\n }\n if (timestamp < now - WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too old').error();\n }\n if (timestamp > now + WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too new').error();\n }\n return timestamp;\n}\n\n/**\n * reference: https://github.com/standard-webhooks/standard-webhooks/tree/main/libraries/javascript\n * hono usage:\n * ```ts\n * const webhook = verifyStandardWebhook(c.req.header(), await c.req.text(), 'secret');\n * ```\n */\nexport function verifyStandardWebhook<T = unknown>(\n headers: Record<string, string>,\n payload: string,\n secret: string\n): T {\n const webhookId = headers['webhook-id'];\n const webhookTimestamp = headers['webhook-timestamp'];\n const webhookSignature = headers['webhook-signature'];\n if (!webhookId || !webhookTimestamp || !webhookSignature) {\n throw Status.invalidArgument('invalid webhook').error();\n }\n const timestamp = verifyTimestamp(webhookTimestamp);\n\n const encoder = new TextEncoder();\n const toSign = encoder.encode(`${webhookId}.${timestamp}.${payload}`);\n const hmac = createHmac('sha256', Buffer.from(secret, 'base64'));\n const digest = hmac.update(toSign).digest();\n\n const computedSignature = `v1,${Buffer.from(digest).toString('base64')}`;\n const expectedSignature = computedSignature.split(',')[1];\n const passedSignatures = webhookSignature.split(' ');\n\n for (const versionedSignature of passedSignatures) {\n const [version, signature] = versionedSignature.split(',');\n if (version !== 'v1') continue;\n if (timingSafeEqual(encoder.encode(signature), encoder.encode(expectedSignature))) {\n try {\n return JSON.parse(payload) as T;\n } catch (_) {\n console.error('invalid payload', payload);\n throw Status.invalidArgument('invalid webhook payload').error();\n }\n }\n }\n console.error('webhook verification failed');\n throw Status.invalidArgument('invalid webhook signature').error();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4C;AAC5C,oBAAuB;AAEvB,IAAM,+BAA+B,IAAI;AAEzC,SAAS,gBAAgB,kBAA0B;AACjD,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,YAAY,SAAS,kBAAkB,EAAE;AAC/C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,qBAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAAA,EAClE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,qBAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,qBAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,SAAO;AACT;AASO,SAAS,sBACd,SACA,SACA,QACG;AACH,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,MAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,kBAAkB;AACxD,UAAM,qBAAO,gBAAgB,iBAAiB,EAAE,MAAM;AAAA,EACxD;AACA,QAAM,YAAY,gBAAgB,gBAAgB;AAElD,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS,QAAQ,OAAO,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE;AACpE,QAAM,WAAO,0BAAW,UAAU,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAC/D,QAAM,SAAS,KAAK,OAAO,MAAM,EAAE,OAAO;AAE1C,QAAM,oBAAoB,MAAM,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ,CAAC;AACtE,QAAM,oBAAoB,kBAAkB,MAAM,GAAG,EAAE,CAAC;AACxD,QAAM,mBAAmB,iBAAiB,MAAM,GAAG;AAEnD,aAAW,sBAAsB,kBAAkB;AACjD,UAAM,CAAC,SAAS,SAAS,IAAI,mBAAmB,MAAM,GAAG;AACzD,QAAI,YAAY,KAAM;AACtB,YAAI,+BAAgB,QAAQ,OAAO,SAAS,GAAG,QAAQ,OAAO,iBAAiB,CAAC,GAAG;AACjF,UAAI;AACF,eAAO,KAAK,MAAM,OAAO;AAAA,MAC3B,SAAS,GAAG;AACV,gBAAQ,MAAM,mBAAmB,OAAO;AACxC,cAAM,qBAAO,gBAAgB,yBAAyB,EAAE,MAAM;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,UAAQ,MAAM,6BAA6B;AAC3C,QAAM,qBAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAClE;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// src/webhook.ts
|
|
1
|
+
// src/webhook/index.ts
|
|
2
2
|
import { createHmac, timingSafeEqual } from "crypto";
|
|
3
|
-
import { Status } from "
|
|
3
|
+
import { Status } from "../status.mjs";
|
|
4
4
|
var WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60;
|
|
5
5
|
function verifyTimestamp(webhookTimestamp) {
|
|
6
6
|
const now = Math.floor(Date.now() / 1e3);
|
|
@@ -49,4 +49,4 @@ function verifyStandardWebhook(headers, payload, secret) {
|
|
|
49
49
|
export {
|
|
50
50
|
verifyStandardWebhook
|
|
51
51
|
};
|
|
52
|
-
//# sourceMappingURL=
|
|
52
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/webhook/index.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\nimport { Status } from '../status';\n\nconst WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60; // 5 minutes\n\nfunction verifyTimestamp(webhookTimestamp: string) {\n const now = Math.floor(Date.now() / 1000);\n const timestamp = parseInt(webhookTimestamp, 10);\n if (isNaN(timestamp)) {\n throw Status.invalidArgument('invalid webhook timestamp').error();\n }\n if (timestamp < now - WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too old').error();\n }\n if (timestamp > now + WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too new').error();\n }\n return timestamp;\n}\n\n/**\n * reference: https://github.com/standard-webhooks/standard-webhooks/tree/main/libraries/javascript\n * hono usage:\n * ```ts\n * const webhook = verifyStandardWebhook(c.req.header(), await c.req.text(), 'secret');\n * ```\n */\nexport function verifyStandardWebhook<T = unknown>(\n headers: Record<string, string>,\n payload: string,\n secret: string\n): T {\n const webhookId = headers['webhook-id'];\n const webhookTimestamp = headers['webhook-timestamp'];\n const webhookSignature = headers['webhook-signature'];\n if (!webhookId || !webhookTimestamp || !webhookSignature) {\n throw Status.invalidArgument('invalid webhook').error();\n }\n const timestamp = verifyTimestamp(webhookTimestamp);\n\n const encoder = new TextEncoder();\n const toSign = encoder.encode(`${webhookId}.${timestamp}.${payload}`);\n const hmac = createHmac('sha256', Buffer.from(secret, 'base64'));\n const digest = hmac.update(toSign).digest();\n\n const computedSignature = `v1,${Buffer.from(digest).toString('base64')}`;\n const expectedSignature = computedSignature.split(',')[1];\n const passedSignatures = webhookSignature.split(' ');\n\n for (const versionedSignature of passedSignatures) {\n const [version, signature] = versionedSignature.split(',');\n if (version !== 'v1') continue;\n if (timingSafeEqual(encoder.encode(signature), encoder.encode(expectedSignature))) {\n try {\n return JSON.parse(payload) as T;\n } catch (_) {\n console.error('invalid payload', payload);\n throw Status.invalidArgument('invalid webhook payload').error();\n }\n }\n }\n console.error('webhook verification failed');\n throw Status.invalidArgument('invalid webhook signature').error();\n}\n"],"mappings":";AAAA,SAAS,YAAY,uBAAuB;AAC5C,SAAS,cAAc;AAEvB,IAAM,+BAA+B,IAAI;AAEzC,SAAS,gBAAgB,kBAA0B;AACjD,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,YAAY,SAAS,kBAAkB,EAAE;AAC/C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAAA,EAClE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,OAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,OAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,SAAO;AACT;AASO,SAAS,sBACd,SACA,SACA,QACG;AACH,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,MAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,kBAAkB;AACxD,UAAM,OAAO,gBAAgB,iBAAiB,EAAE,MAAM;AAAA,EACxD;AACA,QAAM,YAAY,gBAAgB,gBAAgB;AAElD,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS,QAAQ,OAAO,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE;AACpE,QAAM,OAAO,WAAW,UAAU,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAC/D,QAAM,SAAS,KAAK,OAAO,MAAM,EAAE,OAAO;AAE1C,QAAM,oBAAoB,MAAM,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ,CAAC;AACtE,QAAM,oBAAoB,kBAAkB,MAAM,GAAG,EAAE,CAAC;AACxD,QAAM,mBAAmB,iBAAiB,MAAM,GAAG;AAEnD,aAAW,sBAAsB,kBAAkB;AACjD,UAAM,CAAC,SAAS,SAAS,IAAI,mBAAmB,MAAM,GAAG;AACzD,QAAI,YAAY,KAAM;AACtB,QAAI,gBAAgB,QAAQ,OAAO,SAAS,GAAG,QAAQ,OAAO,iBAAiB,CAAC,GAAG;AACjF,UAAI;AACF,eAAO,KAAK,MAAM,OAAO;AAAA,MAC3B,SAAS,GAAG;AACV,gBAAQ,MAAM,mBAAmB,OAAO;AACxC,cAAM,OAAO,gBAAgB,yBAAyB,EAAE,MAAM;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,UAAQ,MAAM,6BAA6B;AAC3C,QAAM,OAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAClE;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shware/http",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -28,6 +28,11 @@
|
|
|
28
28
|
"import": "./dist/hono/index.mjs",
|
|
29
29
|
"require": "./dist/hono/index.cjs"
|
|
30
30
|
},
|
|
31
|
+
"./webhook": {
|
|
32
|
+
"types": "./dist/webhook/index.d.ts",
|
|
33
|
+
"import": "./dist/webhook/index.mjs",
|
|
34
|
+
"require": "./dist/webhook/index.cjs"
|
|
35
|
+
},
|
|
31
36
|
"./google-one-tap": {
|
|
32
37
|
"types": "./dist/google-one-tap/index.d.ts",
|
|
33
38
|
"import": "./dist/google-one-tap/index.mjs",
|
package/dist/webhook.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/webhook.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\nimport { Status } from './status';\n\nconst WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60; // 5 minutes\n\nfunction verifyTimestamp(webhookTimestamp: string) {\n const now = Math.floor(Date.now() / 1000);\n const timestamp = parseInt(webhookTimestamp, 10);\n if (isNaN(timestamp)) {\n throw Status.invalidArgument('invalid webhook timestamp').error();\n }\n if (timestamp < now - WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too old').error();\n }\n if (timestamp > now + WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too new').error();\n }\n return timestamp;\n}\n\n/**\n * reference: https://github.com/standard-webhooks/standard-webhooks/tree/main/libraries/javascript\n * hono usage:\n * ```ts\n * const webhook = verifyStandardWebhook(c.req.header(), await c.req.text(), 'secret');\n * ```\n */\nexport function verifyStandardWebhook<T = unknown>(\n headers: Record<string, string>,\n payload: string,\n secret: string\n): T {\n const webhookId = headers['webhook-id'];\n const webhookTimestamp = headers['webhook-timestamp'];\n const webhookSignature = headers['webhook-signature'];\n if (!webhookId || !webhookTimestamp || !webhookSignature) {\n throw Status.invalidArgument('invalid webhook').error();\n }\n const timestamp = verifyTimestamp(webhookTimestamp);\n\n const encoder = new TextEncoder();\n const toSign = encoder.encode(`${webhookId}.${timestamp}.${payload}`);\n const hmac = createHmac('sha256', Buffer.from(secret, 'base64'));\n const digest = hmac.update(toSign).digest();\n\n const computedSignature = `v1,${Buffer.from(digest).toString('base64')}`;\n const expectedSignature = computedSignature.split(',')[1];\n const passedSignatures = webhookSignature.split(' ');\n\n for (const versionedSignature of passedSignatures) {\n const [version, signature] = versionedSignature.split(',');\n if (version !== 'v1') continue;\n if (timingSafeEqual(encoder.encode(signature), encoder.encode(expectedSignature))) {\n try {\n return JSON.parse(payload) as T;\n } catch (_) {\n console.error('invalid payload', payload);\n throw Status.invalidArgument('invalid webhook payload').error();\n }\n }\n }\n console.error('webhook verification failed');\n throw Status.invalidArgument('invalid webhook signature').error();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4C;AAC5C,oBAAuB;AAEvB,IAAM,+BAA+B,IAAI;AAEzC,SAAS,gBAAgB,kBAA0B;AACjD,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,YAAY,SAAS,kBAAkB,EAAE;AAC/C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,qBAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAAA,EAClE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,qBAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,qBAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,SAAO;AACT;AASO,SAAS,sBACd,SACA,SACA,QACG;AACH,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,MAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,kBAAkB;AACxD,UAAM,qBAAO,gBAAgB,iBAAiB,EAAE,MAAM;AAAA,EACxD;AACA,QAAM,YAAY,gBAAgB,gBAAgB;AAElD,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS,QAAQ,OAAO,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE;AACpE,QAAM,WAAO,0BAAW,UAAU,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAC/D,QAAM,SAAS,KAAK,OAAO,MAAM,EAAE,OAAO;AAE1C,QAAM,oBAAoB,MAAM,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ,CAAC;AACtE,QAAM,oBAAoB,kBAAkB,MAAM,GAAG,EAAE,CAAC;AACxD,QAAM,mBAAmB,iBAAiB,MAAM,GAAG;AAEnD,aAAW,sBAAsB,kBAAkB;AACjD,UAAM,CAAC,SAAS,SAAS,IAAI,mBAAmB,MAAM,GAAG;AACzD,QAAI,YAAY,KAAM;AACtB,YAAI,+BAAgB,QAAQ,OAAO,SAAS,GAAG,QAAQ,OAAO,iBAAiB,CAAC,GAAG;AACjF,UAAI;AACF,eAAO,KAAK,MAAM,OAAO;AAAA,MAC3B,SAAS,GAAG;AACV,gBAAQ,MAAM,mBAAmB,OAAO;AACxC,cAAM,qBAAO,gBAAgB,yBAAyB,EAAE,MAAM;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,UAAQ,MAAM,6BAA6B;AAC3C,QAAM,qBAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAClE;","names":[]}
|
package/dist/webhook.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/webhook.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\nimport { Status } from './status';\n\nconst WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60; // 5 minutes\n\nfunction verifyTimestamp(webhookTimestamp: string) {\n const now = Math.floor(Date.now() / 1000);\n const timestamp = parseInt(webhookTimestamp, 10);\n if (isNaN(timestamp)) {\n throw Status.invalidArgument('invalid webhook timestamp').error();\n }\n if (timestamp < now - WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too old').error();\n }\n if (timestamp > now + WEBHOOK_TOLERANCE_IN_SECONDS) {\n throw Status.invalidArgument('webhook timestamp is too new').error();\n }\n return timestamp;\n}\n\n/**\n * reference: https://github.com/standard-webhooks/standard-webhooks/tree/main/libraries/javascript\n * hono usage:\n * ```ts\n * const webhook = verifyStandardWebhook(c.req.header(), await c.req.text(), 'secret');\n * ```\n */\nexport function verifyStandardWebhook<T = unknown>(\n headers: Record<string, string>,\n payload: string,\n secret: string\n): T {\n const webhookId = headers['webhook-id'];\n const webhookTimestamp = headers['webhook-timestamp'];\n const webhookSignature = headers['webhook-signature'];\n if (!webhookId || !webhookTimestamp || !webhookSignature) {\n throw Status.invalidArgument('invalid webhook').error();\n }\n const timestamp = verifyTimestamp(webhookTimestamp);\n\n const encoder = new TextEncoder();\n const toSign = encoder.encode(`${webhookId}.${timestamp}.${payload}`);\n const hmac = createHmac('sha256', Buffer.from(secret, 'base64'));\n const digest = hmac.update(toSign).digest();\n\n const computedSignature = `v1,${Buffer.from(digest).toString('base64')}`;\n const expectedSignature = computedSignature.split(',')[1];\n const passedSignatures = webhookSignature.split(' ');\n\n for (const versionedSignature of passedSignatures) {\n const [version, signature] = versionedSignature.split(',');\n if (version !== 'v1') continue;\n if (timingSafeEqual(encoder.encode(signature), encoder.encode(expectedSignature))) {\n try {\n return JSON.parse(payload) as T;\n } catch (_) {\n console.error('invalid payload', payload);\n throw Status.invalidArgument('invalid webhook payload').error();\n }\n }\n }\n console.error('webhook verification failed');\n throw Status.invalidArgument('invalid webhook signature').error();\n}\n"],"mappings":";AAAA,SAAS,YAAY,uBAAuB;AAC5C,SAAS,cAAc;AAEvB,IAAM,+BAA+B,IAAI;AAEzC,SAAS,gBAAgB,kBAA0B;AACjD,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,YAAY,SAAS,kBAAkB,EAAE;AAC/C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAAA,EAClE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,OAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,MAAI,YAAY,MAAM,8BAA8B;AAClD,UAAM,OAAO,gBAAgB,8BAA8B,EAAE,MAAM;AAAA,EACrE;AACA,SAAO;AACT;AASO,SAAS,sBACd,SACA,SACA,QACG;AACH,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,QAAM,mBAAmB,QAAQ,mBAAmB;AACpD,MAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,kBAAkB;AACxD,UAAM,OAAO,gBAAgB,iBAAiB,EAAE,MAAM;AAAA,EACxD;AACA,QAAM,YAAY,gBAAgB,gBAAgB;AAElD,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS,QAAQ,OAAO,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE;AACpE,QAAM,OAAO,WAAW,UAAU,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAC/D,QAAM,SAAS,KAAK,OAAO,MAAM,EAAE,OAAO;AAE1C,QAAM,oBAAoB,MAAM,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ,CAAC;AACtE,QAAM,oBAAoB,kBAAkB,MAAM,GAAG,EAAE,CAAC;AACxD,QAAM,mBAAmB,iBAAiB,MAAM,GAAG;AAEnD,aAAW,sBAAsB,kBAAkB;AACjD,UAAM,CAAC,SAAS,SAAS,IAAI,mBAAmB,MAAM,GAAG;AACzD,QAAI,YAAY,KAAM;AACtB,QAAI,gBAAgB,QAAQ,OAAO,SAAS,GAAG,QAAQ,OAAO,iBAAiB,CAAC,GAAG;AACjF,UAAI;AACF,eAAO,KAAK,MAAM,OAAO;AAAA,MAC3B,SAAS,GAAG;AACV,gBAAQ,MAAM,mBAAmB,OAAO;AACxC,cAAM,OAAO,gBAAgB,yBAAyB,EAAE,MAAM;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,UAAQ,MAAM,6BAA6B;AAC3C,QAAM,OAAO,gBAAgB,2BAA2B,EAAE,MAAM;AAClE;","names":[]}
|
|
File without changes
|
|
File without changes
|