@atlasauth/backend 0.2.0 → 0.5.0

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,5 +1,5 @@
1
1
  import { type RequestFn } from './request';
2
- import type { ListPage } from './types';
2
+ import type { CursorPage, ListPage } from './types';
3
3
  export type ApiKeySubjectType = 'user' | 'organization';
4
4
  /**
5
5
  * An end-user API key — Clerk `api_keys` parity. A tenant mints these for ITS OWN
@@ -56,6 +56,45 @@ export type ApiKeyVerification = {
56
56
  claims: Record<string, unknown>;
57
57
  last_used_at: number | null;
58
58
  };
59
+ /**
60
+ * §P1-8 a short-lived, offline-verifiable access JWT minted from a long-lived
61
+ * `ak_` key (`POST /v1/api_keys/token`). Signed with the instance's RS256 key, so
62
+ * any resource server verifies it against the public JWKS without a round trip.
63
+ */
64
+ export interface ApiKeyToken {
65
+ object: 'api_key_token';
66
+ token: string;
67
+ token_type: 'Bearer';
68
+ jti: string;
69
+ key_id: string;
70
+ subject_type: ApiKeySubjectType;
71
+ subject_id: string;
72
+ scopes: string[];
73
+ constraints: Record<string, unknown>;
74
+ expires_in: number;
75
+ expires_at: number;
76
+ /** Which JWKS/issuer a verifier should check, so it needn't parse the JWT first. */
77
+ issuer: string;
78
+ }
79
+ export interface MintApiKeyTokenBody {
80
+ /** The long-lived `ak_` secret to mint from. */
81
+ secret: string;
82
+ /** Requested lifetime; clamped to the key's ceiling, its expiry, and the global cap. */
83
+ ttl_seconds?: number;
84
+ audience?: string | string[];
85
+ }
86
+ /** One entry in the revocation feed: an id and when it was revoked. */
87
+ export interface RevokedApiKeyRef {
88
+ object: 'api_key';
89
+ id: string;
90
+ revoked_at: number | null;
91
+ }
92
+ export interface ListRevokedApiKeysQuery {
93
+ /** An ISO-8601 instant, epoch-millis, or a `next_cursor` from a previous page. */
94
+ since?: string;
95
+ /** Page size (server clamps to its own maximum). */
96
+ limit?: number;
97
+ }
59
98
  export declare function apiKeysResource(request: RequestFn): {
60
99
  /** Optionally narrowed to one subject. */
61
100
  list(query?: {
@@ -74,4 +113,14 @@ export declare function apiKeysResource(request: RequestFn): {
74
113
  id: string;
75
114
  revoked: true;
76
115
  }>;
116
+ /**
117
+ * §P1-8 mint a short-lived delegated token from an `ak_` key. Rate-limited —
118
+ * presenting the secret is the same online credential surface as verify.
119
+ */
120
+ mintToken(body: MintApiKeyTokenBody): Promise<ApiKeyToken>;
121
+ /**
122
+ * §P1-8 the revocation feed a resource server polls to deny-list revoked keys
123
+ * while their delegated tokens are still live. Keyset-paginated via `since`.
124
+ */
125
+ listRevoked(query?: ListRevokedApiKeysQuery): Promise<CursorPage<RevokedApiKeyRef>>;
77
126
  };
@@ -26,6 +26,20 @@ function apiKeysResource(request) {
26
26
  delete(id) {
27
27
  return request({ method: 'DELETE', path: `/v1/api_keys/${(0, request_1.enc)(id)}` });
28
28
  },
29
+ /**
30
+ * §P1-8 mint a short-lived delegated token from an `ak_` key. Rate-limited —
31
+ * presenting the secret is the same online credential surface as verify.
32
+ */
33
+ mintToken(body) {
34
+ return request({ method: 'POST', path: '/v1/api_keys/token', body });
35
+ },
36
+ /**
37
+ * §P1-8 the revocation feed a resource server polls to deny-list revoked keys
38
+ * while their delegated tokens are still live. Keyset-paginated via `since`.
39
+ */
40
+ listRevoked(query = {}) {
41
+ return request({ method: 'GET', path: '/v1/api_keys/revoked', query: { ...query } });
42
+ },
29
43
  };
30
44
  }
31
45
  //# sourceMappingURL=api-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/client/api-keys.ts"],"names":[],"mappings":";;AAgEA,0CA4BC;AA5FD,uCAAgD;AAgEhD,SAAgB,eAAe,CAAC,OAAkB;IAChD,OAAO;QACL,0CAA0C;QAC1C,IAAI,CAAC,KAGJ;YACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,qDAAqD;QACrD,MAAM,CAAC,IAAsB,EAAE,cAAuB;YACpD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,iFAAiF;QACjF,MAAM,CAAC,MAAc;YACnB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAsB;YACvC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,sEAAsE;QACtE,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/client/api-keys.ts"],"names":[],"mappings":";;AA2GA,0CA0CC;AArJD,uCAAgD;AA2GhD,SAAgB,eAAe,CAAC,OAAkB;IAChD,OAAO;QACL,0CAA0C;QAC1C,IAAI,CAAC,KAGJ;YACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,qDAAqD;QACrD,MAAM,CAAC,IAAsB,EAAE,cAAuB;YACpD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,iFAAiF;QACjF,MAAM,CAAC,MAAc;YACnB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAsB;YACvC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,sEAAsE;QACtE,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QACD;;;WAGG;QACH,SAAS,CAAC,IAAyB;YACjC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD;;;WAGG;QACH,WAAW,CAAC,QAAiC,EAAE;YAC7C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -390,6 +390,33 @@ export declare function createAtlasClient(config: AtlasClientConfig): {
390
390
  id: string;
391
391
  revoked: true;
392
392
  }>;
393
+ mintToken(body: import("./api-keys").MintApiKeyTokenBody): Promise<import("./api-keys").ApiKeyToken>;
394
+ listRevoked(query?: import("./api-keys").ListRevokedApiKeysQuery): Promise<import("./types").CursorPage<import("./api-keys").RevokedApiKeyRef>>;
395
+ };
396
+ machines: {
397
+ list(query?: import("./machines").ListMachinesQuery): Promise<import("./machines").MachineListPage>;
398
+ create(body: import("./machines").CreateMachineBody, idempotencyKey?: string): Promise<import("./machines").MachineWithSecret>;
399
+ get(id: string): Promise<import("./machines").Machine>;
400
+ rename(id: string, name: string): Promise<import("./machines").Machine>;
401
+ patchMetadata(id: string, metadata: import("./machines").MachineMetadata): Promise<import("./machines").Machine>;
402
+ approve(id: string): Promise<import("./machines").Machine>;
403
+ revoke(id: string): Promise<import("./machines").Machine>;
404
+ rotateSecret(id: string): Promise<import("./machines").MachineWithSecret>;
405
+ rotateKey(id: string, publicKeyPem: string): Promise<import("./machines").Machine>;
406
+ delete(id: string): Promise<{
407
+ object: "machine";
408
+ id: string;
409
+ deleted: true;
410
+ }>;
411
+ organizationMemberships(id: string): Promise<import("./machines").MachineOrganizationMembershipPage>;
412
+ createEnrolmentToken(body?: import("./machines").CreateEnrolmentTokenBody, idempotencyKey?: string): Promise<import("./machines").MachineEnrolmentTokenWithSecret>;
413
+ listEnrolmentTokens(): Promise<import("./types").ListPage<import("./machines").MachineEnrolmentToken>>;
414
+ deleteEnrolmentToken(id: string): Promise<{
415
+ object: "machine_enrolment_token";
416
+ id: string;
417
+ deleted: true;
418
+ }>;
419
+ verifyM2mToken(token: string): Promise<import("./machines").M2mTokenVerification>;
393
420
  };
394
421
  oauthProviders: {
395
422
  list(): Promise<import("./types").ListPage<import("./oauth-providers").OAuthProvider>>;
@@ -654,8 +681,18 @@ export declare function createAtlasClient(config: AtlasClientConfig): {
654
681
  };
655
682
  messaging: {
656
683
  get(): Promise<import("./messaging").MessagingProviders>;
657
- setEmail(body: import("./messaging").MessagingProviderInput): Promise<import("./messaging").MessagingProvider>;
658
- setSms(body: import("./messaging").MessagingProviderInput): Promise<import("./messaging").MessagingProvider>;
684
+ setEmail: {
685
+ (body: import("./messaging").EmailProviderInput): Promise<import("./messaging").EmailProvider>;
686
+ <T extends string>(body: Omit<import("./messaging").MessagingProviderInput, "transport"> & {
687
+ transport: T;
688
+ } & (string extends T ? unknown : never)): Promise<import("./messaging").MessagingProvider>;
689
+ };
690
+ setSms: {
691
+ (body: import("./messaging").SmsProviderInput): Promise<import("./messaging").SmsProvider>;
692
+ <T extends string>(body: Omit<import("./messaging").MessagingProviderInput, "transport"> & {
693
+ transport: T;
694
+ } & (string extends T ? unknown : never)): Promise<import("./messaging").MessagingProvider>;
695
+ };
659
696
  deleteChannel(channel: "email" | "sms"): Promise<import("./messaging").DeletedMessagingProvider>;
660
697
  test(channel: "email" | "sms", body: {
661
698
  to: string;
@@ -773,6 +810,7 @@ export * from './sign-in-tokens';
773
810
  export * from './audit-logs';
774
811
  export * from './jwt-templates';
775
812
  export * from './api-keys';
813
+ export * from './machines';
776
814
  export * from './oauth-providers';
777
815
  export * from './sso-onboarding';
778
816
  export * from './scim-provisioning';
@@ -36,6 +36,7 @@ const sign_in_tokens_1 = require("./sign-in-tokens");
36
36
  const audit_logs_1 = require("./audit-logs");
37
37
  const jwt_templates_1 = require("./jwt-templates");
38
38
  const api_keys_1 = require("./api-keys");
39
+ const machines_1 = require("./machines");
39
40
  const oauth_providers_1 = require("./oauth-providers");
40
41
  const sso_onboarding_1 = require("./sso-onboarding");
41
42
  const scim_provisioning_1 = require("./scim-provisioning");
@@ -94,6 +95,8 @@ function createAtlasClient(config) {
94
95
  auditLogs: (0, audit_logs_1.auditLogsResource)(request),
95
96
  jwtTemplates: (0, jwt_templates_1.jwtTemplatesResource)(request),
96
97
  apiKeys: (0, api_keys_1.apiKeysResource)(request),
98
+ // §9.3 / §P1-7 named machine identities + device registry + enrolment tokens.
99
+ machines: (0, machines_1.machinesResource)(request),
97
100
  oauthProviders: (0, oauth_providers_1.oauthProvidersResource)(request),
98
101
  ssoOnboarding: (0, sso_onboarding_1.ssoOnboardingResource)(request),
99
102
  scimProvisioning: (0, scim_provisioning_1.scimProvisioningResource)(request),
@@ -151,6 +154,7 @@ __exportStar(require("./sign-in-tokens"), exports);
151
154
  __exportStar(require("./audit-logs"), exports);
152
155
  __exportStar(require("./jwt-templates"), exports);
153
156
  __exportStar(require("./api-keys"), exports);
157
+ __exportStar(require("./machines"), exports);
154
158
  __exportStar(require("./oauth-providers"), exports);
155
159
  __exportStar(require("./sso-onboarding"), exports);
156
160
  __exportStar(require("./scim-provisioning"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { type RequestFn } from './request';
2
+ import type { CursorParams, ListPage, Metadata } from './types';
3
+ /**
4
+ * §9.3 / §P1-7 MACHINE identities + the device registry.
5
+ *
6
+ * A machine is a first-class non-human principal with its own secret (`mk_…`),
7
+ * distinct from an instance API key. §P1-7 layers a DEVICE half on top: a machine
8
+ * can carry a registered public KEY, a lifecycle `status`, device `metadata`, and
9
+ * optional org/owner ownership. This namespace is the `sk_`-authenticated
10
+ * MANAGEMENT surface (list/filter, create, rename, metadata, approve, revoke, key
11
+ * rotation, delete) plus enrolment-token management and M2M-token verification.
12
+ *
13
+ * The device self-serve half (`/v1/machines/enroll`, `/challenge`, `/token`) is a
14
+ * PUBLIC, credential-presented surface a bootstrapping device calls with no `sk_`,
15
+ * so it is deliberately NOT part of this secret-key client.
16
+ */
17
+ /** A machine's lifecycle state. `pending` awaits approval; `revoked` is terminal. */
18
+ export type MachineStatus = 'pending' | 'active' | 'revoked';
19
+ /** Device metadata bag (hostname/os/app_version/last_seen_at/…). */
20
+ export type MachineMetadata = Record<string, unknown>;
21
+ /**
22
+ * A named machine identity. `secret_hash` is never present on any machine surface
23
+ * — only a hash is stored, so the `mk_` secret is shown exactly once at
24
+ * create/rotate (see {@link MachineWithSecret}).
25
+ */
26
+ export interface Machine {
27
+ object: 'machine';
28
+ id: string;
29
+ name: string;
30
+ organization_id: string | null;
31
+ status: MachineStatus;
32
+ /** JWK thumbprint of the registered device key, or null for a secret-only machine. */
33
+ public_key_jkt: string | null;
34
+ metadata: MachineMetadata;
35
+ enrolled_at: number | null;
36
+ created_at: number;
37
+ updated_at: number;
38
+ }
39
+ /** The create / rotate_secret response: the machine plus its `mk_` secret, shown once. */
40
+ export interface MachineWithSecret extends Machine {
41
+ secret: string;
42
+ }
43
+ export interface CreateMachineBody {
44
+ name: string;
45
+ /** Round-7: the user who owns this machine identity. */
46
+ owner_user_id?: string;
47
+ /** Round-7: bind the machine to an organization at creation. */
48
+ organization_id?: string;
49
+ /** Round-7: free-form data bag stored on the machine. */
50
+ data?: Metadata;
51
+ /** Device metadata (hostname/os/app_version/…). */
52
+ metadata?: MachineMetadata;
53
+ }
54
+ export interface ListMachinesQuery extends CursorParams {
55
+ status?: MachineStatus;
56
+ /** Filter by the device's reported hostname. */
57
+ hostname?: string;
58
+ /** Round-7: only machines owned by this user. */
59
+ owner_user_id?: string;
60
+ /** Round-7: only machines belonging to this organization. */
61
+ organization_id?: string;
62
+ /** Round-7: a JSON-encoded metadata match filter. */
63
+ metadata?: string;
64
+ }
65
+ /**
66
+ * The machine list page. The envelope is `{ object: 'list', data }`; §P1-7's
67
+ * cursor fields (`has_more`/`next_cursor`) are present on the round-7 surface and
68
+ * optional here so the type is honest against both.
69
+ */
70
+ export interface MachineListPage {
71
+ object: 'list';
72
+ data: Machine[];
73
+ has_more?: boolean;
74
+ next_cursor?: string | null;
75
+ }
76
+ /**
77
+ * A machine's org membership, membership-shaped like
78
+ * `GET /v1/users/:id/organization_memberships`. A machine belongs to at most one
79
+ * org today, so the list holds 0 or 1 entries; `role` is always null (a machine
80
+ * holds no org role).
81
+ */
82
+ export interface MachineOrganizationMembership {
83
+ object: 'organization_membership';
84
+ organization_id: string;
85
+ organization_slug: string;
86
+ role: null;
87
+ plan: string | null;
88
+ joined_at: number;
89
+ }
90
+ export interface MachineOrganizationMembershipPage {
91
+ object: 'list';
92
+ data: MachineOrganizationMembership[];
93
+ has_more: boolean;
94
+ next_cursor: string | null;
95
+ }
96
+ /** An enrolment token — a short-lived credential a device presents to `/enroll`. */
97
+ export interface MachineEnrolmentToken {
98
+ object: 'machine_enrolment_token';
99
+ id: string;
100
+ organization_id: string | null;
101
+ max_uses: number;
102
+ uses: number;
103
+ expires_at: number;
104
+ requires_approval: boolean;
105
+ created_at: number;
106
+ }
107
+ /** The create response: the enrolment token plus its `met_` secret, shown once. */
108
+ export interface MachineEnrolmentTokenWithSecret extends MachineEnrolmentToken {
109
+ token: string;
110
+ }
111
+ export interface CreateEnrolmentTokenBody {
112
+ /** Bind machines enrolled with this token to an organization. */
113
+ organization_id?: string;
114
+ /** Round-7: the user who will own machines enrolled with this token. */
115
+ owner_user_id?: string;
116
+ /** Round-7: free-form data copied onto each enrolled machine. */
117
+ data?: Metadata;
118
+ /** Round-7: restrict the token to a single enrolment session. */
119
+ single_session?: boolean;
120
+ /** Round-7: the maximum number of machines that may enrol with this token. */
121
+ max_machines?: number;
122
+ /** How many times the token may be redeemed (defaults to 1 server-side). */
123
+ max_uses?: number;
124
+ /** Token lifetime; defaults to 3600s, capped at one year. */
125
+ expires_in_seconds?: number;
126
+ /** When true, enrolled machines start `pending` and must be approved. */
127
+ requires_approval?: boolean;
128
+ }
129
+ /**
130
+ * The verify verdict for an M2M credential (Clerk `verifyM2MToken`): resolve a
131
+ * presented machine secret to its machine. An unknown, rotated, or revoked secret
132
+ * all resolve to the SAME `{ valid: false }`, so a caller cannot probe which
133
+ * machines exist.
134
+ */
135
+ export type M2mTokenVerification = {
136
+ object: 'm2m_verification';
137
+ valid: false;
138
+ } | {
139
+ object: 'm2m_verification';
140
+ valid: true;
141
+ machine_id: string;
142
+ name: string;
143
+ };
144
+ export declare function machinesResource(request: RequestFn): {
145
+ /** List + filter machines (§P1-7 device-registry query). */
146
+ list(query?: ListMachinesQuery): Promise<MachineListPage>;
147
+ /** Create a machine. The `mk_` secret is returned once, here. */
148
+ create(body: CreateMachineBody, idempotencyKey?: string): Promise<MachineWithSecret>;
149
+ get(id: string): Promise<Machine>;
150
+ /** Rename a machine (`PATCH /v1/machines/:id`). */
151
+ rename(id: string, name: string): Promise<Machine>;
152
+ /** Merge device metadata (`PATCH /v1/machines/:id/metadata`). */
153
+ patchMetadata(id: string, metadata: MachineMetadata): Promise<Machine>;
154
+ /** Approve a `pending` device (→ `active`). */
155
+ approve(id: string): Promise<Machine>;
156
+ /** Revoke a machine (→ `revoked`). The record is kept; its key stops minting at once. */
157
+ revoke(id: string): Promise<Machine>;
158
+ /** Rotate the `mk_` secret. The new secret is shown once; the old stops working. */
159
+ rotateSecret(id: string): Promise<MachineWithSecret>;
160
+ /** Rotate the registered device keypair by supplying the new public key PEM. */
161
+ rotateKey(id: string, publicKeyPem: string): Promise<Machine>;
162
+ /** Delete a machine outright (distinct from {@link revoke}, which keeps the record). */
163
+ delete(id: string): Promise<{
164
+ object: "machine";
165
+ id: string;
166
+ deleted: true;
167
+ }>;
168
+ /** The machine's org memberships (0 or 1 entry). */
169
+ organizationMemberships(id: string): Promise<MachineOrganizationMembershipPage>;
170
+ /** Mint an enrolment token. The `met_` secret is returned once, here. */
171
+ createEnrolmentToken(body?: CreateEnrolmentTokenBody, idempotencyKey?: string): Promise<MachineEnrolmentTokenWithSecret>;
172
+ listEnrolmentTokens(): Promise<ListPage<MachineEnrolmentToken>>;
173
+ deleteEnrolmentToken(id: string): Promise<{
174
+ object: "machine_enrolment_token";
175
+ id: string;
176
+ deleted: true;
177
+ }>;
178
+ /**
179
+ * Verify a presented M2M credential (`POST /v1/m2m_tokens/verify`). Resolve a
180
+ * machine secret to its machine; every negative resolves to `{ valid: false }`.
181
+ */
182
+ verifyM2mToken(token: string): Promise<M2mTokenVerification>;
183
+ };
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.machinesResource = machinesResource;
4
+ const request_1 = require("./request");
5
+ function machinesResource(request) {
6
+ return {
7
+ /** List + filter machines (§P1-7 device-registry query). */
8
+ list(query = {}) {
9
+ return request({ method: 'GET', path: '/v1/machines', query: { ...query } });
10
+ },
11
+ /** Create a machine. The `mk_` secret is returned once, here. */
12
+ create(body, idempotencyKey) {
13
+ return request({ method: 'POST', path: '/v1/machines', body, idempotencyKey });
14
+ },
15
+ get(id) {
16
+ return request({ method: 'GET', path: `/v1/machines/${(0, request_1.enc)(id)}` });
17
+ },
18
+ /** Rename a machine (`PATCH /v1/machines/:id`). */
19
+ rename(id, name) {
20
+ return request({ method: 'PATCH', path: `/v1/machines/${(0, request_1.enc)(id)}`, body: { name } });
21
+ },
22
+ /** Merge device metadata (`PATCH /v1/machines/:id/metadata`). */
23
+ patchMetadata(id, metadata) {
24
+ return request({ method: 'PATCH', path: `/v1/machines/${(0, request_1.enc)(id)}/metadata`, body: { metadata } });
25
+ },
26
+ /** Approve a `pending` device (→ `active`). */
27
+ approve(id) {
28
+ return request({ method: 'POST', path: `/v1/machines/${(0, request_1.enc)(id)}/approve` });
29
+ },
30
+ /** Revoke a machine (→ `revoked`). The record is kept; its key stops minting at once. */
31
+ revoke(id) {
32
+ return request({ method: 'POST', path: `/v1/machines/${(0, request_1.enc)(id)}/revoke` });
33
+ },
34
+ /** Rotate the `mk_` secret. The new secret is shown once; the old stops working. */
35
+ rotateSecret(id) {
36
+ return request({ method: 'POST', path: `/v1/machines/${(0, request_1.enc)(id)}/rotate_secret` });
37
+ },
38
+ /** Rotate the registered device keypair by supplying the new public key PEM. */
39
+ rotateKey(id, publicKeyPem) {
40
+ return request({
41
+ method: 'POST',
42
+ path: `/v1/machines/${(0, request_1.enc)(id)}/rotate_key`,
43
+ body: { public_key_pem: publicKeyPem },
44
+ });
45
+ },
46
+ /** Delete a machine outright (distinct from {@link revoke}, which keeps the record). */
47
+ delete(id) {
48
+ return request({ method: 'DELETE', path: `/v1/machines/${(0, request_1.enc)(id)}` });
49
+ },
50
+ /** The machine's org memberships (0 or 1 entry). */
51
+ organizationMemberships(id) {
52
+ return request({ method: 'GET', path: `/v1/machines/${(0, request_1.enc)(id)}/organization_memberships` });
53
+ },
54
+ /** Mint an enrolment token. The `met_` secret is returned once, here. */
55
+ createEnrolmentToken(body = {}, idempotencyKey) {
56
+ return request({ method: 'POST', path: '/v1/machine_enrolment_tokens', body, idempotencyKey });
57
+ },
58
+ listEnrolmentTokens() {
59
+ return request({ method: 'GET', path: '/v1/machine_enrolment_tokens' });
60
+ },
61
+ deleteEnrolmentToken(id) {
62
+ return request({ method: 'DELETE', path: `/v1/machine_enrolment_tokens/${(0, request_1.enc)(id)}` });
63
+ },
64
+ /**
65
+ * Verify a presented M2M credential (`POST /v1/m2m_tokens/verify`). Resolve a
66
+ * machine secret to its machine; every negative resolves to `{ valid: false }`.
67
+ */
68
+ verifyM2mToken(token) {
69
+ return request({ method: 'POST', path: '/v1/m2m_tokens/verify', body: { token } });
70
+ },
71
+ };
72
+ }
73
+ //# sourceMappingURL=machines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machines.js","sourceRoot":"","sources":["../../src/client/machines.ts"],"names":[],"mappings":"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"}