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

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 (52) hide show
  1. package/dist/cjs/clients/client.cjs +117 -0
  2. package/dist/cjs/clients/client.d.cts +40 -0
  3. package/dist/cjs/clients/client.js.map +1 -0
  4. package/dist/cjs/clients/event.cjs +71 -0
  5. package/dist/cjs/clients/event.d.cts +79 -0
  6. package/dist/cjs/clients/event.js.map +1 -0
  7. package/dist/cjs/clients/meter.cjs +69 -0
  8. package/dist/cjs/clients/meter.d.cts +75 -0
  9. package/dist/cjs/clients/meter.js.map +1 -0
  10. package/dist/cjs/clients/portal.cjs +41 -0
  11. package/dist/cjs/clients/portal.d.cts +22 -0
  12. package/dist/cjs/clients/portal.js.map +1 -0
  13. package/dist/cjs/clients/subject.cjs +60 -0
  14. package/dist/cjs/clients/subject.d.cts +27 -0
  15. package/dist/cjs/clients/subject.js.map +1 -0
  16. package/dist/cjs/index.cjs +24 -0
  17. package/dist/cjs/index.d.cts +15 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/schemas/openapi.cjs +7 -0
  20. package/dist/cjs/schemas/openapi.d.cts +990 -0
  21. package/dist/cjs/schemas/openapi.js.map +1 -0
  22. package/dist/cjs/test/agent.cjs +266 -0
  23. package/dist/cjs/test/agent.d.cts +2 -0
  24. package/dist/cjs/test/agent.js.map +1 -0
  25. package/dist/cjs/test/mocks.cjs +44 -0
  26. package/dist/cjs/test/mocks.d.cts +14 -0
  27. package/dist/cjs/test/mocks.js.map +1 -0
  28. package/dist/cjs/tsconfig.1976fc67.tsbuildinfo +1 -0
  29. package/dist/clients/client.js +112 -0
  30. package/dist/clients/client.js.map +1 -0
  31. package/dist/clients/event.js +64 -0
  32. package/dist/clients/event.js.map +1 -0
  33. package/dist/clients/meter.js +65 -0
  34. package/dist/clients/meter.js.map +1 -0
  35. package/dist/clients/portal.js +37 -0
  36. package/dist/clients/portal.js.map +1 -0
  37. package/dist/clients/subject.js +56 -0
  38. package/dist/clients/subject.js.map +1 -0
  39. package/dist/index.js +7 -335
  40. package/dist/index.js.map +1 -1
  41. package/dist/schemas/openapi.js +6 -0
  42. package/dist/schemas/openapi.js.map +1 -0
  43. package/dist/test/agent.js +263 -0
  44. package/dist/test/agent.js.map +1 -0
  45. package/dist/test/mocks.js +41 -0
  46. package/dist/test/mocks.js.map +1 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +21 -13
  49. package/dist/index.cjs +0 -348
  50. package/dist/index.cjs.map +0 -1
  51. package/index.ts +0 -23
  52. package/rollup.config.js +0 -22
@@ -0,0 +1,64 @@
1
+ import crypto from 'crypto';
2
+ import { BaseClient } from './client.js';
3
+ export class EventsClient extends BaseClient {
4
+ constructor(config) {
5
+ super(config);
6
+ }
7
+ /**
8
+ * Ingest usage event in a CloudEvents format
9
+ * @see https://cloudevents.io
10
+ */
11
+ async ingest(usageEvent, options) {
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]);
38
+ // Making Request
39
+ return await this.request({
40
+ path: '/api/v1/events',
41
+ method: 'POST',
42
+ body,
43
+ headers: {
44
+ 'Content-Type': contentType,
45
+ },
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,
61
+ });
62
+ }
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"}
@@ -0,0 +1,65 @@
1
+ import { BaseClient } from './client.js';
2
+ export var WindowSize;
3
+ (function (WindowSize) {
4
+ WindowSize["MINUTE"] = "MINUTE";
5
+ WindowSize["HOUR"] = "HOUR";
6
+ WindowSize["DAY"] = "DAY";
7
+ })(WindowSize || (WindowSize = {}));
8
+ export var MeterAggregation;
9
+ (function (MeterAggregation) {
10
+ MeterAggregation["SUM"] = "SUM";
11
+ MeterAggregation["COUNT"] = "COUNT";
12
+ MeterAggregation["AVG"] = "AVG";
13
+ MeterAggregation["MIN"] = "MIN";
14
+ MeterAggregation["MAX"] = "MAX";
15
+ })(MeterAggregation || (MeterAggregation = {}));
16
+ export class MetersClient extends BaseClient {
17
+ constructor(config) {
18
+ super(config);
19
+ }
20
+ /**
21
+ * Get one meter by slug
22
+ */
23
+ async get(slug, options) {
24
+ return this.request({
25
+ method: 'GET',
26
+ path: `/api/v1/meters/${slug}`,
27
+ options,
28
+ });
29
+ }
30
+ /**
31
+ * List meters
32
+ */
33
+ async list(options) {
34
+ return this.request({
35
+ method: 'GET',
36
+ path: `/api/v1/meters`,
37
+ options,
38
+ });
39
+ }
40
+ /**
41
+ * Query a meter
42
+ */
43
+ async query(slug, params, options) {
44
+ const searchParams = params
45
+ ? BaseClient.toURLSearchParams(params)
46
+ : undefined;
47
+ return this.request({
48
+ method: 'GET',
49
+ path: `/api/v1/meters/${slug}/query`,
50
+ searchParams,
51
+ options,
52
+ });
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
+ }
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,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,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.js CHANGED
@@ -1,335 +1,9 @@
1
- import crypto from 'crypto';
2
- import { request } from 'undici';
3
-
4
- class BaseClient {
5
- config;
6
- constructor(config) {
7
- this.config = config;
8
- }
9
- async request({ path, method, searchParams, headers, body, options, }) {
10
- // Building URL
11
- const url = this.getUrl(path, searchParams);
12
- // Request options
13
- const reqHeaders = {
14
- Accept: 'application/json',
15
- ...headers,
16
- ...this.getAuthHeaders(),
17
- ...this.config.headers,
18
- ...options?.headers,
19
- };
20
- const reqOpts = {
21
- method,
22
- headers: reqHeaders,
23
- };
24
- // Optional body
25
- if (body) {
26
- if (!reqHeaders['Content-Type'] && !reqHeaders['content-type']) {
27
- throw new Error('Content Type is required with body');
28
- }
29
- reqOpts.body = body;
30
- }
31
- const resp = await request(url, reqOpts);
32
- // Error handling
33
- if (resp.statusCode > 399) {
34
- if (resp.headers['content-type'] === 'application/problem+json') {
35
- const problem = (await resp.body.json());
36
- throw new HttpError({
37
- statusCode: resp.statusCode,
38
- problem,
39
- });
40
- }
41
- // Requests can fail before API, in this case we only have a status code
42
- throw new HttpError({
43
- statusCode: resp.statusCode,
44
- });
45
- }
46
- // Response parsing
47
- if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {
48
- return undefined;
49
- }
50
- if (resp.headers['content-type'] === 'application/json') {
51
- return (await resp.body.json());
52
- }
53
- if (!resp.headers['content-type']) {
54
- throw new Error('Missing content type');
55
- }
56
- throw new Error(`Unknown content type: ${resp.headers['content-type']}`);
57
- }
58
- getUrl(path, searchParams) {
59
- let qs = searchParams ? searchParams.toString() : '';
60
- qs = qs.length > 0 ? `?${qs}` : '';
61
- const url = new URL(`${path}${qs}`, this.config.baseUrl);
62
- return url;
63
- }
64
- getAuthHeaders() {
65
- if (this.config.token) {
66
- return {
67
- authorization: `Bearer ${this.config.token}`,
68
- };
69
- }
70
- if (this.config.username && this.config.password) {
71
- const encoded = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');
72
- return {
73
- authorization: `Basic ${encoded}`,
74
- };
75
- }
76
- return {};
77
- }
78
- static toURLSearchParams(params) {
79
- const searchParams = new URLSearchParams();
80
- for (const [key, value] of Object.entries(params)) {
81
- if (value === undefined) {
82
- continue;
83
- }
84
- if (Array.isArray(value)) {
85
- for (const item of value) {
86
- searchParams.append(key, item);
87
- }
88
- }
89
- else if (value instanceof Date) {
90
- searchParams.append(key, value.toISOString());
91
- }
92
- else if (typeof value === 'object') {
93
- Object.entries(value).forEach(([k, v]) => {
94
- searchParams.append(`${key}[${k}]`, v);
95
- });
96
- }
97
- else {
98
- searchParams.append(key, value.toString());
99
- }
100
- }
101
- return searchParams;
102
- }
103
- }
104
- class HttpError extends Error {
105
- statusCode;
106
- problem;
107
- constructor({ statusCode, problem, }) {
108
- super(problem?.type || 'unexpected status code');
109
- this.name = 'HttpError';
110
- this.statusCode = statusCode;
111
- this.problem = problem;
112
- }
113
- }
114
-
115
- class EventsClient extends BaseClient {
116
- constructor(config) {
117
- super(config);
118
- }
119
- /**
120
- * Ingest usage event in a CloudEvents format
121
- * @see https://cloudevents.io
122
- */
123
- async ingest(usageEvent, options) {
124
- const isBatch = Array.isArray(usageEvent);
125
- const cloudEvents = (isBatch ? usageEvent : [usageEvent]).map((ev) => {
126
- // Validate content type
127
- if (ev.datacontenttype && ev.datacontenttype !== 'application/json') {
128
- throw new TypeError(`Unsupported datacontenttype: ${ev.datacontenttype}`);
129
- }
130
- // We default where we can to lower the barrier to use CloudEvents
131
- const cloudEvent = {
132
- specversion: ev.specversion ?? '1.0',
133
- id: ev.id ?? crypto.randomUUID(),
134
- source: ev.source ?? '@openmeter/sdk',
135
- type: ev.type,
136
- subject: ev.subject,
137
- time: ev.time?.toISOString(),
138
- datacontenttype: ev.datacontenttype,
139
- dataschema: ev.dataschema,
140
- data: ev.data,
141
- };
142
- return cloudEvent;
143
- });
144
- const contentType = isBatch
145
- ? 'application/cloudevents-batch+json'
146
- : 'application/cloudevents+json';
147
- const body = isBatch
148
- ? JSON.stringify(cloudEvents)
149
- : JSON.stringify(cloudEvents[0]);
150
- // Making Request
151
- return await this.request({
152
- path: '/api/v1/events',
153
- method: 'POST',
154
- body,
155
- headers: {
156
- 'Content-Type': contentType,
157
- },
158
- options,
159
- });
160
- }
161
- /**
162
- * List raw events
163
- */
164
- async list(params, options) {
165
- const searchParams = params
166
- ? BaseClient.toURLSearchParams(params)
167
- : undefined;
168
- return this.request({
169
- method: 'GET',
170
- path: `/api/v1/events`,
171
- searchParams,
172
- options,
173
- });
174
- }
175
- }
176
-
177
- var WindowSize;
178
- (function (WindowSize) {
179
- WindowSize["MINUTE"] = "MINUTE";
180
- WindowSize["HOUR"] = "HOUR";
181
- WindowSize["DAY"] = "DAY";
182
- })(WindowSize || (WindowSize = {}));
183
- var MeterAggregation;
184
- (function (MeterAggregation) {
185
- MeterAggregation["SUM"] = "SUM";
186
- MeterAggregation["COUNT"] = "COUNT";
187
- MeterAggregation["AVG"] = "AVG";
188
- MeterAggregation["MIN"] = "MIN";
189
- MeterAggregation["MAX"] = "MAX";
190
- })(MeterAggregation || (MeterAggregation = {}));
191
- class MetersClient extends BaseClient {
192
- constructor(config) {
193
- super(config);
194
- }
195
- /**
196
- * Get one meter by slug
197
- */
198
- async get(slug, options) {
199
- return this.request({
200
- method: 'GET',
201
- path: `/api/v1/meters/${slug}`,
202
- options,
203
- });
204
- }
205
- /**
206
- * List meters
207
- */
208
- async list(options) {
209
- return this.request({
210
- method: 'GET',
211
- path: `/api/v1/meters`,
212
- options,
213
- });
214
- }
215
- /**
216
- * Query a meter
217
- */
218
- async query(slug, params, options) {
219
- const searchParams = params
220
- ? BaseClient.toURLSearchParams(params)
221
- : undefined;
222
- return this.request({
223
- method: 'GET',
224
- path: `/api/v1/meters/${slug}/query`,
225
- searchParams,
226
- options,
227
- });
228
- }
229
- /**
230
- * List subjects of a meter
231
- */
232
- async subjects(slug, options) {
233
- return this.request({
234
- method: 'GET',
235
- path: `/api/v1/meters/${slug}/subjects`,
236
- options,
237
- });
238
- }
239
- }
240
-
241
- class PortalClient extends BaseClient {
242
- constructor(config) {
243
- super(config);
244
- }
245
- /**
246
- * Create portal token
247
- * Useful for creating a token sharable with your customer to query their own usage
248
- */
249
- async createToken(token, options) {
250
- return await this.request({
251
- path: '/api/v1/portal/tokens',
252
- method: 'POST',
253
- headers: {
254
- 'Content-Type': 'application/json',
255
- },
256
- body: JSON.stringify(token),
257
- options,
258
- });
259
- }
260
- /**
261
- * Invalidate portal token
262
- * @note OpenMeter Cloud only feature
263
- */
264
- async invalidateTokens(invalidate = {}, options) {
265
- return await this.request({
266
- path: '/api/v1/portal/tokens/invalidate',
267
- method: 'POST',
268
- headers: {
269
- 'Content-Type': 'application/json',
270
- },
271
- body: JSON.stringify(invalidate),
272
- options,
273
- });
274
- }
275
- }
276
-
277
- class SubjectClient extends BaseClient {
278
- constructor(config) {
279
- super(config);
280
- }
281
- /**
282
- * Upsert subject
283
- * Useful to map display name and metadata to subjects
284
- * @note OpenMeter Cloud only feature
285
- */
286
- async upsert(subject, options) {
287
- return await this.request({
288
- path: '/api/v1/subjects',
289
- method: 'POST',
290
- headers: {
291
- 'Content-Type': 'application/json',
292
- },
293
- body: JSON.stringify(subject),
294
- options,
295
- });
296
- }
297
- /**
298
- * Get subject by id or key
299
- * @note OpenMeter Cloud only feature
300
- */
301
- async get(idOrKey, options) {
302
- return await this.request({
303
- path: `/api/v1/subjects/${idOrKey}`,
304
- method: 'GET',
305
- options,
306
- });
307
- }
308
- /**
309
- * List subjects
310
- * @note OpenMeter Cloud only feature
311
- */
312
- async list(options) {
313
- return await this.request({
314
- path: '/api/v1/subjects',
315
- method: 'GET',
316
- options,
317
- });
318
- }
319
- /**
320
- * Delete subject by id or key
321
- * @note OpenMeter Cloud only feature
322
- */
323
- async delete(idOrKey, options) {
324
- return await this.request({
325
- path: `/api/v1/subjects/${idOrKey}`,
326
- method: 'DELETE',
327
- options,
328
- });
329
- }
330
- }
331
-
332
- class OpenMeter {
1
+ import { EventsClient } from './clients/event.js';
2
+ import { MetersClient } from './clients/meter.js';
3
+ import { PortalClient } from './clients/portal.js';
4
+ import { SubjectClient } from './clients/subject.js';
5
+ export { MeterAggregation, WindowSize } from './clients/meter.js';
6
+ export class OpenMeter {
333
7
  events;
334
8
  meters;
335
9
  portal;
@@ -341,6 +15,4 @@ class OpenMeter {
341
15
  this.subjects = new SubjectClient(config);
342
16
  }
343
17
  }
344
-
345
- export { MeterAggregation, OpenMeter, WindowSize };
346
- //# sourceMappingURL=index.js.map
18
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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":[],"mappings":"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"}
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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../schemas/openapi.ts"],"names":[],"mappings":"AAAA;;;GAGG"}