@openmeter/sdk 1.0.0-beta.1 → 1.0.0-beta.101
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 +276 -26
- package/dist/cjs/clients/client.cjs +120 -0
- package/dist/cjs/clients/client.d.cts +40 -0
- package/dist/cjs/clients/client.js.map +1 -0
- package/dist/cjs/clients/entitlement.cjs +27 -0
- package/dist/cjs/clients/entitlement.d.cts +25 -0
- package/dist/cjs/clients/entitlement.js.map +1 -0
- package/dist/cjs/clients/event.cjs +71 -0
- package/dist/cjs/clients/event.d.cts +79 -0
- package/dist/cjs/clients/event.js.map +1 -0
- package/dist/cjs/clients/feature.cjs +75 -0
- package/dist/cjs/clients/feature.d.cts +40 -0
- package/dist/cjs/clients/feature.js.map +1 -0
- package/dist/cjs/clients/grant.cjs +27 -0
- package/dist/cjs/clients/grant.d.cts +15 -0
- package/dist/cjs/clients/grant.js.map +1 -0
- package/dist/cjs/clients/meter.cjs +69 -0
- package/dist/cjs/clients/meter.d.cts +75 -0
- package/dist/cjs/clients/meter.js.map +1 -0
- package/dist/cjs/clients/portal.cjs +41 -0
- package/dist/cjs/clients/portal.d.cts +22 -0
- package/dist/cjs/clients/portal.js.map +1 -0
- package/dist/cjs/clients/subject.cjs +226 -0
- package/dist/cjs/clients/subject.d.cts +117 -0
- package/dist/cjs/clients/subject.js.map +1 -0
- package/dist/cjs/index.cjs +33 -0
- package/dist/cjs/index.d.cts +21 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/schemas/openapi.cjs +7 -0
- package/dist/cjs/schemas/openapi.d.cts +2078 -0
- package/dist/cjs/schemas/openapi.js.map +1 -0
- package/dist/cjs/test/agent.cjs +470 -0
- package/dist/cjs/test/agent.d.cts +2 -0
- package/dist/cjs/test/agent.js.map +1 -0
- package/dist/cjs/test/mocks.cjs +152 -0
- package/dist/cjs/test/mocks.d.cts +25 -0
- package/dist/cjs/test/mocks.js.map +1 -0
- package/dist/cjs/tsconfig.68d5eed0.tsbuildinfo +1 -0
- package/dist/cjs/tsconfig.ae38b1d6.tsbuildinfo +1 -0
- package/dist/clients/client.d.ts +3 -3
- package/dist/clients/client.js +24 -10
- package/dist/clients/client.js.map +1 -0
- package/dist/clients/entitlement.d.ts +25 -0
- package/dist/clients/entitlement.js +23 -0
- package/dist/clients/entitlement.js.map +1 -0
- package/dist/clients/event.d.ts +16 -2
- package/dist/clients/event.js +44 -18
- package/dist/clients/event.js.map +1 -0
- package/dist/clients/feature.d.ts +40 -0
- package/dist/clients/feature.js +71 -0
- package/dist/clients/feature.js.map +1 -0
- package/dist/clients/grant.d.ts +15 -0
- package/dist/clients/grant.js +23 -0
- package/dist/clients/grant.js.map +1 -0
- package/dist/clients/meter.d.ts +30 -7
- package/dist/clients/meter.js +17 -4
- package/dist/clients/meter.js.map +1 -0
- package/dist/clients/portal.d.ts +22 -0
- package/dist/clients/portal.js +37 -0
- package/dist/clients/portal.js.map +1 -0
- package/dist/clients/subject.d.ts +117 -0
- package/dist/clients/subject.js +222 -0
- package/dist/clients/subject.js.map +1 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/openapi.d.ts +1876 -212
- package/dist/schemas/openapi.js +1 -0
- package/dist/schemas/openapi.js.map +1 -0
- package/dist/test/agent.js +394 -32
- package/dist/test/agent.js.map +1 -0
- package/dist/test/mocks.d.ts +15 -1
- package/dist/test/mocks.js +136 -8
- package/dist/test/mocks.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +65 -51
- package/clients/client.ts +0 -153
- package/clients/event.ts +0 -109
- package/clients/meter.ts +0 -84
- package/index.ts +0 -17
- package/schemas/openapi.ts +0 -421
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Install
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npm install --save @openmeter/sdk
|
|
6
|
+
npm install --save @openmeter/sdk
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
## Example
|
|
@@ -15,15 +15,15 @@ const openmeter = new OpenMeter({ baseUrl: 'http://localhost:8888' })
|
|
|
15
15
|
|
|
16
16
|
// Ingesting an event
|
|
17
17
|
const event: Event = {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
specversion: '1.0',
|
|
19
|
+
id: 'id-1',
|
|
20
|
+
source: 'my-app',
|
|
21
|
+
type: 'my-type',
|
|
22
|
+
subject: 'my-awesome-user-id',
|
|
23
|
+
time: new Date(),
|
|
24
|
+
data: {
|
|
25
|
+
api_calls: 1,
|
|
26
|
+
},
|
|
27
27
|
}
|
|
28
28
|
await openmeter.events.ingest(event)
|
|
29
29
|
|
|
@@ -41,19 +41,33 @@ const meter = await openmeter.meters.get('m1')
|
|
|
41
41
|
import { type Event } from '@openmeter/sdk'
|
|
42
42
|
|
|
43
43
|
const event: Event = {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
specversion: '1.0',
|
|
45
|
+
id: 'id-1',
|
|
46
|
+
source: 'my-app',
|
|
47
|
+
type: 'my-type',
|
|
48
|
+
subject: 'my-awesome-user-id',
|
|
49
|
+
time: new Date(),
|
|
50
|
+
data: {
|
|
51
|
+
api_calls: 1,
|
|
52
|
+
},
|
|
53
53
|
}
|
|
54
54
|
await openmeter.events.ingest(event)
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
### batch ingest
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
await openmeter.events.ingest([event1, event2, event3])
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### list
|
|
64
|
+
|
|
65
|
+
Retrieve latest raw events. Useful for debugging.
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
const events = await openmeter.events.list()
|
|
69
|
+
```
|
|
70
|
+
|
|
57
71
|
### Meters
|
|
58
72
|
|
|
59
73
|
#### list
|
|
@@ -72,17 +86,253 @@ Get one meter by slug.
|
|
|
72
86
|
const meter = await openmeter.meters.get('m1')
|
|
73
87
|
```
|
|
74
88
|
|
|
75
|
-
####
|
|
89
|
+
#### query
|
|
76
90
|
|
|
77
|
-
|
|
91
|
+
Query meter values.
|
|
78
92
|
|
|
79
93
|
```ts
|
|
80
94
|
import { WindowSize } from '@openmeter/sdk'
|
|
81
95
|
|
|
82
|
-
const values = await openmeter.meters.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
96
|
+
const values = await openmeter.meters.query('my-meter-slug', {
|
|
97
|
+
subject: ['user-1'],
|
|
98
|
+
groupBy: ['method', 'path'],
|
|
99
|
+
from: new Date('2021-01-01'),
|
|
100
|
+
to: new Date('2021-01-02'),
|
|
101
|
+
windowSize: WindowSize.HOUR,
|
|
87
102
|
})
|
|
88
103
|
```
|
|
104
|
+
|
|
105
|
+
#### meter subjects
|
|
106
|
+
|
|
107
|
+
List meter subjects.
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
const subjects = await openmeter.meters.subjects('my-meter-slug')
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Portal
|
|
114
|
+
|
|
115
|
+
#### createToken
|
|
116
|
+
|
|
117
|
+
Create subject-specific tokens.
|
|
118
|
+
Useful to build consumer dashboards.
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
const token = await openmeter.portal.createToken({ subject: 'customer-1' })
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### invalidateTokens
|
|
125
|
+
|
|
126
|
+
Invalidate portal tokens for all or specific subjects.
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
await openmeter.portal.invalidateTokens()
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Subject
|
|
133
|
+
|
|
134
|
+
Subject mappings. Like display name and metadata.
|
|
135
|
+
|
|
136
|
+
#### upsert
|
|
137
|
+
|
|
138
|
+
Upsert subjects.
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
const subjects = await openmeter.subjects.upsert([
|
|
142
|
+
{
|
|
143
|
+
key: 'customer-1',
|
|
144
|
+
displayName: 'ACME',
|
|
145
|
+
},
|
|
146
|
+
])
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### list
|
|
150
|
+
|
|
151
|
+
List subjects.
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
const subjects = await openmeter.subjects.list()
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### get
|
|
158
|
+
|
|
159
|
+
Get subject by key.
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
const subjects = await openmeter.subjects.get('customer-1')
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
#### delete
|
|
166
|
+
|
|
167
|
+
Delete subject by key.
|
|
168
|
+
It doesn't delete corresponding usage.
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
await openmeter.subjects.delete('customer-1')
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### createEntitlement
|
|
175
|
+
|
|
176
|
+
Create entitlement for a subject.
|
|
177
|
+
Entitlements allow you to manage subject feature access, balances, and usage limits.
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
// Issue 10,000,000 tokens every month
|
|
181
|
+
const entitlement = await openmeter.subjects.createEntitlement('customer-1', {
|
|
182
|
+
type: 'metered',
|
|
183
|
+
featureKey: 'ai_tokens',
|
|
184
|
+
usagePeriod: {
|
|
185
|
+
interval: 'MONTH',
|
|
186
|
+
},
|
|
187
|
+
issueAfterReset: 10000000,
|
|
188
|
+
})
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
#### listEntitlements
|
|
192
|
+
|
|
193
|
+
List subject entitlements.
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
const entitlement = await openmeter.subjects.listEntitlements('customer-1')
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
#### getEntitlement
|
|
200
|
+
|
|
201
|
+
Get a subject entitlement by ID by Feature ID or by Feature Key.
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
const entitlement = await openmeter.subjects.getEntitlement(
|
|
205
|
+
'customer-1',
|
|
206
|
+
'ai_tokens'
|
|
207
|
+
)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
#### deleteEntitlement
|
|
211
|
+
|
|
212
|
+
Delete a subject entitlement by ID by Feature ID or by Feature Key.
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
await openmeter.subjects.deleteEntitlement('customer-1', 'ai_tokens')
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
#### getEntitlementValue
|
|
219
|
+
|
|
220
|
+
Get entitlement value by ID by Feature ID or by Feature Key.
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
const value = await openmeter.subjects.getEntitlementValue(
|
|
224
|
+
'customer-1',
|
|
225
|
+
'ai_tokens'
|
|
226
|
+
)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### getEntitlementHistory
|
|
230
|
+
|
|
231
|
+
Get entitlement history by ID by Feature ID or by Feature Key
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
const entitlement = await openmeter.subjects.getEntitlementHistory(
|
|
235
|
+
'customer-1',
|
|
236
|
+
'ai_tokens'
|
|
237
|
+
)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
#### resetEntitlementUsage
|
|
241
|
+
|
|
242
|
+
Reset the entitlement usage and start a new period. Eligible grants will be rolled over.
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
const entitlement = await openmeter.subjects.resetEntitlementUsage(
|
|
246
|
+
'customer-1',
|
|
247
|
+
{
|
|
248
|
+
retainAnchor: true,
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
#### createEntitlementGrant
|
|
254
|
+
|
|
255
|
+
Create a grant for an entitlement.
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
const grant = await openmeter.subjects.createEntitlementGrant(
|
|
259
|
+
'customer-1',
|
|
260
|
+
'ai_tokens',
|
|
261
|
+
{
|
|
262
|
+
amount: 100,
|
|
263
|
+
priority: 1,
|
|
264
|
+
effectiveAt: '2023-01-01T00:00:00Z',
|
|
265
|
+
expiration: {
|
|
266
|
+
duration: 'HOUR',
|
|
267
|
+
count: 12,
|
|
268
|
+
},
|
|
269
|
+
minRolloverAmount: 100,
|
|
270
|
+
maxRolloverAmount: 100,
|
|
271
|
+
recurrence: {
|
|
272
|
+
interval: 'MONTH',
|
|
273
|
+
anchor: '2024-06-28T18:29:44.867Z',
|
|
274
|
+
},
|
|
275
|
+
}
|
|
276
|
+
)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
#### listEntitlementGrants
|
|
280
|
+
|
|
281
|
+
List entitlement grants
|
|
282
|
+
|
|
283
|
+
```ts
|
|
284
|
+
const entitlement = await openmeter.subjects.listEntitlementGrants('customer-1', 'ai_tokens)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Features
|
|
288
|
+
|
|
289
|
+
Features are the building blocks of your entitlements, part of your product offering.
|
|
290
|
+
|
|
291
|
+
#### create
|
|
292
|
+
|
|
293
|
+
Upsert subjects.
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
const feature = await openmeter.features.create({
|
|
297
|
+
key: 'ai_tokens',
|
|
298
|
+
name: 'AI Tokens',
|
|
299
|
+
// optional
|
|
300
|
+
meterSlug: 'tokens_total',
|
|
301
|
+
})
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### list
|
|
305
|
+
|
|
306
|
+
List features.
|
|
307
|
+
|
|
308
|
+
```ts
|
|
309
|
+
const features = await openmeter.features.list()
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
#### get
|
|
313
|
+
|
|
314
|
+
Get feature by key.
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
const feature = await openmeter.features.get('ai_tokens')
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### delete
|
|
321
|
+
|
|
322
|
+
Delete feature by key.
|
|
323
|
+
|
|
324
|
+
```ts
|
|
325
|
+
await openmeter.features.delete('ai_tokens')
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Grants
|
|
329
|
+
|
|
330
|
+
Entitlement grants allow to issue of additional one-time or recurring allowances on a subject's entitlement.
|
|
331
|
+
|
|
332
|
+
#### list
|
|
333
|
+
|
|
334
|
+
List grants.
|
|
335
|
+
|
|
336
|
+
```ts
|
|
337
|
+
const grants = await openmeter.grants.list()
|
|
338
|
+
```
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpError = exports.BaseClient = void 0;
|
|
4
|
+
const undici_1 = require("undici");
|
|
5
|
+
class BaseClient {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async request({ path, method, searchParams, headers, body, options, }) {
|
|
11
|
+
// Building URL
|
|
12
|
+
const url = this.getUrl(path, searchParams);
|
|
13
|
+
// Request options
|
|
14
|
+
const reqHeaders = {
|
|
15
|
+
Accept: 'application/json',
|
|
16
|
+
...headers,
|
|
17
|
+
...this.getAuthHeaders(),
|
|
18
|
+
...this.config.headers,
|
|
19
|
+
...options?.headers,
|
|
20
|
+
};
|
|
21
|
+
const reqOpts = {
|
|
22
|
+
method,
|
|
23
|
+
headers: reqHeaders,
|
|
24
|
+
};
|
|
25
|
+
// Optional body
|
|
26
|
+
if (body) {
|
|
27
|
+
if (!reqHeaders['Content-Type'] && !reqHeaders['content-type']) {
|
|
28
|
+
throw new Error('Content Type is required with body');
|
|
29
|
+
}
|
|
30
|
+
reqOpts.body = body;
|
|
31
|
+
}
|
|
32
|
+
const resp = await (0, undici_1.request)(url, reqOpts);
|
|
33
|
+
// Error handling
|
|
34
|
+
if (resp.statusCode > 399) {
|
|
35
|
+
if (resp.headers['content-type'] === 'application/problem+json') {
|
|
36
|
+
const problem = (await resp.body.json());
|
|
37
|
+
throw new HttpError({
|
|
38
|
+
statusCode: resp.statusCode,
|
|
39
|
+
problem,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Requests can fail before API, in this case we only have a status code
|
|
43
|
+
throw new HttpError({
|
|
44
|
+
statusCode: resp.statusCode,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Response parsing
|
|
48
|
+
if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if (resp.headers['content-type'] === 'application/json') {
|
|
52
|
+
return (await resp.body.json());
|
|
53
|
+
}
|
|
54
|
+
if (!resp.headers['content-type']) {
|
|
55
|
+
throw new Error('Missing content type');
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`Unknown content type: ${resp.headers['content-type']}`);
|
|
58
|
+
}
|
|
59
|
+
getUrl(path, searchParams) {
|
|
60
|
+
let qs = searchParams ? searchParams.toString() : '';
|
|
61
|
+
qs = qs.length > 0 ? `?${qs}` : '';
|
|
62
|
+
const url = new URL(`${path}${qs}`, this.config.baseUrl);
|
|
63
|
+
return url;
|
|
64
|
+
}
|
|
65
|
+
getAuthHeaders() {
|
|
66
|
+
if (this.config.token) {
|
|
67
|
+
return {
|
|
68
|
+
authorization: `Bearer ${this.config.token}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (this.config.username && this.config.password) {
|
|
72
|
+
const encoded = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');
|
|
73
|
+
return {
|
|
74
|
+
authorization: `Basic ${encoded}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
static toURLSearchParams(params) {
|
|
80
|
+
const searchParams = new URLSearchParams();
|
|
81
|
+
for (const [key, value] of Object.entries(params)) {
|
|
82
|
+
if (value === undefined) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
for (const item of value) {
|
|
87
|
+
searchParams.append(key, item);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (typeof value === 'boolean') {
|
|
91
|
+
searchParams.append(key, value.toString());
|
|
92
|
+
}
|
|
93
|
+
else if (value instanceof Date) {
|
|
94
|
+
searchParams.append(key, value.toISOString());
|
|
95
|
+
}
|
|
96
|
+
else if (typeof value === 'object') {
|
|
97
|
+
Object.entries(value).forEach(([k, v]) => {
|
|
98
|
+
searchParams.append(`${key}[${k}]`, v);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
searchParams.append(key, value.toString());
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return searchParams;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.BaseClient = BaseClient;
|
|
109
|
+
class HttpError extends Error {
|
|
110
|
+
statusCode;
|
|
111
|
+
problem;
|
|
112
|
+
constructor({ statusCode, problem, }) {
|
|
113
|
+
super(problem?.type || 'unexpected status code');
|
|
114
|
+
this.name = 'HttpError';
|
|
115
|
+
this.statusCode = statusCode;
|
|
116
|
+
this.problem = problem;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.HttpError = HttpError;
|
|
120
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import { IncomingHttpHeaders } from 'http';
|
|
5
|
+
import { Dispatcher } from 'undici';
|
|
6
|
+
import { components } from '../schemas/openapi.cjs';
|
|
7
|
+
export type OpenMeterConfig = {
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
token?: string;
|
|
10
|
+
username?: string;
|
|
11
|
+
password?: string;
|
|
12
|
+
headers?: IncomingHttpHeaders;
|
|
13
|
+
};
|
|
14
|
+
export type RequestOptions = {
|
|
15
|
+
headers?: IncomingHttpHeaders;
|
|
16
|
+
};
|
|
17
|
+
export type Problem = components['schemas']['Problem'];
|
|
18
|
+
export declare class BaseClient {
|
|
19
|
+
protected config: OpenMeterConfig;
|
|
20
|
+
constructor(config: OpenMeterConfig);
|
|
21
|
+
protected request<T>({ path, method, searchParams, headers, body, options, }: {
|
|
22
|
+
path: string;
|
|
23
|
+
method: Dispatcher.HttpMethod;
|
|
24
|
+
searchParams?: URLSearchParams;
|
|
25
|
+
headers?: IncomingHttpHeaders;
|
|
26
|
+
body?: string | Buffer | Uint8Array;
|
|
27
|
+
options?: RequestOptions;
|
|
28
|
+
}): Promise<T>;
|
|
29
|
+
protected getUrl(path: string, searchParams?: URLSearchParams): import("url").URL;
|
|
30
|
+
protected getAuthHeaders(): IncomingHttpHeaders;
|
|
31
|
+
protected static toURLSearchParams(params: Record<string, string | boolean | number | Date | string[] | Record<string, string> | undefined>): URLSearchParams;
|
|
32
|
+
}
|
|
33
|
+
export declare class HttpError extends Error {
|
|
34
|
+
statusCode: number;
|
|
35
|
+
problem?: Problem;
|
|
36
|
+
constructor({ statusCode, problem, }: {
|
|
37
|
+
statusCode: number;
|
|
38
|
+
problem?: Problem;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../clients/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntitlementClient = void 0;
|
|
4
|
+
const client_js_1 = require("./client.cjs");
|
|
5
|
+
class EntitlementClient extends client_js_1.BaseClient {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
super(config);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* List entitlements
|
|
11
|
+
* @example
|
|
12
|
+
* const entitlement = await openmeter.entitlements.list()
|
|
13
|
+
*/
|
|
14
|
+
async list(params, options) {
|
|
15
|
+
const searchParams = params
|
|
16
|
+
? client_js_1.BaseClient.toURLSearchParams(params)
|
|
17
|
+
: undefined;
|
|
18
|
+
return await this.request({
|
|
19
|
+
path: '/api/v1/entitlements',
|
|
20
|
+
method: 'GET',
|
|
21
|
+
searchParams,
|
|
22
|
+
options,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.EntitlementClient = EntitlementClient;
|
|
27
|
+
//# sourceMappingURL=entitlement.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { components, operations } from '../schemas/openapi.cjs';
|
|
2
|
+
import { RequestOptions, BaseClient, OpenMeterConfig } from './client.cjs';
|
|
3
|
+
export type Entitlement = EntitlementMetered | EntitlementStatic | EntitlementBoolean;
|
|
4
|
+
export type EntitlementMetered = components['schemas']['EntitlementMetered'];
|
|
5
|
+
export type EntitlementStatic = components['schemas']['EntitlementStatic'];
|
|
6
|
+
export type EntitlementBoolean = components['schemas']['EntitlementBoolean'];
|
|
7
|
+
export type RecurringPeriodEnum = components['schemas']['RecurringPeriodEnum'];
|
|
8
|
+
export type EntitlementValue = components['schemas']['EntitlementValue'];
|
|
9
|
+
export type WindowedBalanceHistory = components['schemas']['WindowedBalanceHistory'];
|
|
10
|
+
export type EntitlementCreateInputs = EntitlementMeteredCreateInputs | EntitlementStaticCreateInputs | EntitlementBooleanCreateInputs;
|
|
11
|
+
export type EntitlementMeteredCreateInputs = components['schemas']['EntitlementMeteredCreateInputs'];
|
|
12
|
+
export type EntitlementStaticCreateInputs = components['schemas']['EntitlementStaticCreateInputs'];
|
|
13
|
+
export type EntitlementBooleanCreateInputs = components['schemas']['EntitlementBooleanCreateInputs'];
|
|
14
|
+
export type EntitlementResetInputs = operations['resetEntitlementUsage']['requestBody']['content']['application/json'];
|
|
15
|
+
export type ListEntitlementQueryParams = operations['listEntitlements']['parameters']['query'];
|
|
16
|
+
export type GetEntitlementHistoryQueryParams = operations['getEntitlementHistory']['parameters']['query'];
|
|
17
|
+
export declare class EntitlementClient extends BaseClient {
|
|
18
|
+
constructor(config: OpenMeterConfig);
|
|
19
|
+
/**
|
|
20
|
+
* List entitlements
|
|
21
|
+
* @example
|
|
22
|
+
* const entitlement = await openmeter.entitlements.list()
|
|
23
|
+
*/
|
|
24
|
+
list(params?: ListEntitlementQueryParams, options?: RequestOptions): Promise<Entitlement[]>;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../../../clients/entitlement.ts"],"names":[],"mappings":";;;AACA,2CAAyE;AA8BzE,MAAa,iBAAkB,SAAQ,sBAAU;IAC/C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAI,CACf,MAAmC,EACnC,OAAwB;QAExB,MAAM,YAAY,GAAG,MAAM;YACzB,CAAC,CAAC,sBAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,SAAS,CAAA;QACb,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,KAAK;YACb,YAAY;YACZ,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF;AAxBD,8CAwBC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EventsClient = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const client_js_1 = require("./client.cjs");
|
|
9
|
+
class EventsClient extends client_js_1.BaseClient {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super(config);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Ingest usage event in a CloudEvents format
|
|
15
|
+
* @see https://cloudevents.io
|
|
16
|
+
*/
|
|
17
|
+
async ingest(usageEvent, options) {
|
|
18
|
+
const isBatch = Array.isArray(usageEvent);
|
|
19
|
+
const cloudEvents = (isBatch ? usageEvent : [usageEvent]).map((ev) => {
|
|
20
|
+
// Validate content type
|
|
21
|
+
if (ev.datacontenttype && ev.datacontenttype !== 'application/json') {
|
|
22
|
+
throw new TypeError(`Unsupported datacontenttype: ${ev.datacontenttype}`);
|
|
23
|
+
}
|
|
24
|
+
// We default where we can to lower the barrier to use CloudEvents
|
|
25
|
+
const cloudEvent = {
|
|
26
|
+
specversion: ev.specversion ?? '1.0',
|
|
27
|
+
id: ev.id ?? crypto_1.default.randomUUID(),
|
|
28
|
+
source: ev.source ?? '@openmeter/sdk',
|
|
29
|
+
type: ev.type,
|
|
30
|
+
subject: ev.subject,
|
|
31
|
+
time: ev.time?.toISOString(),
|
|
32
|
+
datacontenttype: ev.datacontenttype,
|
|
33
|
+
dataschema: ev.dataschema,
|
|
34
|
+
data: ev.data,
|
|
35
|
+
};
|
|
36
|
+
return cloudEvent;
|
|
37
|
+
});
|
|
38
|
+
const contentType = isBatch
|
|
39
|
+
? 'application/cloudevents-batch+json'
|
|
40
|
+
: 'application/cloudevents+json';
|
|
41
|
+
const body = isBatch
|
|
42
|
+
? JSON.stringify(cloudEvents)
|
|
43
|
+
: JSON.stringify(cloudEvents[0]);
|
|
44
|
+
// Making Request
|
|
45
|
+
return await this.request({
|
|
46
|
+
path: '/api/v1/events',
|
|
47
|
+
method: 'POST',
|
|
48
|
+
body,
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': contentType,
|
|
51
|
+
},
|
|
52
|
+
options,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* List raw events
|
|
57
|
+
*/
|
|
58
|
+
async list(params, options) {
|
|
59
|
+
const searchParams = params
|
|
60
|
+
? client_js_1.BaseClient.toURLSearchParams(params)
|
|
61
|
+
: undefined;
|
|
62
|
+
return this.request({
|
|
63
|
+
method: 'GET',
|
|
64
|
+
path: `/api/v1/events`,
|
|
65
|
+
searchParams,
|
|
66
|
+
options,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.EventsClient = EventsClient;
|
|
71
|
+
//# sourceMappingURL=event.js.map
|