@stableops/api-sdk 0.1.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.
- package/LICENSE +184 -0
- package/README.md +117 -0
- package/README.zh-CN.md +107 -0
- package/dist/chunk-B2JLHYXK.mjs +83 -0
- package/dist/chunk-B2JLHYXK.mjs.map +1 -0
- package/dist/index.d.mts +247 -0
- package/dist/index.d.ts +247 -0
- package/dist/index.js +481 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +453 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mock.d.mts +74 -0
- package/dist/mock.d.ts +74 -0
- package/dist/mock.js +268 -0
- package/dist/mock.js.map +1 -0
- package/dist/mock.mjs +219 -0
- package/dist/mock.mjs.map +1 -0
- package/dist/webhooks.d.mts +44 -0
- package/dist/webhooks.d.ts +44 -0
- package/dist/webhooks.js +134 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/webhooks.mjs +37 -0
- package/dist/webhooks.mjs.map +1 -0
- package/package.json +87 -0
package/dist/webhooks.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
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/webhooks-entry.ts
|
|
21
|
+
var webhooks_entry_exports = {};
|
|
22
|
+
__export(webhooks_entry_exports, {
|
|
23
|
+
DEFAULT_TOLERANCE_SECONDS: () => DEFAULT_TOLERANCE_SECONDS,
|
|
24
|
+
DELIVERY_ID_HEADER: () => DELIVERY_ID_HEADER,
|
|
25
|
+
EVENT_ID_HEADER: () => EVENT_ID_HEADER,
|
|
26
|
+
SIGNATURE_HEADER: () => SIGNATURE_HEADER,
|
|
27
|
+
WebhooksApi: () => WebhooksApi,
|
|
28
|
+
buildSignatureHeader: () => buildSignatureHeader,
|
|
29
|
+
buildSignatureHeaderForSecrets: () => buildSignatureHeaderForSecrets,
|
|
30
|
+
verifySignature: () => verifySignature2
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(webhooks_entry_exports);
|
|
33
|
+
|
|
34
|
+
// src/signature.ts
|
|
35
|
+
var import_node_crypto = require("crypto");
|
|
36
|
+
var SIGNATURE_HEADER = "X-Product-Signature";
|
|
37
|
+
var EVENT_ID_HEADER = "X-Event-Id";
|
|
38
|
+
var DELIVERY_ID_HEADER = "X-Delivery-Id";
|
|
39
|
+
var DEFAULT_TOLERANCE_SECONDS = 5 * 60;
|
|
40
|
+
function buildSignatureHeader({
|
|
41
|
+
secret,
|
|
42
|
+
timestamp,
|
|
43
|
+
rawBody
|
|
44
|
+
}) {
|
|
45
|
+
return buildSignatureHeaderForSecrets({
|
|
46
|
+
secrets: [secret],
|
|
47
|
+
timestamp,
|
|
48
|
+
rawBody
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function buildSignatureHeaderForSecrets({
|
|
52
|
+
secrets,
|
|
53
|
+
timestamp,
|
|
54
|
+
rawBody
|
|
55
|
+
}) {
|
|
56
|
+
const payload = `${timestamp}.${rawBody}`;
|
|
57
|
+
const signatures = secrets.filter((secret) => secret.length > 0).map((secret) => (0, import_node_crypto.createHmac)("sha256", secret).update(payload).digest("hex"));
|
|
58
|
+
return `t=${timestamp},${signatures.map((signature) => `v1=${signature}`).join(",")}`;
|
|
59
|
+
}
|
|
60
|
+
function verifySignature(input) {
|
|
61
|
+
if (!input.header) return { ok: false, reason: "missing_header" };
|
|
62
|
+
const parsed = parseHeader(input.header);
|
|
63
|
+
if (!parsed) return { ok: false, reason: "invalid_format" };
|
|
64
|
+
const now = input.now ?? Math.floor(Date.now() / 1e3);
|
|
65
|
+
const tolerance = input.toleranceSeconds ?? DEFAULT_TOLERANCE_SECONDS;
|
|
66
|
+
if (Math.abs(now - parsed.timestamp) > tolerance) {
|
|
67
|
+
return { ok: false, reason: "timestamp_expired" };
|
|
68
|
+
}
|
|
69
|
+
const payload = `${parsed.timestamp}.${input.rawBody}`;
|
|
70
|
+
for (const secret of input.secrets) {
|
|
71
|
+
if (!secret) continue;
|
|
72
|
+
const expected = (0, import_node_crypto.createHmac)("sha256", secret).update(payload).digest("hex");
|
|
73
|
+
for (const signature of parsed.signatures) {
|
|
74
|
+
if (safeEqualHex(expected, signature)) {
|
|
75
|
+
return { ok: true, timestamp: parsed.timestamp };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { ok: false, reason: "bad_signature" };
|
|
80
|
+
}
|
|
81
|
+
function parseHeader(header) {
|
|
82
|
+
let timestamp = null;
|
|
83
|
+
const signatures = [];
|
|
84
|
+
for (const segment of header.split(",")) {
|
|
85
|
+
const [key, value] = segment.trim().split("=");
|
|
86
|
+
if (!key || !value) continue;
|
|
87
|
+
if (key === "t") {
|
|
88
|
+
const ts = Number(value);
|
|
89
|
+
if (Number.isFinite(ts)) timestamp = ts;
|
|
90
|
+
} else if (key === "v1") {
|
|
91
|
+
signatures.push(value);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (timestamp === null || signatures.length === 0) return null;
|
|
95
|
+
return { timestamp, signatures };
|
|
96
|
+
}
|
|
97
|
+
function safeEqualHex(a, b) {
|
|
98
|
+
if (!isSha256Hex(a) || !isSha256Hex(b)) return false;
|
|
99
|
+
const aBuffer = Buffer.from(a, "hex");
|
|
100
|
+
const bBuffer = Buffer.from(b, "hex");
|
|
101
|
+
return (0, import_node_crypto.timingSafeEqual)(aBuffer, bBuffer);
|
|
102
|
+
}
|
|
103
|
+
function isSha256Hex(value) {
|
|
104
|
+
return /^[a-f0-9]{64}$/i.test(value);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/webhooks-entry.ts
|
|
108
|
+
function verifySignature2(input) {
|
|
109
|
+
const secrets = "secret" in input ? Array.isArray(input.secret) ? input.secret : [input.secret] : input.secrets;
|
|
110
|
+
return verifySignature({
|
|
111
|
+
secrets,
|
|
112
|
+
header: input.header,
|
|
113
|
+
rawBody: input.rawBody,
|
|
114
|
+
toleranceSeconds: input.toleranceSeconds,
|
|
115
|
+
now: input.now
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
var WebhooksApi = class {
|
|
119
|
+
verify(input) {
|
|
120
|
+
return verifySignature2(input);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
124
|
+
0 && (module.exports = {
|
|
125
|
+
DEFAULT_TOLERANCE_SECONDS,
|
|
126
|
+
DELIVERY_ID_HEADER,
|
|
127
|
+
EVENT_ID_HEADER,
|
|
128
|
+
SIGNATURE_HEADER,
|
|
129
|
+
WebhooksApi,
|
|
130
|
+
buildSignatureHeader,
|
|
131
|
+
buildSignatureHeaderForSecrets,
|
|
132
|
+
verifySignature
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/webhooks-entry.ts","../src/signature.ts"],"sourcesContent":["import {\n verifySignature as verifySignatureWithSecrets,\n type VerifyInput,\n type VerifyResult,\n} from './signature'\n\nexport {\n buildSignatureHeader,\n buildSignatureHeaderForSecrets,\n SIGNATURE_HEADER,\n EVENT_ID_HEADER,\n DELIVERY_ID_HEADER,\n DEFAULT_TOLERANCE_SECONDS,\n} from './signature'\nexport type {\n SignatureBuildInput,\n MultiSignatureBuildInput,\n VerifyResult,\n} from './signature'\n\nexport type WebhookVerifyInput = Omit<VerifyInput, 'secrets'> &\n (\n | { secret: string | readonly string[]; secrets?: never }\n | { secrets: readonly string[]; secret?: never }\n )\n\nexport function verifySignature(input: WebhookVerifyInput): VerifyResult {\n const secrets =\n 'secret' in input\n ? Array.isArray(input.secret)\n ? input.secret\n : [input.secret as string]\n : input.secrets\n\n return verifySignatureWithSecrets({\n secrets,\n header: input.header,\n rawBody: input.rawBody,\n toleranceSeconds: input.toleranceSeconds,\n now: input.now,\n })\n}\n\nexport class WebhooksApi {\n verify(input: WebhookVerifyInput): VerifyResult {\n return verifySignature(input)\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto'\n\n// 与服务端 webhook 签名格式保持一致:\n// X-Product-Signature: t=<unix_ts>,v1=<hmac_sha256(t.rawBody)>\n// SDK 内联实现,避免发布包依赖内部 workspace 包。\n\nexport const SIGNATURE_HEADER = 'X-Product-Signature'\nexport const EVENT_ID_HEADER = 'X-Event-Id'\nexport const DELIVERY_ID_HEADER = 'X-Delivery-Id'\nexport const DEFAULT_TOLERANCE_SECONDS = 5 * 60\n\nexport type SignatureBuildInput = {\n secret: string\n timestamp: number\n rawBody: string\n}\n\nexport type MultiSignatureBuildInput = {\n secrets: readonly string[]\n timestamp: number\n rawBody: string\n}\n\nexport type VerifyInput = {\n secrets: readonly string[]\n header: string | undefined\n rawBody: string\n now?: number\n toleranceSeconds?: number\n}\n\nexport type VerifyResult =\n | { ok: true; timestamp: number }\n | {\n ok: false\n reason:\n | 'missing_header'\n | 'invalid_format'\n | 'timestamp_expired'\n | 'bad_signature'\n }\n\nexport function buildSignatureHeader({\n secret,\n timestamp,\n rawBody,\n}: SignatureBuildInput): string {\n return buildSignatureHeaderForSecrets({\n secrets: [secret],\n timestamp,\n rawBody,\n })\n}\n\nexport function buildSignatureHeaderForSecrets({\n secrets,\n timestamp,\n rawBody,\n}: MultiSignatureBuildInput): string {\n const payload = `${timestamp}.${rawBody}`\n const signatures = secrets\n .filter((secret) => secret.length > 0)\n .map((secret) => createHmac('sha256', secret).update(payload).digest('hex'))\n return `t=${timestamp},${signatures.map((signature) => `v1=${signature}`).join(',')}`\n}\n\nexport function verifySignature(input: VerifyInput): VerifyResult {\n if (!input.header) return { ok: false, reason: 'missing_header' }\n const parsed = parseHeader(input.header)\n if (!parsed) return { ok: false, reason: 'invalid_format' }\n\n const now = input.now ?? Math.floor(Date.now() / 1000)\n const tolerance = input.toleranceSeconds ?? DEFAULT_TOLERANCE_SECONDS\n if (Math.abs(now - parsed.timestamp) > tolerance) {\n return { ok: false, reason: 'timestamp_expired' }\n }\n\n const payload = `${parsed.timestamp}.${input.rawBody}`\n for (const secret of input.secrets) {\n if (!secret) continue\n const expected = createHmac('sha256', secret).update(payload).digest('hex')\n for (const signature of parsed.signatures) {\n if (safeEqualHex(expected, signature)) {\n return { ok: true, timestamp: parsed.timestamp }\n }\n }\n }\n return { ok: false, reason: 'bad_signature' }\n}\n\nfunction parseHeader(\n header: string,\n): { timestamp: number; signatures: string[] } | null {\n let timestamp: number | null = null\n const signatures: string[] = []\n for (const segment of header.split(',')) {\n const [key, value] = segment.trim().split('=')\n if (!key || !value) continue\n if (key === 't') {\n const ts = Number(value)\n if (Number.isFinite(ts)) timestamp = ts\n } else if (key === 'v1') {\n signatures.push(value)\n }\n }\n if (timestamp === null || signatures.length === 0) return null\n return { timestamp, signatures }\n}\n\nfunction safeEqualHex(a: string, b: string): boolean {\n if (!isSha256Hex(a) || !isSha256Hex(b)) return false\n const aBuffer = Buffer.from(a, 'hex')\n const bBuffer = Buffer.from(b, 'hex')\n return timingSafeEqual(aBuffer, bBuffer)\n}\n\nfunction isSha256Hex(value: string): boolean {\n return /^[a-f0-9]{64}$/i.test(value)\n}\n"],"mappings":"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","names":["verifySignature","verifySignature"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_TOLERANCE_SECONDS,
|
|
3
|
+
DELIVERY_ID_HEADER,
|
|
4
|
+
EVENT_ID_HEADER,
|
|
5
|
+
SIGNATURE_HEADER,
|
|
6
|
+
buildSignatureHeader,
|
|
7
|
+
buildSignatureHeaderForSecrets,
|
|
8
|
+
verifySignature
|
|
9
|
+
} from "./chunk-B2JLHYXK.mjs";
|
|
10
|
+
|
|
11
|
+
// src/webhooks-entry.ts
|
|
12
|
+
function verifySignature2(input) {
|
|
13
|
+
const secrets = "secret" in input ? Array.isArray(input.secret) ? input.secret : [input.secret] : input.secrets;
|
|
14
|
+
return verifySignature({
|
|
15
|
+
secrets,
|
|
16
|
+
header: input.header,
|
|
17
|
+
rawBody: input.rawBody,
|
|
18
|
+
toleranceSeconds: input.toleranceSeconds,
|
|
19
|
+
now: input.now
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
var WebhooksApi = class {
|
|
23
|
+
verify(input) {
|
|
24
|
+
return verifySignature2(input);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export {
|
|
28
|
+
DEFAULT_TOLERANCE_SECONDS,
|
|
29
|
+
DELIVERY_ID_HEADER,
|
|
30
|
+
EVENT_ID_HEADER,
|
|
31
|
+
SIGNATURE_HEADER,
|
|
32
|
+
WebhooksApi,
|
|
33
|
+
buildSignatureHeader,
|
|
34
|
+
buildSignatureHeaderForSecrets,
|
|
35
|
+
verifySignature2 as verifySignature
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=webhooks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/webhooks-entry.ts"],"sourcesContent":["import {\n verifySignature as verifySignatureWithSecrets,\n type VerifyInput,\n type VerifyResult,\n} from './signature'\n\nexport {\n buildSignatureHeader,\n buildSignatureHeaderForSecrets,\n SIGNATURE_HEADER,\n EVENT_ID_HEADER,\n DELIVERY_ID_HEADER,\n DEFAULT_TOLERANCE_SECONDS,\n} from './signature'\nexport type {\n SignatureBuildInput,\n MultiSignatureBuildInput,\n VerifyResult,\n} from './signature'\n\nexport type WebhookVerifyInput = Omit<VerifyInput, 'secrets'> &\n (\n | { secret: string | readonly string[]; secrets?: never }\n | { secrets: readonly string[]; secret?: never }\n )\n\nexport function verifySignature(input: WebhookVerifyInput): VerifyResult {\n const secrets =\n 'secret' in input\n ? Array.isArray(input.secret)\n ? input.secret\n : [input.secret as string]\n : input.secrets\n\n return verifySignatureWithSecrets({\n secrets,\n header: input.header,\n rawBody: input.rawBody,\n toleranceSeconds: input.toleranceSeconds,\n now: input.now,\n })\n}\n\nexport class WebhooksApi {\n verify(input: WebhookVerifyInput): VerifyResult {\n return verifySignature(input)\n }\n}\n"],"mappings":";;;;;;;;;;;AA0BO,SAASA,iBAAgB,OAAyC;AACvE,QAAM,UACJ,YAAY,QACR,MAAM,QAAQ,MAAM,MAAM,IACxB,MAAM,SACN,CAAC,MAAM,MAAgB,IACzB,MAAM;AAEZ,SAAO,gBAA2B;AAAA,IAChC;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,kBAAkB,MAAM;AAAA,IACxB,KAAK,MAAM;AAAA,EACb,CAAC;AACH;AAEO,IAAM,cAAN,MAAkB;AAAA,EACvB,OAAO,OAAyC;AAC9C,WAAOA,iBAAgB,KAAK;AAAA,EAC9B;AACF;","names":["verifySignature"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stableops/api-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/StableOps/stableops-api-typescript-sdk.git"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"module": "dist/index.mjs",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"typesVersions": {
|
|
14
|
+
"*": {
|
|
15
|
+
"webhooks": [
|
|
16
|
+
"dist/webhooks.d.ts"
|
|
17
|
+
],
|
|
18
|
+
"mock": [
|
|
19
|
+
"dist/mock.d.ts"
|
|
20
|
+
],
|
|
21
|
+
"*": [
|
|
22
|
+
"dist/index.d.ts"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.mts",
|
|
30
|
+
"default": "./dist/index.mjs"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"default": "./dist/index.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"./webhooks": {
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/webhooks.d.mts",
|
|
40
|
+
"default": "./dist/webhooks.mjs"
|
|
41
|
+
},
|
|
42
|
+
"require": {
|
|
43
|
+
"types": "./dist/webhooks.d.ts",
|
|
44
|
+
"default": "./dist/webhooks.js"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"./mock": {
|
|
48
|
+
"import": {
|
|
49
|
+
"types": "./dist/mock.d.mts",
|
|
50
|
+
"default": "./dist/mock.mjs"
|
|
51
|
+
},
|
|
52
|
+
"require": {
|
|
53
|
+
"types": "./dist/mock.d.ts",
|
|
54
|
+
"default": "./dist/mock.js"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"engines": {
|
|
59
|
+
"node": ">=18"
|
|
60
|
+
},
|
|
61
|
+
"sideEffects": false,
|
|
62
|
+
"files": [
|
|
63
|
+
"dist"
|
|
64
|
+
],
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public"
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build": "tsup",
|
|
70
|
+
"prepublishOnly": "pnpm build",
|
|
71
|
+
"lint": "eslint .",
|
|
72
|
+
"typecheck": "tsc --noEmit",
|
|
73
|
+
"test": "vitest run",
|
|
74
|
+
"test:watch": "vitest"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@eslint/js": "^9.16.0",
|
|
78
|
+
"@types/node": "^24.0.0",
|
|
79
|
+
"eslint": "^9.16.0",
|
|
80
|
+
"globals": "^15.14.0",
|
|
81
|
+
"msw": "^2.4.9",
|
|
82
|
+
"tsup": "^8.5.1",
|
|
83
|
+
"typescript": "^5.9.3",
|
|
84
|
+
"typescript-eslint": "^8.18.0",
|
|
85
|
+
"vitest": "^3.2.4"
|
|
86
|
+
}
|
|
87
|
+
}
|