@openmeter/sdk 1.0.0-beta.1 → 1.0.0-beta.100

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.
Files changed (63) hide show
  1. package/README.md +110 -26
  2. package/dist/cjs/clients/client.cjs +117 -0
  3. package/dist/cjs/clients/client.d.cts +40 -0
  4. package/dist/cjs/clients/client.js.map +1 -0
  5. package/dist/cjs/clients/event.cjs +71 -0
  6. package/dist/cjs/clients/event.d.cts +79 -0
  7. package/dist/cjs/clients/event.js.map +1 -0
  8. package/dist/cjs/clients/meter.cjs +69 -0
  9. package/dist/cjs/clients/meter.d.cts +75 -0
  10. package/dist/cjs/clients/meter.js.map +1 -0
  11. package/dist/cjs/clients/portal.cjs +41 -0
  12. package/dist/cjs/clients/portal.d.cts +22 -0
  13. package/dist/cjs/clients/portal.js.map +1 -0
  14. package/dist/cjs/clients/subject.cjs +60 -0
  15. package/dist/cjs/clients/subject.d.cts +27 -0
  16. package/dist/cjs/clients/subject.js.map +1 -0
  17. package/dist/cjs/index.cjs +24 -0
  18. package/dist/cjs/index.d.cts +15 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/cjs/schemas/openapi.cjs +7 -0
  21. package/dist/cjs/schemas/openapi.d.cts +2078 -0
  22. package/dist/cjs/schemas/openapi.js.map +1 -0
  23. package/dist/cjs/test/agent.cjs +266 -0
  24. package/dist/cjs/test/agent.d.cts +2 -0
  25. package/dist/cjs/test/agent.js.map +1 -0
  26. package/dist/cjs/test/mocks.cjs +44 -0
  27. package/dist/cjs/test/mocks.d.cts +14 -0
  28. package/dist/cjs/test/mocks.js.map +1 -0
  29. package/dist/cjs/tsconfig.43c3843a.tsbuildinfo +1 -0
  30. package/dist/cjs/tsconfig.d98fa456.tsbuildinfo +1 -0
  31. package/dist/clients/client.d.ts +3 -3
  32. package/dist/clients/client.js +21 -10
  33. package/dist/clients/client.js.map +1 -0
  34. package/dist/clients/event.d.ts +16 -2
  35. package/dist/clients/event.js +44 -18
  36. package/dist/clients/event.js.map +1 -0
  37. package/dist/clients/meter.d.ts +30 -7
  38. package/dist/clients/meter.js +17 -4
  39. package/dist/clients/meter.js.map +1 -0
  40. package/dist/clients/portal.d.ts +22 -0
  41. package/dist/clients/portal.js +37 -0
  42. package/dist/clients/portal.js.map +1 -0
  43. package/dist/clients/subject.d.ts +27 -0
  44. package/dist/clients/subject.js +56 -0
  45. package/dist/clients/subject.js.map +1 -0
  46. package/dist/index.d.ts +6 -2
  47. package/dist/index.js +7 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/schemas/openapi.d.ts +1876 -212
  50. package/dist/schemas/openapi.js +1 -0
  51. package/dist/schemas/openapi.js.map +1 -0
  52. package/dist/test/agent.js +190 -32
  53. package/dist/test/agent.js.map +1 -0
  54. package/dist/test/mocks.d.ts +4 -1
  55. package/dist/test/mocks.js +28 -8
  56. package/dist/test/mocks.js.map +1 -0
  57. package/dist/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +65 -51
  59. package/clients/client.ts +0 -153
  60. package/clients/event.ts +0 -109
  61. package/clients/meter.ts +0 -84
  62. package/index.ts +0 -17
  63. package/schemas/openapi.ts +0 -421
@@ -18,7 +18,7 @@ export type Problem = components['schemas']['Problem'];
18
18
  export declare class BaseClient {
19
19
  protected config: OpenMeterConfig;
20
20
  constructor(config: OpenMeterConfig);
21
- protected request<T>({ path, method, searchParams, headers, body, options }: {
21
+ protected request<T>({ path, method, searchParams, headers, body, options, }: {
22
22
  path: string;
23
23
  method: Dispatcher.HttpMethod;
24
24
  searchParams?: URLSearchParams;
@@ -28,12 +28,12 @@ export declare class BaseClient {
28
28
  }): Promise<T>;
29
29
  protected getUrl(path: string, searchParams?: URLSearchParams): import("url").URL;
30
30
  protected getAuthHeaders(): IncomingHttpHeaders;
31
- protected static toURLSearchParams(params: Record<string, string | number | Date | string[]>): URLSearchParams;
31
+ protected static toURLSearchParams(params: Record<string, string | number | Date | string[] | Record<string, string> | undefined>): URLSearchParams;
32
32
  }
33
33
  export declare class HttpError extends Error {
34
34
  statusCode: number;
35
35
  problem?: Problem;
36
- constructor({ statusCode, problem }: {
36
+ constructor({ statusCode, problem, }: {
37
37
  statusCode: number;
38
38
  problem?: Problem;
39
39
  });
@@ -4,7 +4,7 @@ export class BaseClient {
4
4
  constructor(config) {
5
5
  this.config = config;
6
6
  }
7
- async request({ path, method, searchParams, headers, body, options }) {
7
+ async request({ path, method, searchParams, headers, body, options, }) {
8
8
  // Building URL
9
9
  const url = this.getUrl(path, searchParams);
10
10
  // Request options
@@ -17,7 +17,7 @@ export class BaseClient {
17
17
  };
18
18
  const reqOpts = {
19
19
  method,
20
- headers: reqHeaders
20
+ headers: reqHeaders,
21
21
  };
22
22
  // Optional body
23
23
  if (body) {
@@ -30,7 +30,7 @@ export class BaseClient {
30
30
  // Error handling
31
31
  if (resp.statusCode > 399) {
32
32
  if (resp.headers['content-type'] === 'application/problem+json') {
33
- const problem = await resp.body.json();
33
+ const problem = (await resp.body.json());
34
34
  throw new HttpError({
35
35
  statusCode: resp.statusCode,
36
36
  problem,
@@ -42,11 +42,11 @@ export class BaseClient {
42
42
  });
43
43
  }
44
44
  // Response parsing
45
- if (resp.statusCode === 204) {
45
+ if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {
46
46
  return undefined;
47
47
  }
48
48
  if (resp.headers['content-type'] === 'application/json') {
49
- return await resp.body.json();
49
+ return (await resp.body.json());
50
50
  }
51
51
  if (!resp.headers['content-type']) {
52
52
  throw new Error('Missing content type');
@@ -62,13 +62,13 @@ export class BaseClient {
62
62
  getAuthHeaders() {
63
63
  if (this.config.token) {
64
64
  return {
65
- authorization: `Bearer ${this.config.token} `,
65
+ authorization: `Bearer ${this.config.token}`,
66
66
  };
67
67
  }
68
68
  if (this.config.username && this.config.password) {
69
- const encoded = Buffer.from(`${this.config.username}:${this.config.password} `).toString('base64');
69
+ const encoded = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');
70
70
  return {
71
- authorization: `Basic ${encoded} `,
71
+ authorization: `Basic ${encoded}`,
72
72
  };
73
73
  }
74
74
  return {};
@@ -76,12 +76,22 @@ export class BaseClient {
76
76
  static toURLSearchParams(params) {
77
77
  const searchParams = new URLSearchParams();
78
78
  for (const [key, value] of Object.entries(params)) {
79
+ if (value === undefined) {
80
+ continue;
81
+ }
79
82
  if (Array.isArray(value)) {
80
- searchParams.append(key, value.join(','));
83
+ for (const item of value) {
84
+ searchParams.append(key, item);
85
+ }
81
86
  }
82
87
  else if (value instanceof Date) {
83
88
  searchParams.append(key, value.toISOString());
84
89
  }
90
+ else if (typeof value === 'object') {
91
+ Object.entries(value).forEach(([k, v]) => {
92
+ searchParams.append(`${key}[${k}]`, v);
93
+ });
94
+ }
85
95
  else {
86
96
  searchParams.append(key, value.toString());
87
97
  }
@@ -92,10 +102,11 @@ export class BaseClient {
92
102
  export class HttpError extends Error {
93
103
  statusCode;
94
104
  problem;
95
- constructor({ statusCode, problem }) {
105
+ constructor({ statusCode, problem, }) {
96
106
  super(problem?.type || 'unexpected status code');
97
107
  this.name = 'HttpError';
98
108
  this.statusCode = statusCode;
99
109
  this.problem = problem;
100
110
  }
101
111
  }
112
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../clients/client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,14 @@
1
+ import { components } from '../schemas/openapi.js';
1
2
  import { RequestOptions, BaseClient, OpenMeterConfig } from './client.js';
3
+ export type CloudEvent = components['schemas']['Event'];
4
+ export type IngestedEvent = components['schemas']['IngestedEvent'];
5
+ export type EventsQueryParams = {
6
+ /**
7
+ * @description Limit number of results. Max: 100
8
+ * @example 25
9
+ */
10
+ limit?: number;
11
+ };
2
12
  /**
3
13
  * Usage Event
4
14
  */
@@ -53,7 +63,7 @@ export type Event = {
53
63
  * "path": "/hello"
54
64
  * }
55
65
  */
56
- data: Record<string, string | number | Record<string, string | number>>;
66
+ data: Record<string, unknown>;
57
67
  };
58
68
  export declare class EventsClient extends BaseClient {
59
69
  constructor(config: OpenMeterConfig);
@@ -61,5 +71,9 @@ export declare class EventsClient extends BaseClient {
61
71
  * Ingest usage event in a CloudEvents format
62
72
  * @see https://cloudevents.io
63
73
  */
64
- ingest(usageEvent: Event, options?: RequestOptions): Promise<void>;
74
+ ingest(usageEvent: Event | Event[], options?: RequestOptions): Promise<void>;
75
+ /**
76
+ * List raw events
77
+ */
78
+ list(params?: EventsQueryParams, options?: RequestOptions): Promise<IngestedEvent[]>;
65
79
  }
@@ -9,30 +9,56 @@ export class EventsClient extends BaseClient {
9
9
  * @see https://cloudevents.io
10
10
  */
11
11
  async ingest(usageEvent, options) {
12
- if (usageEvent.datacontenttype && usageEvent.datacontenttype !== 'application/json') {
13
- throw new TypeError(`Unsupported datacontenttype: ${usageEvent.datacontenttype}`);
14
- }
15
- // We default where we can to lower the barrier to use CloudEvents
16
- const body = {
17
- specversion: usageEvent.specversion ?? '1.0',
18
- id: usageEvent.id ?? crypto.randomUUID(),
19
- source: usageEvent.source ?? '@openmeter/sdk',
20
- type: usageEvent.type,
21
- subject: usageEvent.subject,
22
- time: usageEvent.time?.toISOString(),
23
- datacontenttype: usageEvent.datacontenttype,
24
- dataschema: usageEvent.dataschema,
25
- data: usageEvent.data
26
- };
12
+ const isBatch = Array.isArray(usageEvent);
13
+ const cloudEvents = (isBatch ? usageEvent : [usageEvent]).map((ev) => {
14
+ // Validate content type
15
+ if (ev.datacontenttype && ev.datacontenttype !== 'application/json') {
16
+ throw new TypeError(`Unsupported datacontenttype: ${ev.datacontenttype}`);
17
+ }
18
+ // We default where we can to lower the barrier to use CloudEvents
19
+ const cloudEvent = {
20
+ specversion: ev.specversion ?? '1.0',
21
+ id: ev.id ?? crypto.randomUUID(),
22
+ source: ev.source ?? '@openmeter/sdk',
23
+ type: ev.type,
24
+ subject: ev.subject,
25
+ time: ev.time?.toISOString(),
26
+ datacontenttype: ev.datacontenttype,
27
+ dataschema: ev.dataschema,
28
+ data: ev.data,
29
+ };
30
+ return cloudEvent;
31
+ });
32
+ const contentType = isBatch
33
+ ? 'application/cloudevents-batch+json'
34
+ : 'application/cloudevents+json';
35
+ const body = isBatch
36
+ ? JSON.stringify(cloudEvents)
37
+ : JSON.stringify(cloudEvents[0]);
27
38
  // Making Request
28
39
  return await this.request({
29
40
  path: '/api/v1/events',
30
41
  method: 'POST',
31
- body: JSON.stringify(body),
42
+ body,
32
43
  headers: {
33
- 'Content-Type': 'application/cloudevents+json',
44
+ 'Content-Type': contentType,
34
45
  },
35
- options
46
+ options,
47
+ });
48
+ }
49
+ /**
50
+ * List raw events
51
+ */
52
+ async list(params, options) {
53
+ const searchParams = params
54
+ ? BaseClient.toURLSearchParams(params)
55
+ : undefined;
56
+ return this.request({
57
+ method: 'GET',
58
+ path: `/api/v1/events`,
59
+ searchParams,
60
+ options,
36
61
  });
37
62
  }
38
63
  }
64
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../clients/event.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,EAAkB,UAAU,EAAmB,MAAM,aAAa,CAAA;AAuEzE,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CACjB,UAA2B,EAC3B,OAAwB;QAExB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACzC,MAAM,WAAW,GAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CACzE,CAAC,EAAE,EAAE,EAAE;YACL,wBAAwB;YACxB,IAAI,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,eAAe,KAAK,kBAAkB,EAAE,CAAC;gBACpE,MAAM,IAAI,SAAS,CACjB,gCAAgC,EAAE,CAAC,eAAe,EAAE,CACrD,CAAA;YACH,CAAC;YAED,kEAAkE;YAClE,MAAM,UAAU,GAAe;gBAC7B,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,KAAK;gBACpC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE;gBAChC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,gBAAgB;gBACrC,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE;gBAC5B,eAAe,EAAE,EAAE,CAAC,eAAe;gBACnC,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,IAAI,EAAE,EAAE,CAAC,IAAI;aACd,CAAA;YAED,OAAO,UAAU,CAAA;QACnB,CAAC,CACF,CAAA;QAED,MAAM,WAAW,GAAG,OAAO;YACzB,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,8BAA8B,CAAA;QAClC,MAAM,IAAI,GAAG,OAAO;YAClB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;QAElC,iBAAiB;QACjB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,OAAO,EAAE;gBACP,cAAc,EAAE,WAAW;aAC5B;YACD,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CACf,MAA0B,EAC1B,OAAwB;QAExB,MAAM,YAAY,GAAG,MAAM;YACzB,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,SAAS,CAAA;QACb,OAAO,IAAI,CAAC,OAAO,CAAkB;YACnC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,gBAAgB;YACtB,YAAY;YACZ,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -13,7 +13,11 @@ export declare enum MeterAggregation {
13
13
  MAX = "MAX"
14
14
  }
15
15
  export type MeterQueryParams = {
16
- subject?: string;
16
+ /**
17
+ * @description Subject(s) to filter by.
18
+ * @example ["customer-1", "customer-2"]
19
+ */
20
+ subject?: string[];
17
21
  /**
18
22
  * @description Start date.
19
23
  * Must be aligned with the window size.
@@ -26,13 +30,28 @@ export type MeterQueryParams = {
26
30
  * Inclusive.
27
31
  */
28
32
  to?: Date;
29
- /** @description If not specified, a single usage aggregate will be returned for the entirety of the specified period for each subject and group. */
33
+ /**
34
+ * @description Window Size
35
+ * If not specified, a single usage aggregate will be returned for the entirety of
36
+ * the specified period for each subject and group.
37
+ */
30
38
  windowSize?: WindowSizeType;
31
- /** @description If not specified a single aggregate will be returned for each subject and time window. */
39
+ /**
40
+ * @description The value is the name of the time zone as defined in the IANA Time Zone Database (http://www.iana.org/time-zones).
41
+ * If not specified, the UTC timezone will be used.
42
+ */
43
+ windowTimeZone?: string;
44
+ /**
45
+ * @description Group By
46
+ * If not specified a single aggregate will be returned for each subject and time window.
47
+ */
32
48
  groupBy?: string[];
49
+ /**
50
+ * @description Filter by group by
51
+ */
52
+ filterGroupBy?: Record<string, string>;
33
53
  };
34
- export type MeterQueryResponse = paths['/api/v1/meters/{meterIdOrSlug}/values']['get']['responses']['200']['content']['application/json'];
35
- export type MeterValue = components['schemas']['MeterValue'];
54
+ export type MeterQueryResponse = paths['/api/v1/meters/{meterIdOrSlug}/query']['get']['responses']['200']['content']['application/json'];
36
55
  export type Meter = components['schemas']['Meter'];
37
56
  export type WindowSizeType = components['schemas']['WindowSize'];
38
57
  export declare class MetersClient extends BaseClient {
@@ -46,7 +65,11 @@ export declare class MetersClient extends BaseClient {
46
65
  */
47
66
  list(options?: RequestOptions): Promise<Meter[]>;
48
67
  /**
49
- * Get aggregated values of a meter
68
+ * Query a meter
69
+ */
70
+ query(slug: string, params?: MeterQueryParams, options?: RequestOptions): Promise<MeterQueryResponse>;
71
+ /**
72
+ * List subjects of a meter
50
73
  */
51
- values(slug: string, params?: MeterQueryParams, options?: RequestOptions): Promise<MeterQueryResponse>;
74
+ subjects(slug: string, options?: RequestOptions): Promise<string[]>;
52
75
  }
@@ -38,15 +38,28 @@ export class MetersClient extends BaseClient {
38
38
  });
39
39
  }
40
40
  /**
41
- * Get aggregated values of a meter
41
+ * Query a meter
42
42
  */
43
- async values(slug, params, options) {
44
- const searchParams = params ? BaseClient.toURLSearchParams(params) : undefined;
43
+ async query(slug, params, options) {
44
+ const searchParams = params
45
+ ? BaseClient.toURLSearchParams(params)
46
+ : undefined;
45
47
  return this.request({
46
48
  method: 'GET',
47
- path: `/api/v1/meters/${slug}/values`,
49
+ path: `/api/v1/meters/${slug}/query`,
48
50
  searchParams,
49
51
  options,
50
52
  });
51
53
  }
54
+ /**
55
+ * List subjects of a meter
56
+ */
57
+ async subjects(slug, options) {
58
+ return this.request({
59
+ method: 'GET',
60
+ path: `/api/v1/meters/${slug}/subjects`,
61
+ options,
62
+ });
63
+ }
52
64
  }
65
+ //# sourceMappingURL=meter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter.js","sourceRoot":"","sources":["../../clients/meter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAmC,MAAM,aAAa,CAAA;AAEzE,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,+BAAiB,CAAA;IACjB,2BAAa,CAAA;IACb,yBAAW,CAAA;AACb,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,mCAAe,CAAA;IACf,+BAAW,CAAA;IACX,+BAAW,CAAA;IACX,+BAAW,CAAA;AACb,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B;AAgDD,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAwB;QACrD,OAAO,IAAI,CAAC,OAAO,CAAQ;YACzB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB,IAAI,EAAE;YAC9B,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAAC,OAAwB;QACxC,OAAO,IAAI,CAAC,OAAO,CAAU;YAC3B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,gBAAgB;YACtB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK,CAChB,IAAY,EACZ,MAAyB,EACzB,OAAwB;QAExB,MAAM,YAAY,GAAG,MAAM;YACzB,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,SAAS,CAAA;QACb,OAAO,IAAI,CAAC,OAAO,CAAqB;YACtC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB,IAAI,QAAQ;YACpC,YAAY;YACZ,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ,CACnB,IAAY,EACZ,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAW;YAC5B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB,IAAI,WAAW;YACvC,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { components } from '../schemas/openapi.js';
2
+ import { RequestOptions, BaseClient, OpenMeterConfig } from './client.js';
3
+ export type PortalToken = components['schemas']['PortalToken'];
4
+ export declare class PortalClient extends BaseClient {
5
+ constructor(config: OpenMeterConfig);
6
+ /**
7
+ * Create portal token
8
+ * Useful for creating a token sharable with your customer to query their own usage
9
+ */
10
+ createToken(token: {
11
+ subject: string;
12
+ expiresAt?: Date;
13
+ allowedMeterSlugs?: string[];
14
+ }, options?: RequestOptions): Promise<PortalToken>;
15
+ /**
16
+ * Invalidate portal token
17
+ * @note OpenMeter Cloud only feature
18
+ */
19
+ invalidateTokens(invalidate?: {
20
+ subject?: string;
21
+ }, options?: RequestOptions): Promise<void>;
22
+ }
@@ -0,0 +1,37 @@
1
+ import { BaseClient } from './client.js';
2
+ export class PortalClient extends BaseClient {
3
+ constructor(config) {
4
+ super(config);
5
+ }
6
+ /**
7
+ * Create portal token
8
+ * Useful for creating a token sharable with your customer to query their own usage
9
+ */
10
+ async createToken(token, options) {
11
+ return await this.request({
12
+ path: '/api/v1/portal/tokens',
13
+ method: 'POST',
14
+ headers: {
15
+ 'Content-Type': 'application/json',
16
+ },
17
+ body: JSON.stringify(token),
18
+ options,
19
+ });
20
+ }
21
+ /**
22
+ * Invalidate portal token
23
+ * @note OpenMeter Cloud only feature
24
+ */
25
+ async invalidateTokens(invalidate = {}, options) {
26
+ return await this.request({
27
+ path: '/api/v1/portal/tokens/invalidate',
28
+ method: 'POST',
29
+ headers: {
30
+ 'Content-Type': 'application/json',
31
+ },
32
+ body: JSON.stringify(invalidate),
33
+ options,
34
+ });
35
+ }
36
+ }
37
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../clients/portal.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,UAAU,EAAmB,MAAM,aAAa,CAAA;AAIzE,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,WAAW,CACtB,KAIC,EACD,OAAwB;QAExB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAC3B,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAC3B,aAAmC,EAAE,EACrC,OAAwB;QAExB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,kCAAkC;YACxC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YAChC,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import { components } from '../schemas/openapi.js';
2
+ import { RequestOptions, BaseClient, OpenMeterConfig } from './client.js';
3
+ export type Subject = components['schemas']['Subject'];
4
+ export declare class SubjectClient extends BaseClient {
5
+ constructor(config: OpenMeterConfig);
6
+ /**
7
+ * Upsert subject
8
+ * Useful to map display name and metadata to subjects
9
+ * @note OpenMeter Cloud only feature
10
+ */
11
+ upsert(subject: Omit<Subject, 'id'>[], options?: RequestOptions): Promise<Subject[]>;
12
+ /**
13
+ * Get subject by id or key
14
+ * @note OpenMeter Cloud only feature
15
+ */
16
+ get(idOrKey: string, options?: RequestOptions): Promise<void>;
17
+ /**
18
+ * List subjects
19
+ * @note OpenMeter Cloud only feature
20
+ */
21
+ list(options?: RequestOptions): Promise<void>;
22
+ /**
23
+ * Delete subject by id or key
24
+ * @note OpenMeter Cloud only feature
25
+ */
26
+ delete(idOrKey: string, options?: RequestOptions): Promise<void>;
27
+ }
@@ -0,0 +1,56 @@
1
+ import { BaseClient } from './client.js';
2
+ export class SubjectClient extends BaseClient {
3
+ constructor(config) {
4
+ super(config);
5
+ }
6
+ /**
7
+ * Upsert subject
8
+ * Useful to map display name and metadata to subjects
9
+ * @note OpenMeter Cloud only feature
10
+ */
11
+ async upsert(subject, options) {
12
+ return await this.request({
13
+ path: '/api/v1/subjects',
14
+ method: 'POST',
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ },
18
+ body: JSON.stringify(subject),
19
+ options,
20
+ });
21
+ }
22
+ /**
23
+ * Get subject by id or key
24
+ * @note OpenMeter Cloud only feature
25
+ */
26
+ async get(idOrKey, options) {
27
+ return await this.request({
28
+ path: `/api/v1/subjects/${idOrKey}`,
29
+ method: 'GET',
30
+ options,
31
+ });
32
+ }
33
+ /**
34
+ * List subjects
35
+ * @note OpenMeter Cloud only feature
36
+ */
37
+ async list(options) {
38
+ return await this.request({
39
+ path: '/api/v1/subjects',
40
+ method: 'GET',
41
+ options,
42
+ });
43
+ }
44
+ /**
45
+ * Delete subject by id or key
46
+ * @note OpenMeter Cloud only feature
47
+ */
48
+ async delete(idOrKey, options) {
49
+ return await this.request({
50
+ path: `/api/v1/subjects/${idOrKey}`,
51
+ method: 'DELETE',
52
+ options,
53
+ });
54
+ }
55
+ }
56
+ //# sourceMappingURL=subject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../clients/subject.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,UAAU,EAAmB,MAAM,aAAa,CAAA;AAIzE,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CACjB,OAA8B,EAC9B,OAAwB;QAExB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,OAAwB;QACxD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,oBAAoB,OAAO,EAAE;YACnC,MAAM,EAAE,KAAK;YACb,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,IAAI,CAAC,OAAwB;QACxC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,KAAK;YACb,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CACjB,OAAe,EACf,OAAwB;QAExB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,oBAAoB,OAAO,EAAE;YACnC,MAAM,EAAE,QAAQ;YAChB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import { OpenMeterConfig } from './clients/client.js';
2
2
  import { EventsClient } from './clients/event.js';
3
3
  import { MetersClient } from './clients/meter.js';
4
+ import { PortalClient } from './clients/portal.js';
5
+ import { SubjectClient } from './clients/subject.js';
4
6
  export { OpenMeterConfig, RequestOptions } from './clients/client.js';
5
- export { Event } from './clients/event.js';
6
- export { Meter, MeterValue, MeterAggregation, WindowSize } from './clients/meter.js';
7
+ export { Event, IngestedEvent, CloudEvent } from './clients/event.js';
8
+ export { Meter, MeterAggregation, WindowSize } from './clients/meter.js';
7
9
  export declare class OpenMeter {
8
10
  events: EventsClient;
9
11
  meters: MetersClient;
12
+ portal: PortalClient;
13
+ subjects: SubjectClient;
10
14
  constructor(config: OpenMeterConfig);
11
15
  }
package/dist/index.js CHANGED
@@ -1,11 +1,18 @@
1
1
  import { EventsClient } from './clients/event.js';
2
2
  import { MetersClient } from './clients/meter.js';
3
+ import { PortalClient } from './clients/portal.js';
4
+ import { SubjectClient } from './clients/subject.js';
3
5
  export { MeterAggregation, WindowSize } from './clients/meter.js';
4
6
  export class OpenMeter {
5
7
  events;
6
8
  meters;
9
+ portal;
10
+ subjects;
7
11
  constructor(config) {
8
12
  this.events = new EventsClient(config);
9
13
  this.meters = new MetersClient(config);
14
+ this.portal = new PortalClient(config);
15
+ this.subjects = new SubjectClient(config);
10
16
  }
11
17
  }
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIpD,OAAO,EAAS,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAExE,MAAM,OAAO,SAAS;IACb,MAAM,CAAc;IACpB,MAAM,CAAc;IACpB,MAAM,CAAc;IACpB,QAAQ,CAAe;IAE9B,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;CACF"}