@drawbridge/drawbridge-utils 0.0.42 → 0.0.43
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/ai.cjs +4 -4
- package/dist/ai.js +127 -8
- package/dist/axios.cjs +1 -1
- package/dist/axios.js +1 -1
- package/dist/cdn.cjs +1 -1
- package/dist/cdn.js +1 -1
- package/dist/circuit.cjs +1 -1
- package/dist/circuit.js +50 -3
- package/dist/encrypt.cjs +3 -3
- package/dist/encrypt.js +38 -5
- package/dist/fetch.cjs +1 -1
- package/dist/fetch.js +1 -1
- package/dist/http.cjs +1 -1
- package/dist/http.js +1 -1
- package/dist/nanoid.cjs +1 -1
- package/dist/nanoid.js +1 -1
- package/dist/{oauth.cjs → oauth/index.cjs} +16 -16
- package/dist/{oauth.d.ts → oauth/index.d.cts} +8 -8
- package/dist/{oauth.d.cts → oauth/index.d.ts} +8 -8
- package/dist/{oauth.js → oauth/index.js} +33 -17
- package/dist/oauth/server.cjs +377 -0
- package/dist/oauth/server.d.cts +387 -0
- package/dist/oauth/server.d.ts +387 -0
- package/dist/oauth/server.js +341 -0
- package/dist/orders.cjs +1 -1
- package/dist/orders.js +1 -1
- package/dist/redirect.cjs +1 -1
- package/dist/redirect.js +1 -1
- package/dist/shopify.cjs +5 -5
- package/dist/shopify.js +46 -11
- package/dist/slugify.cjs +1 -1
- package/dist/slugify.js +1 -1
- package/dist/token.cjs +1 -1
- package/dist/token.js +21 -5
- package/dist/transactions.cjs +1 -1
- package/dist/transactions.js +108 -4
- package/dist/upload.cjs +1 -1
- package/dist/upload.js +1 -1
- package/package.json +20 -4
- package/dist/chunk-2DRAIKGZ.js +0 -38
- package/dist/chunk-6HH36OK6.js +0 -54
- package/dist/chunk-JT2PAZAZ.js +0 -113
- package/dist/chunk-OS2AHUWX.js +0 -27
package/dist/orders.cjs
CHANGED
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
};
|
|
17
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
18
|
|
|
19
|
-
// orders.js
|
|
19
|
+
// lib/orders.js
|
|
20
20
|
var orders_exports = {};
|
|
21
21
|
__export(orders_exports, {
|
|
22
22
|
byCurrency: () => byCurrency
|
package/dist/orders.js
CHANGED
package/dist/redirect.cjs
CHANGED
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
};
|
|
17
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
18
|
|
|
19
|
-
// redirect.js
|
|
19
|
+
// lib/redirect.js
|
|
20
20
|
var redirect_exports = {};
|
|
21
21
|
__export(redirect_exports, {
|
|
22
22
|
safeRedirect: () => safeRedirect
|
package/dist/redirect.js
CHANGED
package/dist/shopify.cjs
CHANGED
|
@@ -26,7 +26,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
));
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
|
|
29
|
-
// shopify.js
|
|
29
|
+
// lib/shopify.js
|
|
30
30
|
var shopify_exports = {};
|
|
31
31
|
__export(shopify_exports, {
|
|
32
32
|
getAdminToken: () => getAdminToken,
|
|
@@ -40,17 +40,17 @@ __export(shopify_exports, {
|
|
|
40
40
|
module.exports = __toCommonJS(shopify_exports);
|
|
41
41
|
var import_crypto3 = __toESM(require("crypto"), 1);
|
|
42
42
|
|
|
43
|
-
// encrypt.js
|
|
43
|
+
// lib/encrypt.js
|
|
44
44
|
var import_crypto2 = __toESM(require("crypto"), 1);
|
|
45
45
|
|
|
46
|
-
// token.js
|
|
46
|
+
// lib/token.js
|
|
47
47
|
var import_crypto = __toESM(require("crypto"), 1);
|
|
48
48
|
var generate = (bytes = 32, encoding = "base64url") => {
|
|
49
49
|
const buf = import_crypto.default.randomBytes(bytes);
|
|
50
50
|
return encoding ? buf.toString(encoding) : buf;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
// encrypt.js
|
|
53
|
+
// lib/encrypt.js
|
|
54
54
|
var ALGORITHM = "aes-256-gcm";
|
|
55
55
|
var getKey = () => Buffer.from(process.env.ENCRYPT_CONNECTION_SECRET, "hex");
|
|
56
56
|
var encrypt = (value) => {
|
|
@@ -79,7 +79,7 @@ var decrypt = (value) => {
|
|
|
79
79
|
return JSON.parse(result.toString("utf8"));
|
|
80
80
|
};
|
|
81
81
|
|
|
82
|
-
// shopify.js
|
|
82
|
+
// lib/shopify.js
|
|
83
83
|
var SHOPIFY_ADMIN_API_VERSION = "2025-01";
|
|
84
84
|
var REFRESH_TOKEN_LIFETIME_MS = 90 * 24 * 60 * 60 * 1e3;
|
|
85
85
|
var ACCESS_TOKEN_REFRESH_BUFFER_MS = 5 * 60 * 1e3;
|
package/dist/shopify.js
CHANGED
|
@@ -1,11 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
encrypt
|
|
4
|
-
} from "./chunk-2DRAIKGZ.js";
|
|
5
|
-
import "./chunk-OS2AHUWX.js";
|
|
1
|
+
// lib/shopify.js
|
|
2
|
+
import crypto3 from "crypto";
|
|
6
3
|
|
|
7
|
-
//
|
|
4
|
+
// lib/encrypt.js
|
|
5
|
+
import crypto2 from "crypto";
|
|
6
|
+
|
|
7
|
+
// lib/token.js
|
|
8
8
|
import crypto from "crypto";
|
|
9
|
+
var generate = (bytes = 32, encoding = "base64url") => {
|
|
10
|
+
const buf = crypto.randomBytes(bytes);
|
|
11
|
+
return encoding ? buf.toString(encoding) : buf;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// lib/encrypt.js
|
|
15
|
+
var ALGORITHM = "aes-256-gcm";
|
|
16
|
+
var getKey = () => Buffer.from(process.env.ENCRYPT_CONNECTION_SECRET, "hex");
|
|
17
|
+
var encrypt = (value) => {
|
|
18
|
+
const iv = generate(12, null);
|
|
19
|
+
const cipher = crypto2.createCipheriv(ALGORITHM, getKey(), iv);
|
|
20
|
+
const data = Buffer.concat([
|
|
21
|
+
cipher.update(JSON.stringify(value), "utf8"),
|
|
22
|
+
cipher.final()
|
|
23
|
+
]);
|
|
24
|
+
const tag = cipher.getAuthTag();
|
|
25
|
+
return [iv, tag, data].map((b) => b.toString("hex")).join(":");
|
|
26
|
+
};
|
|
27
|
+
var decrypt = (value) => {
|
|
28
|
+
if (typeof value !== "string") return value;
|
|
29
|
+
const [ivHex, tagHex, dataHex] = value.split(":");
|
|
30
|
+
const decipher = crypto2.createDecipheriv(
|
|
31
|
+
ALGORITHM,
|
|
32
|
+
getKey(),
|
|
33
|
+
Buffer.from(ivHex, "hex")
|
|
34
|
+
);
|
|
35
|
+
decipher.setAuthTag(Buffer.from(tagHex, "hex"));
|
|
36
|
+
const result = Buffer.concat([
|
|
37
|
+
decipher.update(Buffer.from(dataHex, "hex")),
|
|
38
|
+
decipher.final()
|
|
39
|
+
]);
|
|
40
|
+
return JSON.parse(result.toString("utf8"));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// lib/shopify.js
|
|
9
44
|
var SHOPIFY_ADMIN_API_VERSION = "2025-01";
|
|
10
45
|
var REFRESH_TOKEN_LIFETIME_MS = 90 * 24 * 60 * 60 * 1e3;
|
|
11
46
|
var ACCESS_TOKEN_REFRESH_BUFFER_MS = 5 * 60 * 1e3;
|
|
@@ -16,16 +51,16 @@ var signOAuthState = ({ organizationId, shop }) => {
|
|
|
16
51
|
organizationId,
|
|
17
52
|
shop
|
|
18
53
|
})).toString("base64url");
|
|
19
|
-
const signature =
|
|
54
|
+
const signature = crypto3.createHmac("sha256", process.env.SHOPIFY_API_SECRET).update(payload).digest("base64url");
|
|
20
55
|
return payload + "." + signature;
|
|
21
56
|
};
|
|
22
57
|
var verifyOAuthState = (raw) => {
|
|
23
58
|
if (!raw) return null;
|
|
24
59
|
const [payload, signature] = raw.split(".");
|
|
25
60
|
if (!payload || !signature) return null;
|
|
26
|
-
const expected =
|
|
61
|
+
const expected = crypto3.createHmac("sha256", process.env.SHOPIFY_API_SECRET).update(payload).digest("base64url");
|
|
27
62
|
if (signature.length !== expected.length) return null;
|
|
28
|
-
const valid =
|
|
63
|
+
const valid = crypto3.timingSafeEqual(
|
|
29
64
|
Buffer.from(signature),
|
|
30
65
|
Buffer.from(expected)
|
|
31
66
|
);
|
|
@@ -46,10 +81,10 @@ var verifyOAuthCallbackHmac = ({ hmac, rawQuery }) => {
|
|
|
46
81
|
const nameB = b.split("=")[0];
|
|
47
82
|
return nameA < nameB ? -1 : nameA > nameB ? 1 : 0;
|
|
48
83
|
}).join("&");
|
|
49
|
-
const digest =
|
|
84
|
+
const digest = crypto3.createHmac("sha256", process.env.SHOPIFY_API_SECRET).update(message).digest("hex");
|
|
50
85
|
const digestBuf = Buffer.from(digest);
|
|
51
86
|
const hmacBuf = Buffer.from(hmac || "");
|
|
52
|
-
return digestBuf.length === hmacBuf.length &&
|
|
87
|
+
return digestBuf.length === hmacBuf.length && crypto3.timingSafeEqual(digestBuf, hmacBuf);
|
|
53
88
|
};
|
|
54
89
|
var shopifyOAuthFetch = async (url, body) => {
|
|
55
90
|
const response = await fetch(url, {
|
package/dist/slugify.cjs
CHANGED
|
@@ -26,7 +26,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
));
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
|
|
29
|
-
// slugify.js
|
|
29
|
+
// lib/slugify.js
|
|
30
30
|
var slugify_exports = {};
|
|
31
31
|
__export(slugify_exports, {
|
|
32
32
|
slugify: () => slugify
|
package/dist/slugify.js
CHANGED
package/dist/token.cjs
CHANGED
|
@@ -26,7 +26,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
));
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
|
|
29
|
-
// token.js
|
|
29
|
+
// lib/token.js
|
|
30
30
|
var token_exports = {};
|
|
31
31
|
__export(token_exports, {
|
|
32
32
|
compare: () => compare,
|
package/dist/token.js
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// lib/token.js
|
|
2
|
+
import crypto from "crypto";
|
|
3
|
+
var generate = (bytes = 32, encoding = "base64url") => {
|
|
4
|
+
const buf = crypto.randomBytes(bytes);
|
|
5
|
+
return encoding ? buf.toString(encoding) : buf;
|
|
6
|
+
};
|
|
7
|
+
var hash = (value, key) => {
|
|
8
|
+
if (!value) return null;
|
|
9
|
+
if (key) {
|
|
10
|
+
return crypto.createHmac("sha256", key).update(String(value)).digest("base64url");
|
|
11
|
+
}
|
|
12
|
+
return crypto.createHash("sha256").update(String(value)).digest("base64url");
|
|
13
|
+
};
|
|
14
|
+
var compare = (a, b) => {
|
|
15
|
+
if (typeof a !== "string" || typeof b !== "string") return false;
|
|
16
|
+
if (a.length !== b.length) return false;
|
|
17
|
+
return crypto.timingSafeEqual(
|
|
18
|
+
Buffer.from(a),
|
|
19
|
+
Buffer.from(b)
|
|
20
|
+
);
|
|
21
|
+
};
|
|
6
22
|
export {
|
|
7
23
|
compare,
|
|
8
24
|
generate,
|
package/dist/transactions.cjs
CHANGED
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
};
|
|
17
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
18
|
|
|
19
|
-
// transactions.js
|
|
19
|
+
// lib/transactions.js
|
|
20
20
|
var transactions_exports = {};
|
|
21
21
|
__export(transactions_exports, {
|
|
22
22
|
credit: () => credit,
|
package/dist/transactions.js
CHANGED
|
@@ -1,7 +1,111 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
// lib/transactions.js
|
|
2
|
+
import { currentTraceId } from "@drawbridge/drawbridge-telemetry";
|
|
3
|
+
var insertTransaction = async ({
|
|
4
|
+
db,
|
|
5
|
+
user,
|
|
6
|
+
type,
|
|
7
|
+
category,
|
|
8
|
+
source,
|
|
9
|
+
amount,
|
|
10
|
+
_id,
|
|
11
|
+
stripeInvoiceId,
|
|
12
|
+
stripeEventId,
|
|
13
|
+
session,
|
|
14
|
+
...rest
|
|
15
|
+
}) => {
|
|
16
|
+
var _a;
|
|
17
|
+
const beforeRaw = (_a = user == null ? void 0 : user.balance) == null ? void 0 : _a[type];
|
|
18
|
+
const balance = typeof beforeRaw === "number" ? { before: beforeRaw, after: beforeRaw + amount } : void 0;
|
|
19
|
+
const trace = currentTraceId();
|
|
20
|
+
await db.create({
|
|
21
|
+
authenticated: user,
|
|
22
|
+
collection: "transaction",
|
|
23
|
+
data: {
|
|
24
|
+
..._id && { _id },
|
|
25
|
+
user: user == null ? void 0 : user.id,
|
|
26
|
+
type,
|
|
27
|
+
category,
|
|
28
|
+
source,
|
|
29
|
+
amount,
|
|
30
|
+
...balance && { balance },
|
|
31
|
+
...trace && { trace },
|
|
32
|
+
...rest,
|
|
33
|
+
...stripeInvoiceId && { stripeInvoiceId },
|
|
34
|
+
...stripeEventId && { stripeEventId }
|
|
35
|
+
},
|
|
36
|
+
...session && { options: { session } }
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
var credit = async ({
|
|
40
|
+
db,
|
|
41
|
+
user,
|
|
42
|
+
amount,
|
|
43
|
+
type,
|
|
44
|
+
category,
|
|
45
|
+
source,
|
|
46
|
+
_id,
|
|
47
|
+
stripeInvoiceId,
|
|
48
|
+
stripeEventId,
|
|
49
|
+
session,
|
|
50
|
+
...rest
|
|
51
|
+
}) => {
|
|
52
|
+
if (!Number.isInteger(amount) || amount <= 0) {
|
|
53
|
+
throw new Error(`credit() requires a positive integer amount, got ${amount}`);
|
|
54
|
+
}
|
|
55
|
+
if (!type) {
|
|
56
|
+
throw new Error('credit() requires a type (e.g., "ai")');
|
|
57
|
+
}
|
|
58
|
+
if (!source) {
|
|
59
|
+
throw new Error('credit() requires a source ("system" | "admin" | "user")');
|
|
60
|
+
}
|
|
61
|
+
await insertTransaction({
|
|
62
|
+
db,
|
|
63
|
+
user,
|
|
64
|
+
type,
|
|
65
|
+
category,
|
|
66
|
+
source,
|
|
67
|
+
amount,
|
|
68
|
+
_id,
|
|
69
|
+
stripeInvoiceId,
|
|
70
|
+
stripeEventId,
|
|
71
|
+
session,
|
|
72
|
+
...rest
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
var debit = async ({
|
|
76
|
+
db,
|
|
77
|
+
user,
|
|
78
|
+
amount,
|
|
79
|
+
type,
|
|
80
|
+
category,
|
|
81
|
+
source,
|
|
82
|
+
stripeInvoiceId,
|
|
83
|
+
stripeEventId,
|
|
84
|
+
session,
|
|
85
|
+
...rest
|
|
86
|
+
}) => {
|
|
87
|
+
if (!Number.isInteger(amount) || amount <= 0) {
|
|
88
|
+
throw new Error(`debit() requires a positive integer amount, got ${amount}`);
|
|
89
|
+
}
|
|
90
|
+
if (!type) {
|
|
91
|
+
throw new Error('debit() requires a type (e.g., "ai")');
|
|
92
|
+
}
|
|
93
|
+
if (!source) {
|
|
94
|
+
throw new Error('debit() requires a source ("system" | "admin" | "user")');
|
|
95
|
+
}
|
|
96
|
+
await insertTransaction({
|
|
97
|
+
db,
|
|
98
|
+
user,
|
|
99
|
+
type,
|
|
100
|
+
category,
|
|
101
|
+
source,
|
|
102
|
+
amount: -amount,
|
|
103
|
+
stripeInvoiceId,
|
|
104
|
+
stripeEventId,
|
|
105
|
+
session,
|
|
106
|
+
...rest
|
|
107
|
+
});
|
|
108
|
+
};
|
|
5
109
|
export {
|
|
6
110
|
credit,
|
|
7
111
|
debit
|
package/dist/upload.cjs
CHANGED
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
};
|
|
17
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
18
|
|
|
19
|
-
// upload.js
|
|
19
|
+
// lib/upload.js
|
|
20
20
|
var upload_exports = {};
|
|
21
21
|
__export(upload_exports, {
|
|
22
22
|
allowedMimes: () => allowedMimes,
|
package/dist/upload.js
CHANGED
package/package.json
CHANGED
|
@@ -12,6 +12,17 @@
|
|
|
12
12
|
"tsup": "8.5.1",
|
|
13
13
|
"typescript": "5.9.3"
|
|
14
14
|
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@node-oauth/oauth2-server": "5.3.0"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"@node-oauth/oauth2-server": "^5.3.0"
|
|
20
|
+
},
|
|
21
|
+
"peerDependenciesMeta": {
|
|
22
|
+
"@node-oauth/oauth2-server": {
|
|
23
|
+
"optional": true
|
|
24
|
+
}
|
|
25
|
+
},
|
|
15
26
|
"exports": {
|
|
16
27
|
".": {
|
|
17
28
|
"types": "./dist/index.d.ts",
|
|
@@ -49,9 +60,14 @@
|
|
|
49
60
|
"require": "./dist/nanoid.cjs"
|
|
50
61
|
},
|
|
51
62
|
"./oauth": {
|
|
52
|
-
"types": "./dist/oauth.d.ts",
|
|
53
|
-
"import": "./dist/oauth.js",
|
|
54
|
-
"require": "./dist/oauth.cjs"
|
|
63
|
+
"types": "./dist/oauth/index.d.ts",
|
|
64
|
+
"import": "./dist/oauth/index.js",
|
|
65
|
+
"require": "./dist/oauth/index.cjs"
|
|
66
|
+
},
|
|
67
|
+
"./oauth/server": {
|
|
68
|
+
"types": "./dist/oauth/server.d.ts",
|
|
69
|
+
"import": "./dist/oauth/server.js",
|
|
70
|
+
"require": "./dist/oauth/server.cjs"
|
|
55
71
|
},
|
|
56
72
|
"./orders": {
|
|
57
73
|
"types": "./dist/orders.d.ts",
|
|
@@ -114,5 +130,5 @@
|
|
|
114
130
|
"build": "tsup && npm publish"
|
|
115
131
|
},
|
|
116
132
|
"types": "dist/index.d.ts",
|
|
117
|
-
"version": "0.0.
|
|
133
|
+
"version": "0.0.43"
|
|
118
134
|
}
|
package/dist/chunk-2DRAIKGZ.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
generate
|
|
3
|
-
} from "./chunk-OS2AHUWX.js";
|
|
4
|
-
|
|
5
|
-
// encrypt.js
|
|
6
|
-
import crypto from "crypto";
|
|
7
|
-
var ALGORITHM = "aes-256-gcm";
|
|
8
|
-
var getKey = () => Buffer.from(process.env.ENCRYPT_CONNECTION_SECRET, "hex");
|
|
9
|
-
var encrypt = (value) => {
|
|
10
|
-
const iv = generate(12, null);
|
|
11
|
-
const cipher = crypto.createCipheriv(ALGORITHM, getKey(), iv);
|
|
12
|
-
const data = Buffer.concat([
|
|
13
|
-
cipher.update(JSON.stringify(value), "utf8"),
|
|
14
|
-
cipher.final()
|
|
15
|
-
]);
|
|
16
|
-
const tag = cipher.getAuthTag();
|
|
17
|
-
return [iv, tag, data].map((b) => b.toString("hex")).join(":");
|
|
18
|
-
};
|
|
19
|
-
var decrypt = (value) => {
|
|
20
|
-
if (typeof value !== "string") return value;
|
|
21
|
-
const [ivHex, tagHex, dataHex] = value.split(":");
|
|
22
|
-
const decipher = crypto.createDecipheriv(
|
|
23
|
-
ALGORITHM,
|
|
24
|
-
getKey(),
|
|
25
|
-
Buffer.from(ivHex, "hex")
|
|
26
|
-
);
|
|
27
|
-
decipher.setAuthTag(Buffer.from(tagHex, "hex"));
|
|
28
|
-
const result = Buffer.concat([
|
|
29
|
-
decipher.update(Buffer.from(dataHex, "hex")),
|
|
30
|
-
decipher.final()
|
|
31
|
-
]);
|
|
32
|
-
return JSON.parse(result.toString("utf8"));
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export {
|
|
36
|
-
encrypt,
|
|
37
|
-
decrypt
|
|
38
|
-
};
|
package/dist/chunk-6HH36OK6.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// circuit.js
|
|
2
|
-
var CLOSED = "CLOSED";
|
|
3
|
-
var OPEN = "OPEN";
|
|
4
|
-
var HALF_OPEN = "HALF_OPEN";
|
|
5
|
-
var circuit = ({
|
|
6
|
-
name,
|
|
7
|
-
threshold = 5,
|
|
8
|
-
timeout = 3e4
|
|
9
|
-
}) => {
|
|
10
|
-
let state = CLOSED;
|
|
11
|
-
let failures = 0;
|
|
12
|
-
let openedAt = null;
|
|
13
|
-
const trip = () => {
|
|
14
|
-
state = OPEN;
|
|
15
|
-
openedAt = Date.now();
|
|
16
|
-
console.error(`Circuit breaker OPEN: ${name}`);
|
|
17
|
-
};
|
|
18
|
-
const reset = () => {
|
|
19
|
-
state = CLOSED;
|
|
20
|
-
failures = 0;
|
|
21
|
-
openedAt = null;
|
|
22
|
-
console.log(`Circuit breaker CLOSED: ${name}`);
|
|
23
|
-
};
|
|
24
|
-
return async (fn) => {
|
|
25
|
-
if (state === OPEN) {
|
|
26
|
-
if (Date.now() - openedAt >= timeout) {
|
|
27
|
-
state = HALF_OPEN;
|
|
28
|
-
} else {
|
|
29
|
-
const error = new Error(`${name} is temporarily unavailable`);
|
|
30
|
-
error.status = 503;
|
|
31
|
-
throw error;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
try {
|
|
35
|
-
const result = await fn();
|
|
36
|
-
if (state === HALF_OPEN) {
|
|
37
|
-
reset();
|
|
38
|
-
} else {
|
|
39
|
-
failures = 0;
|
|
40
|
-
}
|
|
41
|
-
return result;
|
|
42
|
-
} catch (error) {
|
|
43
|
-
failures++;
|
|
44
|
-
if (state === HALF_OPEN || failures >= threshold) {
|
|
45
|
-
trip();
|
|
46
|
-
}
|
|
47
|
-
throw error;
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export {
|
|
53
|
-
circuit
|
|
54
|
-
};
|
package/dist/chunk-JT2PAZAZ.js
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
// transactions.js
|
|
2
|
-
import { currentTraceId } from "@drawbridge/drawbridge-telemetry";
|
|
3
|
-
var insertTransaction = async ({
|
|
4
|
-
db,
|
|
5
|
-
user,
|
|
6
|
-
type,
|
|
7
|
-
category,
|
|
8
|
-
source,
|
|
9
|
-
amount,
|
|
10
|
-
_id,
|
|
11
|
-
stripeInvoiceId,
|
|
12
|
-
stripeEventId,
|
|
13
|
-
session,
|
|
14
|
-
...rest
|
|
15
|
-
}) => {
|
|
16
|
-
var _a;
|
|
17
|
-
const beforeRaw = (_a = user == null ? void 0 : user.balance) == null ? void 0 : _a[type];
|
|
18
|
-
const balance = typeof beforeRaw === "number" ? { before: beforeRaw, after: beforeRaw + amount } : void 0;
|
|
19
|
-
const trace = currentTraceId();
|
|
20
|
-
await db.create({
|
|
21
|
-
authenticated: user,
|
|
22
|
-
collection: "transaction",
|
|
23
|
-
data: {
|
|
24
|
-
..._id && { _id },
|
|
25
|
-
user: user == null ? void 0 : user.id,
|
|
26
|
-
type,
|
|
27
|
-
category,
|
|
28
|
-
source,
|
|
29
|
-
amount,
|
|
30
|
-
...balance && { balance },
|
|
31
|
-
...trace && { trace },
|
|
32
|
-
...rest,
|
|
33
|
-
...stripeInvoiceId && { stripeInvoiceId },
|
|
34
|
-
...stripeEventId && { stripeEventId }
|
|
35
|
-
},
|
|
36
|
-
...session && { options: { session } }
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
var credit = async ({
|
|
40
|
-
db,
|
|
41
|
-
user,
|
|
42
|
-
amount,
|
|
43
|
-
type,
|
|
44
|
-
category,
|
|
45
|
-
source,
|
|
46
|
-
_id,
|
|
47
|
-
stripeInvoiceId,
|
|
48
|
-
stripeEventId,
|
|
49
|
-
session,
|
|
50
|
-
...rest
|
|
51
|
-
}) => {
|
|
52
|
-
if (!Number.isInteger(amount) || amount <= 0) {
|
|
53
|
-
throw new Error(`credit() requires a positive integer amount, got ${amount}`);
|
|
54
|
-
}
|
|
55
|
-
if (!type) {
|
|
56
|
-
throw new Error('credit() requires a type (e.g., "ai")');
|
|
57
|
-
}
|
|
58
|
-
if (!source) {
|
|
59
|
-
throw new Error('credit() requires a source ("system" | "admin" | "user")');
|
|
60
|
-
}
|
|
61
|
-
await insertTransaction({
|
|
62
|
-
db,
|
|
63
|
-
user,
|
|
64
|
-
type,
|
|
65
|
-
category,
|
|
66
|
-
source,
|
|
67
|
-
amount,
|
|
68
|
-
_id,
|
|
69
|
-
stripeInvoiceId,
|
|
70
|
-
stripeEventId,
|
|
71
|
-
session,
|
|
72
|
-
...rest
|
|
73
|
-
});
|
|
74
|
-
};
|
|
75
|
-
var debit = async ({
|
|
76
|
-
db,
|
|
77
|
-
user,
|
|
78
|
-
amount,
|
|
79
|
-
type,
|
|
80
|
-
category,
|
|
81
|
-
source,
|
|
82
|
-
stripeInvoiceId,
|
|
83
|
-
stripeEventId,
|
|
84
|
-
session,
|
|
85
|
-
...rest
|
|
86
|
-
}) => {
|
|
87
|
-
if (!Number.isInteger(amount) || amount <= 0) {
|
|
88
|
-
throw new Error(`debit() requires a positive integer amount, got ${amount}`);
|
|
89
|
-
}
|
|
90
|
-
if (!type) {
|
|
91
|
-
throw new Error('debit() requires a type (e.g., "ai")');
|
|
92
|
-
}
|
|
93
|
-
if (!source) {
|
|
94
|
-
throw new Error('debit() requires a source ("system" | "admin" | "user")');
|
|
95
|
-
}
|
|
96
|
-
await insertTransaction({
|
|
97
|
-
db,
|
|
98
|
-
user,
|
|
99
|
-
type,
|
|
100
|
-
category,
|
|
101
|
-
source,
|
|
102
|
-
amount: -amount,
|
|
103
|
-
stripeInvoiceId,
|
|
104
|
-
stripeEventId,
|
|
105
|
-
session,
|
|
106
|
-
...rest
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export {
|
|
111
|
-
credit,
|
|
112
|
-
debit
|
|
113
|
-
};
|
package/dist/chunk-OS2AHUWX.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// token.js
|
|
2
|
-
import crypto from "crypto";
|
|
3
|
-
var generate = (bytes = 32, encoding = "base64url") => {
|
|
4
|
-
const buf = crypto.randomBytes(bytes);
|
|
5
|
-
return encoding ? buf.toString(encoding) : buf;
|
|
6
|
-
};
|
|
7
|
-
var hash = (value, key) => {
|
|
8
|
-
if (!value) return null;
|
|
9
|
-
if (key) {
|
|
10
|
-
return crypto.createHmac("sha256", key).update(String(value)).digest("base64url");
|
|
11
|
-
}
|
|
12
|
-
return crypto.createHash("sha256").update(String(value)).digest("base64url");
|
|
13
|
-
};
|
|
14
|
-
var compare = (a, b) => {
|
|
15
|
-
if (typeof a !== "string" || typeof b !== "string") return false;
|
|
16
|
-
if (a.length !== b.length) return false;
|
|
17
|
-
return crypto.timingSafeEqual(
|
|
18
|
-
Buffer.from(a),
|
|
19
|
-
Buffer.from(b)
|
|
20
|
-
);
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export {
|
|
24
|
-
generate,
|
|
25
|
-
hash,
|
|
26
|
-
compare
|
|
27
|
-
};
|