@openmeter/sdk 1.0.0-beta.60 → 1.0.0-beta.63

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.
@@ -1,6 +1,6 @@
1
1
  import { components } from '../schemas/openapi.js';
2
2
  import { RequestOptions, BaseClient, OpenMeterConfig } from './client.js';
3
- export type CloudEvents = components['schemas']['Event'];
3
+ export type CloudEvent = components['schemas']['Event'];
4
4
  export type IngestedEvent = components['schemas']['IngestedEvent'];
5
5
  export type EventsQueryParams = {
6
6
  /**
package/dist/index.cjs ADDED
@@ -0,0 +1,348 @@
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+ var undici = require('undici');
5
+
6
+ class BaseClient {
7
+ config;
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async request({ path, method, searchParams, headers, body, options, }) {
12
+ // Building URL
13
+ const url = this.getUrl(path, searchParams);
14
+ // Request options
15
+ const reqHeaders = {
16
+ Accept: 'application/json',
17
+ ...headers,
18
+ ...this.getAuthHeaders(),
19
+ ...this.config.headers,
20
+ ...options?.headers,
21
+ };
22
+ const reqOpts = {
23
+ method,
24
+ headers: reqHeaders,
25
+ };
26
+ // Optional body
27
+ if (body) {
28
+ if (!reqHeaders['Content-Type'] && !reqHeaders['content-type']) {
29
+ throw new Error('Content Type is required with body');
30
+ }
31
+ reqOpts.body = body;
32
+ }
33
+ const resp = await undici.request(url, reqOpts);
34
+ // Error handling
35
+ if (resp.statusCode > 399) {
36
+ if (resp.headers['content-type'] === 'application/problem+json') {
37
+ const problem = (await resp.body.json());
38
+ throw new HttpError({
39
+ statusCode: resp.statusCode,
40
+ problem,
41
+ });
42
+ }
43
+ // Requests can fail before API, in this case we only have a status code
44
+ throw new HttpError({
45
+ statusCode: resp.statusCode,
46
+ });
47
+ }
48
+ // Response parsing
49
+ if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {
50
+ return undefined;
51
+ }
52
+ if (resp.headers['content-type'] === 'application/json') {
53
+ return (await resp.body.json());
54
+ }
55
+ if (!resp.headers['content-type']) {
56
+ throw new Error('Missing content type');
57
+ }
58
+ throw new Error(`Unknown content type: ${resp.headers['content-type']}`);
59
+ }
60
+ getUrl(path, searchParams) {
61
+ let qs = searchParams ? searchParams.toString() : '';
62
+ qs = qs.length > 0 ? `?${qs}` : '';
63
+ const url = new URL(`${path}${qs}`, this.config.baseUrl);
64
+ return url;
65
+ }
66
+ getAuthHeaders() {
67
+ if (this.config.token) {
68
+ return {
69
+ authorization: `Bearer ${this.config.token}`,
70
+ };
71
+ }
72
+ if (this.config.username && this.config.password) {
73
+ const encoded = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');
74
+ return {
75
+ authorization: `Basic ${encoded}`,
76
+ };
77
+ }
78
+ return {};
79
+ }
80
+ static toURLSearchParams(params) {
81
+ const searchParams = new URLSearchParams();
82
+ for (const [key, value] of Object.entries(params)) {
83
+ if (value === undefined) {
84
+ continue;
85
+ }
86
+ if (Array.isArray(value)) {
87
+ for (const item of value) {
88
+ searchParams.append(key, item);
89
+ }
90
+ }
91
+ else if (value instanceof Date) {
92
+ searchParams.append(key, value.toISOString());
93
+ }
94
+ else if (typeof value === 'object') {
95
+ Object.entries(value).forEach(([k, v]) => {
96
+ searchParams.append(`${key}[${k}]`, v);
97
+ });
98
+ }
99
+ else {
100
+ searchParams.append(key, value.toString());
101
+ }
102
+ }
103
+ return searchParams;
104
+ }
105
+ }
106
+ class HttpError extends Error {
107
+ statusCode;
108
+ problem;
109
+ constructor({ statusCode, problem, }) {
110
+ super(problem?.type || 'unexpected status code');
111
+ this.name = 'HttpError';
112
+ this.statusCode = statusCode;
113
+ this.problem = problem;
114
+ }
115
+ }
116
+
117
+ class EventsClient extends BaseClient {
118
+ constructor(config) {
119
+ super(config);
120
+ }
121
+ /**
122
+ * Ingest usage event in a CloudEvents format
123
+ * @see https://cloudevents.io
124
+ */
125
+ async ingest(usageEvent, options) {
126
+ const isBatch = Array.isArray(usageEvent);
127
+ const cloudEvents = (isBatch ? usageEvent : [usageEvent]).map((ev) => {
128
+ // Validate content type
129
+ if (ev.datacontenttype && ev.datacontenttype !== 'application/json') {
130
+ throw new TypeError(`Unsupported datacontenttype: ${ev.datacontenttype}`);
131
+ }
132
+ // We default where we can to lower the barrier to use CloudEvents
133
+ const cloudEvent = {
134
+ specversion: ev.specversion ?? '1.0',
135
+ id: ev.id ?? crypto.randomUUID(),
136
+ source: ev.source ?? '@openmeter/sdk',
137
+ type: ev.type,
138
+ subject: ev.subject,
139
+ time: ev.time?.toISOString(),
140
+ datacontenttype: ev.datacontenttype,
141
+ dataschema: ev.dataschema,
142
+ data: ev.data,
143
+ };
144
+ return cloudEvent;
145
+ });
146
+ const contentType = isBatch
147
+ ? 'application/cloudevents-batch+json'
148
+ : 'application/cloudevents+json';
149
+ const body = isBatch
150
+ ? JSON.stringify(cloudEvents)
151
+ : JSON.stringify(cloudEvents[0]);
152
+ // Making Request
153
+ return await this.request({
154
+ path: '/api/v1/events',
155
+ method: 'POST',
156
+ body,
157
+ headers: {
158
+ 'Content-Type': contentType,
159
+ },
160
+ options,
161
+ });
162
+ }
163
+ /**
164
+ * List raw events
165
+ */
166
+ async list(params, options) {
167
+ const searchParams = params
168
+ ? BaseClient.toURLSearchParams(params)
169
+ : undefined;
170
+ return this.request({
171
+ method: 'GET',
172
+ path: `/api/v1/events`,
173
+ searchParams,
174
+ options,
175
+ });
176
+ }
177
+ }
178
+
179
+ exports.WindowSize = void 0;
180
+ (function (WindowSize) {
181
+ WindowSize["MINUTE"] = "MINUTE";
182
+ WindowSize["HOUR"] = "HOUR";
183
+ WindowSize["DAY"] = "DAY";
184
+ })(exports.WindowSize || (exports.WindowSize = {}));
185
+ exports.MeterAggregation = void 0;
186
+ (function (MeterAggregation) {
187
+ MeterAggregation["SUM"] = "SUM";
188
+ MeterAggregation["COUNT"] = "COUNT";
189
+ MeterAggregation["AVG"] = "AVG";
190
+ MeterAggregation["MIN"] = "MIN";
191
+ MeterAggregation["MAX"] = "MAX";
192
+ })(exports.MeterAggregation || (exports.MeterAggregation = {}));
193
+ class MetersClient extends BaseClient {
194
+ constructor(config) {
195
+ super(config);
196
+ }
197
+ /**
198
+ * Get one meter by slug
199
+ */
200
+ async get(slug, options) {
201
+ return this.request({
202
+ method: 'GET',
203
+ path: `/api/v1/meters/${slug}`,
204
+ options,
205
+ });
206
+ }
207
+ /**
208
+ * List meters
209
+ */
210
+ async list(options) {
211
+ return this.request({
212
+ method: 'GET',
213
+ path: `/api/v1/meters`,
214
+ options,
215
+ });
216
+ }
217
+ /**
218
+ * Query a meter
219
+ */
220
+ async query(slug, params, options) {
221
+ const searchParams = params
222
+ ? BaseClient.toURLSearchParams(params)
223
+ : undefined;
224
+ return this.request({
225
+ method: 'GET',
226
+ path: `/api/v1/meters/${slug}/query`,
227
+ searchParams,
228
+ options,
229
+ });
230
+ }
231
+ /**
232
+ * List subjects of a meter
233
+ */
234
+ async subjects(slug, options) {
235
+ return this.request({
236
+ method: 'GET',
237
+ path: `/api/v1/meters/${slug}/subjects`,
238
+ options,
239
+ });
240
+ }
241
+ }
242
+
243
+ class PortalClient extends BaseClient {
244
+ constructor(config) {
245
+ super(config);
246
+ }
247
+ /**
248
+ * Create portal token
249
+ * Useful for creating a token sharable with your customer to query their own usage
250
+ */
251
+ async createToken(token, options) {
252
+ return await this.request({
253
+ path: '/api/v1/portal/tokens',
254
+ method: 'POST',
255
+ headers: {
256
+ 'Content-Type': 'application/json',
257
+ },
258
+ body: JSON.stringify(token),
259
+ options,
260
+ });
261
+ }
262
+ /**
263
+ * Invalidate portal token
264
+ * @note OpenMeter Cloud only feature
265
+ */
266
+ async invalidateTokens(invalidate = {}, options) {
267
+ return await this.request({
268
+ path: '/api/v1/portal/tokens/invalidate',
269
+ method: 'POST',
270
+ headers: {
271
+ 'Content-Type': 'application/json',
272
+ },
273
+ body: JSON.stringify(invalidate),
274
+ options,
275
+ });
276
+ }
277
+ }
278
+
279
+ class SubjectClient extends BaseClient {
280
+ constructor(config) {
281
+ super(config);
282
+ }
283
+ /**
284
+ * Upsert subject
285
+ * Useful to map display name and metadata to subjects
286
+ * @note OpenMeter Cloud only feature
287
+ */
288
+ async upsert(subject, options) {
289
+ return await this.request({
290
+ path: '/api/v1/subjects',
291
+ method: 'POST',
292
+ headers: {
293
+ 'Content-Type': 'application/json',
294
+ },
295
+ body: JSON.stringify(subject),
296
+ options,
297
+ });
298
+ }
299
+ /**
300
+ * Get subject by id or key
301
+ * @note OpenMeter Cloud only feature
302
+ */
303
+ async get(idOrKey, options) {
304
+ return await this.request({
305
+ path: `/api/v1/subjects/${idOrKey}`,
306
+ method: 'GET',
307
+ options,
308
+ });
309
+ }
310
+ /**
311
+ * List subjects
312
+ * @note OpenMeter Cloud only feature
313
+ */
314
+ async list(options) {
315
+ return await this.request({
316
+ path: '/api/v1/subjects',
317
+ method: 'GET',
318
+ options,
319
+ });
320
+ }
321
+ /**
322
+ * Delete subject by id or key
323
+ * @note OpenMeter Cloud only feature
324
+ */
325
+ async delete(idOrKey, options) {
326
+ return await this.request({
327
+ path: `/api/v1/subjects/${idOrKey}`,
328
+ method: 'DELETE',
329
+ options,
330
+ });
331
+ }
332
+ }
333
+
334
+ class OpenMeter {
335
+ events;
336
+ meters;
337
+ portal;
338
+ subjects;
339
+ constructor(config) {
340
+ this.events = new EventsClient(config);
341
+ this.meters = new MetersClient(config);
342
+ this.portal = new PortalClient(config);
343
+ this.subjects = new SubjectClient(config);
344
+ }
345
+ }
346
+
347
+ exports.OpenMeter = OpenMeter;
348
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../clients/client.ts","../../clients/event.ts","../../clients/meter.ts","../../clients/portal.ts","../../clients/subject.ts","../../index.ts"],"sourcesContent":["import { IncomingHttpHeaders } from 'http'\nimport { Dispatcher, request } from 'undici'\nimport { components } from '../schemas/openapi.js'\n\nexport type OpenMeterConfig = {\n baseUrl: string\n token?: string\n username?: string\n password?: string\n headers?: IncomingHttpHeaders\n}\n\nexport type RequestOptions = {\n headers?: IncomingHttpHeaders\n}\n\nexport type Problem = components['schemas']['Problem']\n\ntype UndiciRequestOptions = { dispatcher?: Dispatcher } & Omit<\n Dispatcher.RequestOptions,\n 'origin' | 'path' | 'method'\n> &\n Partial<Pick<Dispatcher.RequestOptions, 'method'>>\n\nexport class BaseClient {\n protected config: OpenMeterConfig\n\n constructor(config: OpenMeterConfig) {\n this.config = config\n }\n\n protected async request<T>({\n path,\n method,\n searchParams,\n headers,\n body,\n options,\n }: {\n path: string\n method: Dispatcher.HttpMethod\n searchParams?: URLSearchParams\n headers?: IncomingHttpHeaders\n body?: string | Buffer | Uint8Array\n options?: RequestOptions\n }): Promise<T> {\n // Building URL\n const url = this.getUrl(path, searchParams)\n\n // Request options\n const reqHeaders: IncomingHttpHeaders = {\n Accept: 'application/json',\n ...headers,\n ...this.getAuthHeaders(),\n ...this.config.headers,\n ...options?.headers,\n }\n const reqOpts: UndiciRequestOptions = {\n method,\n headers: reqHeaders,\n }\n\n // Optional body\n if (body) {\n if (!reqHeaders['Content-Type'] && !reqHeaders['content-type']) {\n throw new Error('Content Type is required with body')\n }\n\n reqOpts.body = body\n }\n\n const resp = await request(url, reqOpts)\n\n // Error handling\n if (resp.statusCode > 399) {\n if (resp.headers['content-type'] === 'application/problem+json') {\n const problem = (await resp.body.json()) as Problem\n throw new HttpError({\n statusCode: resp.statusCode,\n problem,\n })\n }\n\n // Requests can fail before API, in this case we only have a status code\n throw new HttpError({\n statusCode: resp.statusCode,\n })\n }\n\n // Response parsing\n if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {\n return undefined as unknown as T\n }\n if (resp.headers['content-type'] === 'application/json') {\n return (await resp.body.json()) as T\n }\n if (!resp.headers['content-type']) {\n throw new Error('Missing content type')\n }\n\n throw new Error(`Unknown content type: ${resp.headers['content-type']}`)\n }\n\n protected getUrl(path: string, searchParams?: URLSearchParams) {\n let qs = searchParams ? searchParams.toString() : ''\n qs = qs.length > 0 ? `?${qs}` : ''\n const url = new URL(`${path}${qs}`, this.config.baseUrl)\n return url\n }\n\n protected getAuthHeaders(): IncomingHttpHeaders {\n if (this.config.token) {\n return {\n authorization: `Bearer ${this.config.token}`,\n }\n }\n\n if (this.config.username && this.config.password) {\n const encoded = Buffer.from(\n `${this.config.username}:${this.config.password}`\n ).toString('base64')\n return {\n authorization: `Basic ${encoded}`,\n }\n }\n\n return {}\n }\n\n protected static toURLSearchParams(\n params: Record<string, string | number | Date | string[] | Record<string, string> | undefined>\n ): URLSearchParams {\n const searchParams = new URLSearchParams()\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) {\n continue\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, item)\n }\n } else if (value instanceof Date) {\n searchParams.append(key, value.toISOString())\n } else if (typeof value === 'object') {\n Object.entries(value).forEach(([k, v]) => {\n searchParams.append(`${key}[${k}]`, v)\n })\n } else {\n searchParams.append(key, value.toString())\n }\n }\n\n return searchParams\n }\n}\n\nexport class HttpError extends Error {\n public statusCode: number\n public problem?: Problem\n\n constructor({\n statusCode,\n problem,\n }: {\n statusCode: number\n problem?: Problem\n }) {\n super(problem?.type || 'unexpected status code')\n this.name = 'HttpError'\n this.statusCode = statusCode\n this.problem = problem\n }\n}\n","import crypto from 'crypto'\nimport { components } from '../schemas/openapi.js'\nimport { RequestOptions, BaseClient, OpenMeterConfig } from './client.js'\n\n// We export Event instead\nexport type CloudEvent = components['schemas']['Event']\nexport type IngestedEvent = components['schemas']['IngestedEvent']\n\nexport type EventsQueryParams = {\n /**\n * @description Limit number of results. Max: 100\n * @example 25\n */\n limit?: number\n}\n\n/**\n * Usage Event\n */\nexport type Event = {\n /**\n * @description The version of the CloudEvents specification which the event uses.\n * @example 1.0\n */\n specversion?: string\n /**\n * @description Unique identifier for the event, defaults to uuid v4.\n * @example \"5c10fade-1c9e-4d6c-8275-c52c36731d3c\"\n */\n id?: string\n /**\n * Format: uri-reference\n * @description Identifies the context in which an event happened, defaults to: @openmeter/sdk\n * @example services/service-0\n */\n source?: string\n /**\n * @description Describes the type of event related to the originating occurrence.\n * @example \"api_request\"\n */\n type: string\n /**\n * @description Describes the subject of the event in the context of the event producer (identified by source).\n * @example \"customer_id\"\n */\n subject: string\n /**\n * Format: date-time\n * @description Date of when the occurrence happened.\n * @example new Date('2023-01-01T01:01:01.001Z')\n */\n time?: Date\n /**\n * Format: uri\n * @description Identifies the schema that data adheres to.\n */\n dataschema?: string\n /**\n * @description Content type of the data value. Must adhere to RFC 2046 format.\n * @example application/json\n * @enum {string|null}\n */\n datacontenttype?: 'application/json'\n /**\n * @description The event payload.\n * @example {\n * \"duration_ms\": \"12\",\n * \"path\": \"/hello\"\n * }\n */\n data: Record<string, unknown>\n}\n\nexport class EventsClient extends BaseClient {\n constructor(config: OpenMeterConfig) {\n super(config)\n }\n\n /**\n * Ingest usage event in a CloudEvents format\n * @see https://cloudevents.io\n */\n public async ingest(\n usageEvent: Event | Event[],\n options?: RequestOptions\n ): Promise<void> {\n const isBatch = Array.isArray(usageEvent)\n const cloudEvents: CloudEvent[] = (isBatch ? usageEvent : [usageEvent]).map(\n (ev) => {\n // Validate content type\n if (ev.datacontenttype && ev.datacontenttype !== 'application/json') {\n throw new TypeError(\n `Unsupported datacontenttype: ${ev.datacontenttype}`\n )\n }\n\n // We default where we can to lower the barrier to use CloudEvents\n const cloudEvent: CloudEvent = {\n specversion: ev.specversion ?? '1.0',\n id: ev.id ?? crypto.randomUUID(),\n source: ev.source ?? '@openmeter/sdk',\n type: ev.type,\n subject: ev.subject,\n time: ev.time?.toISOString(),\n datacontenttype: ev.datacontenttype,\n dataschema: ev.dataschema,\n data: ev.data,\n }\n\n return cloudEvent\n }\n )\n\n const contentType = isBatch\n ? 'application/cloudevents-batch+json'\n : 'application/cloudevents+json'\n const body = isBatch\n ? JSON.stringify(cloudEvents)\n : JSON.stringify(cloudEvents[0])\n\n // Making Request\n return await this.request({\n path: '/api/v1/events',\n method: 'POST',\n body,\n headers: {\n 'Content-Type': contentType,\n },\n options,\n })\n }\n\n /**\n * List raw events\n */\n public async list(\n params?: EventsQueryParams,\n options?: RequestOptions\n ): Promise<IngestedEvent[]> {\n const searchParams = params\n ? BaseClient.toURLSearchParams(params)\n : undefined\n return this.request<IngestedEvent[]>({\n method: 'GET',\n path: `/api/v1/events`,\n searchParams,\n options,\n })\n }\n}\n","import { paths, components } from '../schemas/openapi.js'\nimport { BaseClient, OpenMeterConfig, RequestOptions } from './client.js'\n\nexport enum WindowSize {\n MINUTE = 'MINUTE',\n HOUR = 'HOUR',\n DAY = 'DAY',\n}\n\nexport enum MeterAggregation {\n SUM = 'SUM',\n COUNT = 'COUNT',\n AVG = 'AVG',\n MIN = 'MIN',\n MAX = 'MAX',\n}\n\nexport type MeterQueryParams = {\n /**\n * @description Subject(s) to filter by.\n * @example [\"customer-1\", \"customer-2\"]\n */\n subject?: string[]\n /**\n * @description Start date.\n * Must be aligned with the window size.\n * Inclusive.\n */\n from?: Date\n /**\n * @description End date.\n * Must be aligned with the window size.\n * Inclusive.\n */\n to?: Date\n /**\n * @description Window Size\n * If not specified, a single usage aggregate will be returned for the entirety of\n * the specified period for each subject and group.\n */\n windowSize?: WindowSizeType\n /**\n * @description The value is the name of the time zone as defined in the IANA Time Zone Database (http://www.iana.org/time-zones).\n * If not specified, the UTC timezone will be used.\n */\n windowTimeZone?: string\n /**\n * @description Group By\n * If not specified a single aggregate will be returned for each subject and time window.\n */\n groupBy?: string[]\n /**\n * @description Filter by group by\n */\n filterGroupBy?: Record<string, string>\n}\n\nexport type MeterQueryResponse =\n paths['/api/v1/meters/{meterIdOrSlug}/query']['get']['responses']['200']['content']['application/json']\n\nexport type Meter = components['schemas']['Meter']\nexport type WindowSizeType = components['schemas']['WindowSize']\n\nexport class MetersClient extends BaseClient {\n constructor(config: OpenMeterConfig) {\n super(config)\n }\n\n /**\n * Get one meter by slug\n */\n public async get(slug: string, options?: RequestOptions): Promise<Meter> {\n return this.request<Meter>({\n method: 'GET',\n path: `/api/v1/meters/${slug}`,\n options,\n })\n }\n\n /**\n * List meters\n */\n public async list(options?: RequestOptions): Promise<Meter[]> {\n return this.request<Meter[]>({\n method: 'GET',\n path: `/api/v1/meters`,\n options,\n })\n }\n\n /**\n * Query a meter\n */\n public async query(\n slug: string,\n params?: MeterQueryParams,\n options?: RequestOptions\n ): Promise<MeterQueryResponse> {\n const searchParams = params\n ? BaseClient.toURLSearchParams(params)\n : undefined\n return this.request<MeterQueryResponse>({\n method: 'GET',\n path: `/api/v1/meters/${slug}/query`,\n searchParams,\n options,\n })\n }\n\n /**\n * List subjects of a meter\n */\n public async subjects(\n slug: string,\n options?: RequestOptions\n ): Promise<string[]> {\n return this.request<string[]>({\n method: 'GET',\n path: `/api/v1/meters/${slug}/subjects`,\n options,\n })\n }\n}\n","import { components } from '../schemas/openapi.js'\nimport { RequestOptions, BaseClient, OpenMeterConfig } from './client.js'\n\nexport type PortalToken = components['schemas']['PortalToken']\n\nexport class PortalClient extends BaseClient {\n constructor(config: OpenMeterConfig) {\n super(config)\n }\n\n /**\n * Create portal token\n * Useful for creating a token sharable with your customer to query their own usage\n */\n public async createToken(\n token: {\n subject: string\n expiresAt?: Date\n allowedMeterSlugs?: string[]\n },\n options?: RequestOptions\n ): Promise<PortalToken> {\n return await this.request({\n path: '/api/v1/portal/tokens',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(token),\n options,\n })\n }\n\n /**\n * Invalidate portal token\n * @note OpenMeter Cloud only feature\n */\n public async invalidateTokens(\n invalidate: { subject?: string } = {},\n options?: RequestOptions\n ): Promise<void> {\n return await this.request({\n path: '/api/v1/portal/tokens/invalidate',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(invalidate),\n options,\n })\n }\n}\n","import { components } from '../schemas/openapi.js'\nimport { RequestOptions, BaseClient, OpenMeterConfig } from './client.js'\n\nexport type Subject = components['schemas']['Subject']\n\nexport class SubjectClient extends BaseClient {\n constructor(config: OpenMeterConfig) {\n super(config)\n }\n\n /**\n * Upsert subject\n * Useful to map display name and metadata to subjects\n * @note OpenMeter Cloud only feature\n */\n public async upsert(\n subject: Omit<Subject, 'id'>[],\n options?: RequestOptions\n ): Promise<Subject[]> {\n return await this.request({\n path: '/api/v1/subjects',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(subject),\n options,\n })\n }\n\n /**\n * Get subject by id or key\n * @note OpenMeter Cloud only feature\n */\n public async get(idOrKey: string, options?: RequestOptions): Promise<void> {\n return await this.request({\n path: `/api/v1/subjects/${idOrKey}`,\n method: 'GET',\n options,\n })\n }\n\n /**\n * List subjects\n * @note OpenMeter Cloud only feature\n */\n public async list(options?: RequestOptions): Promise<void> {\n return await this.request({\n path: '/api/v1/subjects',\n method: 'GET',\n options,\n })\n }\n\n /**\n * Delete subject by id or key\n * @note OpenMeter Cloud only feature\n */\n public async delete(\n idOrKey: string,\n options?: RequestOptions\n ): Promise<void> {\n return await this.request({\n path: `/api/v1/subjects/${idOrKey}`,\n method: 'DELETE',\n options,\n })\n }\n}\n","import { OpenMeterConfig } from './clients/client.js'\nimport { EventsClient } from './clients/event.js'\nimport { MetersClient } from './clients/meter.js'\nimport { PortalClient } from './clients/portal.js'\nimport { SubjectClient } from './clients/subject.js'\n\nexport { OpenMeterConfig, RequestOptions } from './clients/client.js'\nexport { Event, IngestedEvent, CloudEvent } from './clients/event.js'\nexport { Meter, MeterAggregation, WindowSize } from './clients/meter.js'\n\nexport class OpenMeter {\n public events: EventsClient\n public meters: MetersClient\n public portal: PortalClient\n public subjects: SubjectClient\n\n constructor(config: OpenMeterConfig) {\n this.events = new EventsClient(config)\n this.meters = new MetersClient(config)\n this.portal = new PortalClient(config)\n this.subjects = new SubjectClient(config)\n }\n}\n"],"names":["request","WindowSize","MeterAggregation"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ import { MetersClient } from './clients/meter.js';
4
4
  import { PortalClient } from './clients/portal.js';
5
5
  import { SubjectClient } from './clients/subject.js';
6
6
  export { OpenMeterConfig, RequestOptions } from './clients/client.js';
7
- export { Event, IngestedEvent } from './clients/event.js';
7
+ export { Event, IngestedEvent, CloudEvent } from './clients/event.js';
8
8
  export { Meter, MeterAggregation, WindowSize } from './clients/meter.js';
9
9
  export declare class OpenMeter {
10
10
  events: EventsClient;