usage-sdk-test 0.1.0 → 0.1.1
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/README.md +2 -1
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence/MemoryPersistenceProvider.d.ts +4 -0
- package/dist/persistence/MemoryPersistenceProvider.js +19 -0
- package/dist/persistence/MemoryPersistenceProvider.js.map +1 -0
- package/dist/persistence/PersistenceProvider.d.ts +22 -0
- package/dist/persistence/PersistenceProvider.js +3 -0
- package/dist/persistence/PersistenceProvider.js.map +1 -0
- package/dist/pricing/matchRule.d.ts +2 -0
- package/dist/pricing/matchRule.d.ts.map +1 -0
- package/dist/pricing/matchRule.js +47 -0
- package/dist/pricing/matchRule.js.map +1 -0
- package/dist/pricing/quote.d.ts +2 -0
- package/dist/pricing/quote.d.ts.map +1 -0
- package/dist/pricing/quote.js +35 -0
- package/dist/pricing/quote.js.map +1 -0
- package/dist/providers/memory/MemoryLedgerStore.d.ts +16 -0
- package/dist/providers/memory/MemoryLedgerStore.d.ts.map +1 -0
- package/dist/providers/memory/MemoryLedgerStore.js +80 -0
- package/dist/providers/memory/MemoryLedgerStore.js.map +1 -0
- package/dist/providers/memory/MemoryLimitStore.d.ts +24 -0
- package/dist/providers/memory/MemoryLimitStore.d.ts.map +1 -0
- package/dist/providers/memory/MemoryLimitStore.js +88 -0
- package/dist/providers/memory/MemoryLimitStore.js.map +1 -0
- package/dist/providers/memory/MemoryPlanStore.d.ts +7 -0
- package/dist/providers/memory/MemoryPlanStore.d.ts.map +1 -0
- package/dist/providers/memory/MemoryPlanStore.js +15 -0
- package/dist/providers/memory/MemoryPlanStore.js.map +1 -0
- package/dist/providers/memory/MemoryUsageStore.d.ts +11 -0
- package/dist/providers/memory/MemoryUsageStore.d.ts.map +1 -0
- package/dist/providers/memory/MemoryUsageStore.js +16 -0
- package/dist/providers/memory/MemoryUsageStore.js.map +1 -0
- package/dist/sdk/UsageSdk.d.ts +40 -0
- package/dist/sdk/UsageSdk.d.ts.map +1 -0
- package/dist/sdk/UsageSdk.js +156 -0
- package/dist/sdk/UsageSdk.js.map +1 -0
- package/dist/sdk/createUsageSdk.d.ts +41 -0
- package/dist/sdk/createUsageSdk.d.ts.map +1 -0
- package/dist/sdk/createUsageSdk.js +24 -0
- package/dist/sdk/createUsageSdk.js.map +1 -0
- package/dist/stores/LedgerStore.d.ts +29 -0
- package/dist/stores/LedgerStore.d.ts.map +1 -0
- package/dist/stores/LedgerStore.js +3 -0
- package/dist/stores/LedgerStore.js.map +1 -0
- package/dist/stores/LimitStore.d.ts +20 -0
- package/dist/stores/LimitStore.d.ts.map +1 -0
- package/dist/stores/LimitStore.js +3 -0
- package/dist/stores/LimitStore.js.map +1 -0
- package/dist/stores/PlanStore.d.ts +4 -0
- package/dist/stores/PlanStore.d.ts.map +1 -0
- package/dist/stores/PlanStore.js +3 -0
- package/dist/stores/PlanStore.js.map +1 -0
- package/dist/stores/UsageStore.d.ts +9 -0
- package/dist/stores/UsageStore.d.ts.map +1 -0
- package/dist/stores/UsageStore.js +3 -0
- package/dist/stores/UsageStore.js.map +1 -0
- package/dist/types.d.ts +115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fingerprint.d.ts +2 -0
- package/dist/utils/fingerprint.d.ts.map +1 -0
- package/dist/utils/fingerprint.js +20 -0
- package/dist/utils/fingerprint.js.map +1 -0
- package/dist/utils/guards.d.ts +5 -0
- package/dist/utils/guards.d.ts.map +1 -0
- package/dist/utils/guards.js +32 -0
- package/dist/utils/guards.js.map +1 -0
- package/package.json +9 -9
- package/examples/basic.ts +0 -35
- package/src/errors.ts +0 -19
- package/src/index.ts +0 -3
- package/src/pricing/matchRule.ts +0 -36
- package/src/pricing/quote.ts +0 -38
- package/src/providers/memory/MemoryLedgerStore.ts +0 -90
- package/src/providers/memory/MemoryLimitStore.ts +0 -102
- package/src/providers/memory/MemoryPlanStore.ts +0 -14
- package/src/providers/memory/MemoryUsageStore.ts +0 -10
- package/src/sdk/UsageSdk.ts +0 -117
- package/src/sdk/createUsageSdk.ts +0 -38
- package/src/stores/LedgerStore.ts +0 -30
- package/src/stores/LimitStore.ts +0 -5
- package/src/stores/PlanStore.ts +0 -5
- package/src/stores/UsageStore.ts +0 -5
- package/src/types.ts +0 -116
- package/src/utils/fingerprint.ts +0 -14
- package/src/utils/guards.ts +0 -23
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -13
package/src/types.ts
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
export type Currency = "CNY" | (string & {});
|
|
2
|
-
|
|
3
|
-
export type Money = {
|
|
4
|
-
currency: Currency;
|
|
5
|
-
/**
|
|
6
|
-
* Minor units (e.g. CNY=分). Integer only.
|
|
7
|
-
*/
|
|
8
|
-
amountMinor: number;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export type UsageEvent = {
|
|
12
|
-
meter: string;
|
|
13
|
-
quantity: number;
|
|
14
|
-
dimensions?: Record<string, string>;
|
|
15
|
-
ts?: number;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export type PriceRule = {
|
|
19
|
-
/**
|
|
20
|
-
* A logical meter name, e.g. "tokens.input", "tokens.output", "requests".
|
|
21
|
-
*/
|
|
22
|
-
meter: string;
|
|
23
|
-
/**
|
|
24
|
-
* Dimension matchers. v0 supports:
|
|
25
|
-
* - "*" wildcard
|
|
26
|
-
* - string equality
|
|
27
|
-
* - string[] membership
|
|
28
|
-
*/
|
|
29
|
-
when?: Record<string, "*" | string | string[]>;
|
|
30
|
-
/**
|
|
31
|
-
* Price per unit in minor units (e.g. 分). Integer only.
|
|
32
|
-
*/
|
|
33
|
-
unitPriceMinor: number;
|
|
34
|
-
currency: Currency;
|
|
35
|
-
priority?: number;
|
|
36
|
-
ruleId?: string;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export type PricePlan = {
|
|
40
|
-
planId: string;
|
|
41
|
-
rules: PriceRule[];
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export type Limits = {
|
|
45
|
-
/**
|
|
46
|
-
* Requests per minute. v0: each `enforce()` call consumes 1 request by default.
|
|
47
|
-
*/
|
|
48
|
-
rpm?: number;
|
|
49
|
-
/**
|
|
50
|
-
* Daily spending limit in minor units.
|
|
51
|
-
*/
|
|
52
|
-
dailyLimitMinor?: number;
|
|
53
|
-
/**
|
|
54
|
-
* Monthly spending limit in minor units.
|
|
55
|
-
*/
|
|
56
|
-
monthlyLimitMinor?: number;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
export type QuoteInput = {
|
|
60
|
-
accountId: string;
|
|
61
|
-
planId: string;
|
|
62
|
-
events: UsageEvent[];
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export type QuoteItem = {
|
|
66
|
-
event: UsageEvent;
|
|
67
|
-
costMinor: number;
|
|
68
|
-
ruleId?: string;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export type Quote = {
|
|
72
|
-
total: Money;
|
|
73
|
-
items: QuoteItem[];
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export type EnforceInput = QuoteInput & {
|
|
77
|
-
idempotencyKey: string;
|
|
78
|
-
limits?: Limits;
|
|
79
|
-
/**
|
|
80
|
-
* Overrides RPM consumption for this call. Defaults to 1.
|
|
81
|
-
*/
|
|
82
|
-
requestCount?: number;
|
|
83
|
-
nowMs?: number;
|
|
84
|
-
metadata?: Record<string, unknown>;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
export type EnforceErrorCode =
|
|
88
|
-
| "INSUFFICIENT_BALANCE"
|
|
89
|
-
| "RPM_LIMIT_EXCEEDED"
|
|
90
|
-
| "DAILY_LIMIT_EXCEEDED"
|
|
91
|
-
| "MONTHLY_LIMIT_EXCEEDED"
|
|
92
|
-
| "NO_PRICE_RULE"
|
|
93
|
-
| "CURRENCY_MISMATCH"
|
|
94
|
-
| "IDEMPOTENCY_CONFLICT"
|
|
95
|
-
| "INVALID_ARGUMENT";
|
|
96
|
-
|
|
97
|
-
export type EnforceResult =
|
|
98
|
-
| { ok: true; txId: string; cost: Money; balanceAfter: Money }
|
|
99
|
-
| {
|
|
100
|
-
ok: false;
|
|
101
|
-
code: EnforceErrorCode;
|
|
102
|
-
message?: string;
|
|
103
|
-
retryAfterMs?: number;
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
export type UsageRecord = {
|
|
107
|
-
accountId: string;
|
|
108
|
-
planId: string;
|
|
109
|
-
idempotencyKey: string;
|
|
110
|
-
txId: string;
|
|
111
|
-
cost: Money;
|
|
112
|
-
events: UsageEvent[];
|
|
113
|
-
tsMs: number;
|
|
114
|
-
metadata?: Record<string, unknown>;
|
|
115
|
-
};
|
|
116
|
-
|
package/src/utils/fingerprint.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
const stableStringifyValue = (value: unknown): unknown => {
|
|
2
|
-
if (Array.isArray(value)) return value.map(stableStringifyValue);
|
|
3
|
-
if (!value || typeof value !== "object") return value;
|
|
4
|
-
const record = value as Record<string, unknown>;
|
|
5
|
-
const keys = Object.keys(record).sort();
|
|
6
|
-
const out: Record<string, unknown> = {};
|
|
7
|
-
for (const key of keys) out[key] = stableStringifyValue(record[key]);
|
|
8
|
-
return out;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const stableStringify = (value: unknown) => JSON.stringify(stableStringifyValue(value));
|
|
12
|
-
|
|
13
|
-
export const makeFingerprint = (value: unknown) => stableStringify(value);
|
|
14
|
-
|
package/src/utils/guards.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { UsageError } from "../errors.ts";
|
|
2
|
-
import type { Money, UsageEvent } from "../types.ts";
|
|
3
|
-
|
|
4
|
-
export const assertInteger = (value: number, field: string) => {
|
|
5
|
-
if (!Number.isInteger(value)) throw new UsageError("INVALID_ARGUMENT", `${field} must be an integer`);
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export const assertNonNegativeInteger = (value: number, field: string) => {
|
|
9
|
-
assertInteger(value, field);
|
|
10
|
-
if (value < 0) throw new UsageError("INVALID_ARGUMENT", `${field} must be >= 0`);
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export const assertMoney = (money: Money, field: string) => {
|
|
14
|
-
if (!money || typeof money !== "object") throw new UsageError("INVALID_ARGUMENT", `${field} is required`);
|
|
15
|
-
if (!money.currency) throw new UsageError("INVALID_ARGUMENT", `${field}.currency is required`);
|
|
16
|
-
assertNonNegativeInteger(money.amountMinor, `${field}.amountMinor`);
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export const assertUsageEvent = (event: UsageEvent, field: string) => {
|
|
20
|
-
if (!event || typeof event !== "object") throw new UsageError("INVALID_ARGUMENT", `${field} is required`);
|
|
21
|
-
if (!event.meter) throw new UsageError("INVALID_ARGUMENT", `${field}.meter is required`);
|
|
22
|
-
assertNonNegativeInteger(event.quantity, `${field}.quantity`);
|
|
23
|
-
};
|
package/tsconfig.build.json
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"noEmit": false,
|
|
5
|
-
"outDir": "dist",
|
|
6
|
-
"rootDir": "src",
|
|
7
|
-
"declaration": true,
|
|
8
|
-
"declarationMap": true,
|
|
9
|
-
"sourceMap": true,
|
|
10
|
-
"rewriteRelativeImportExtensions": true
|
|
11
|
-
},
|
|
12
|
-
"include": ["src/**/*"]
|
|
13
|
-
}
|
|
14
|
-
|
package/tsconfig.json
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ES2022",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"allowImportingTsExtensions": true,
|
|
7
|
-
"strict": true,
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
"noEmit": true,
|
|
10
|
-
"forceConsistentCasingInFileNames": true
|
|
11
|
-
},
|
|
12
|
-
"include": ["src/**/*"]
|
|
13
|
-
}
|