@capuchoo/cli 0.7.0 → 0.9.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.
Files changed (106) hide show
  1. package/README.md +231 -22
  2. package/bin/run.js +22 -0
  3. package/dist/cli/members.d.ts +23 -0
  4. package/dist/cli/members.d.ts.map +1 -0
  5. package/dist/cli/members.js +38 -0
  6. package/dist/cli/members.js.map +1 -0
  7. package/dist/cli/menu.d.ts +38 -0
  8. package/dist/cli/menu.d.ts.map +1 -0
  9. package/dist/cli/menu.js +62 -0
  10. package/dist/cli/menu.js.map +1 -0
  11. package/dist/cli/onboarding.d.ts +41 -0
  12. package/dist/cli/onboarding.d.ts.map +1 -0
  13. package/dist/cli/onboarding.js +94 -0
  14. package/dist/cli/onboarding.js.map +1 -0
  15. package/dist/cli/prompts.d.ts +15 -0
  16. package/dist/cli/prompts.d.ts.map +1 -1
  17. package/dist/cli/prompts.js +42 -0
  18. package/dist/cli/prompts.js.map +1 -1
  19. package/dist/cli/team.d.ts +16 -0
  20. package/dist/cli/team.d.ts.map +1 -0
  21. package/dist/cli/team.js +32 -0
  22. package/dist/cli/team.js.map +1 -0
  23. package/dist/commands/app/grant.d.ts +11 -0
  24. package/dist/commands/app/grant.d.ts.map +1 -0
  25. package/dist/commands/app/grant.js +31 -0
  26. package/dist/commands/app/grant.js.map +1 -0
  27. package/dist/commands/app/list.d.ts.map +1 -1
  28. package/dist/commands/app/list.js +2 -1
  29. package/dist/commands/app/list.js.map +1 -1
  30. package/dist/commands/app/revoke.d.ts +13 -0
  31. package/dist/commands/app/revoke.d.ts.map +1 -0
  32. package/dist/commands/app/revoke.js +40 -0
  33. package/dist/commands/app/revoke.js.map +1 -0
  34. package/dist/commands/app/roles.d.ts +7 -0
  35. package/dist/commands/app/roles.d.ts.map +1 -0
  36. package/dist/commands/app/roles.js +30 -0
  37. package/dist/commands/app/roles.js.map +1 -0
  38. package/dist/commands/auth/issue.d.ts +12 -0
  39. package/dist/commands/auth/issue.d.ts.map +1 -0
  40. package/dist/commands/auth/issue.js +52 -0
  41. package/dist/commands/auth/issue.js.map +1 -0
  42. package/dist/commands/auth/keys.d.ts +7 -0
  43. package/dist/commands/auth/keys.d.ts.map +1 -0
  44. package/dist/commands/auth/keys.js +39 -0
  45. package/dist/commands/auth/keys.js.map +1 -0
  46. package/dist/commands/auth/login.d.ts +20 -0
  47. package/dist/commands/auth/login.d.ts.map +1 -1
  48. package/dist/commands/auth/login.js +90 -11
  49. package/dist/commands/auth/login.js.map +1 -1
  50. package/dist/commands/auth/revoke.d.ts +13 -0
  51. package/dist/commands/auth/revoke.d.ts.map +1 -0
  52. package/dist/commands/auth/revoke.js +48 -0
  53. package/dist/commands/auth/revoke.js.map +1 -0
  54. package/dist/commands/auth/whoami.d.ts.map +1 -1
  55. package/dist/commands/auth/whoami.js +2 -1
  56. package/dist/commands/auth/whoami.js.map +1 -1
  57. package/dist/commands/channel/list.d.ts.map +1 -1
  58. package/dist/commands/channel/list.js +2 -1
  59. package/dist/commands/channel/list.js.map +1 -1
  60. package/dist/commands/doctor.d.ts +2 -0
  61. package/dist/commands/doctor.d.ts.map +1 -1
  62. package/dist/commands/doctor.js +86 -13
  63. package/dist/commands/doctor.js.map +1 -1
  64. package/dist/commands/init.d.ts +35 -3
  65. package/dist/commands/init.d.ts.map +1 -1
  66. package/dist/commands/init.js +121 -29
  67. package/dist/commands/init.js.map +1 -1
  68. package/dist/commands/menu.d.ts +42 -0
  69. package/dist/commands/menu.d.ts.map +1 -0
  70. package/dist/commands/menu.js +185 -0
  71. package/dist/commands/menu.js.map +1 -0
  72. package/dist/commands/org/invite.d.ts +14 -0
  73. package/dist/commands/org/invite.d.ts.map +1 -0
  74. package/dist/commands/org/invite.js +52 -0
  75. package/dist/commands/org/invite.js.map +1 -0
  76. package/dist/commands/org/members.d.ts +10 -0
  77. package/dist/commands/org/members.d.ts.map +1 -0
  78. package/dist/commands/org/members.js +49 -0
  79. package/dist/commands/org/members.js.map +1 -0
  80. package/dist/deploy/execute.d.ts.map +1 -1
  81. package/dist/deploy/execute.js +25 -5
  82. package/dist/deploy/execute.js.map +1 -1
  83. package/dist/deploy/signing.d.ts +24 -0
  84. package/dist/deploy/signing.d.ts.map +1 -0
  85. package/dist/deploy/signing.js +57 -0
  86. package/dist/deploy/signing.js.map +1 -0
  87. package/dist/pipeline/android-signing.d.ts +41 -0
  88. package/dist/pipeline/android-signing.d.ts.map +1 -0
  89. package/dist/pipeline/android-signing.js +82 -0
  90. package/dist/pipeline/android-signing.js.map +1 -0
  91. package/dist/pipeline/app-identity.d.ts +35 -0
  92. package/dist/pipeline/app-identity.d.ts.map +1 -0
  93. package/dist/pipeline/app-identity.js +109 -0
  94. package/dist/pipeline/app-identity.js.map +1 -0
  95. package/dist/pipeline/capacitor-support.d.ts +1 -1
  96. package/dist/pipeline/capacitor-support.js +1 -1
  97. package/dist/services/cloud.d.ts +82 -2
  98. package/dist/services/cloud.d.ts.map +1 -1
  99. package/dist/services/cloud.js +85 -4
  100. package/dist/services/cloud.js.map +1 -1
  101. package/dist/utils/http.d.ts +5 -0
  102. package/dist/utils/http.d.ts.map +1 -1
  103. package/dist/utils/http.js +13 -2
  104. package/dist/utils/http.js.map +1 -1
  105. package/oclif.manifest.json +397 -84
  106. package/package.json +5 -5
@@ -1,4 +1,26 @@
1
- import type { CloudApp, CloudChannel, CloudOrganization, CloudRelease, Environment, UserProfile } from "@capuchoo/core";
1
+ import type { AppRole, CloudApp, CloudChannel, CloudOrganization, CloudRelease, Environment, UserProfile } from "@capuchoo/core";
2
+ export type OrgRole = "owner" | "admin" | "member";
3
+ export type { AppRole } from "@capuchoo/core";
4
+ /** A row of organization_members or app_permissions, joined with its user. */
5
+ export interface Membership {
6
+ user_id: string;
7
+ role: string;
8
+ users?: {
9
+ id: string;
10
+ email: string;
11
+ full_name?: string | null;
12
+ } | null;
13
+ }
14
+ export interface ApiKeySummary {
15
+ id: string;
16
+ name: string;
17
+ key_prefix?: string;
18
+ app_id?: string | null;
19
+ /** Role ceiling, or null when the key carries the account's own rights. */
20
+ role?: string | null;
21
+ created_at?: string;
22
+ last_used_at?: string | null;
23
+ }
2
24
  /**
3
25
  * The Capuchoo API client.
4
26
  *
@@ -13,9 +35,67 @@ export declare class CloudClient {
13
35
  private readonly options;
14
36
  constructor(endpoint: string, apiKey: string);
15
37
  get endpoint(): string;
16
- /** Verifies the credentials and returns the profile behind them. */
38
+ /**
39
+ * The signed-in account, or null when the server refuses these credentials.
40
+ *
41
+ * `null` means the server answered and said no. Anything else - a timeout, a
42
+ * 502 from a service waking up, DNS - throws, because it is a failure to *ask*
43
+ * and not an answer.
44
+ *
45
+ * This used to swallow every error into `null`, so `doctor` reported
46
+ * "Credentials rejected - the endpoint did not accept the stored API key" for
47
+ * a backend that was merely asleep. The key was valid; the same command
48
+ * succeeded on the next run. A wrong diagnosis is worse than none, because it
49
+ * sends you looking in the wrong place with confidence.
50
+ */
17
51
  whoami(): Promise<UserProfile | null>;
52
+ /**
53
+ * Exchanges an email and password for a session token.
54
+ *
55
+ * Static because it runs before any credential exists: the whole point is to
56
+ * get one. `authenticate` accepts the returned Supabase JWT wherever it accepts
57
+ * an API key.
58
+ */
59
+ static login(endpoint: string, email: string, password: string, timeoutMs?: number): Promise<{
60
+ token: string;
61
+ user: {
62
+ id: string;
63
+ email: string;
64
+ };
65
+ }>;
66
+ /**
67
+ * Mints an API key for the signed-in account.
68
+ *
69
+ * A JWT expires; a key does not, so the CLI stores the key and forgets the
70
+ * token. Unscoped by default - the key acts as the account, and the app roles
71
+ * are what restrict it.
72
+ */
73
+ createApiKey(input: {
74
+ name: string;
75
+ appId?: string | undefined;
76
+ /** Ceiling on what the key may do. Omitted means the account's own rights. */
77
+ role?: AppRole | undefined;
78
+ }): Promise<{
79
+ key: string;
80
+ }>;
18
81
  organizations(): Promise<CloudOrganization[]>;
82
+ /**
83
+ * Keys belonging to this account. The plain key is never returned again.
84
+ *
85
+ * Unwrapped here: this endpoint answers `{ success, keys }` while the member
86
+ * and permission lists answer bare arrays.
87
+ */
88
+ apiKeys(): Promise<ApiKeySummary[]>;
89
+ revokeApiKey(id: string): Promise<void>;
90
+ orgMembers(organizationId: string): Promise<Membership[]>;
91
+ /** Adds by email; the server resolves it. Guarded by requireOrgAdmin. */
92
+ addOrgMember(organizationId: string, email: string, role: OrgRole): Promise<unknown>;
93
+ setOrgMemberRole(organizationId: string, userId: string, role: OrgRole): Promise<unknown>;
94
+ removeOrgMember(organizationId: string, userId: string): Promise<void>;
95
+ appPermissions(cloudAppId: string): Promise<Membership[]>;
96
+ /** Grants by email. Guarded by requireAppAdmin. */
97
+ grantAppRole(cloudAppId: string, email: string, role: AppRole): Promise<unknown>;
98
+ revokeAppRole(cloudAppId: string, userId: string): Promise<void>;
19
99
  apps(): Promise<CloudApp[]>;
20
100
  createApp(input: {
21
101
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/services/cloud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAGxB;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI5C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oEAAoE;IAC9D,MAAM,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ3C,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI7C,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI3B,SAAS,CAAC,KAAK,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIrB,gFAAgF;IAChF,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,kBAAkB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIvE;;;;;;;OAOG;IACH,aAAa,CAAC,KAAK,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,WAAW,CAAC;KAC1B,GAAG,OAAO,CAAC,YAAY,CAAC;IAIzB,sFAAsF;IACtF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIrD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKvE;;;;;;OAMG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB7E,YAAY,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;KACnB;IAiBD,YAAY,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;KACnB;CAiBF"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/services/cloud.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { del, get, post, uploadArtifact } from "../utils/http.js";
1
+ import { HttpError, del, get, post, put, uploadArtifact } from "../utils/http.js";
2
2
  /**
3
3
  * The Capuchoo API client.
4
4
  *
@@ -17,18 +17,99 @@ export class CloudClient {
17
17
  get endpoint() {
18
18
  return this.options.endpoint;
19
19
  }
20
- /** Verifies the credentials and returns the profile behind them. */
20
+ /**
21
+ * The signed-in account, or null when the server refuses these credentials.
22
+ *
23
+ * `null` means the server answered and said no. Anything else - a timeout, a
24
+ * 502 from a service waking up, DNS - throws, because it is a failure to *ask*
25
+ * and not an answer.
26
+ *
27
+ * This used to swallow every error into `null`, so `doctor` reported
28
+ * "Credentials rejected - the endpoint did not accept the stored API key" for
29
+ * a backend that was merely asleep. The key was valid; the same command
30
+ * succeeded on the next run. A wrong diagnosis is worse than none, because it
31
+ * sends you looking in the wrong place with confidence.
32
+ */
21
33
  async whoami() {
22
34
  try {
23
35
  return await get("/api/auth/me", this.options);
24
36
  }
25
- catch {
26
- return null;
37
+ catch (error) {
38
+ if (error instanceof HttpError && (error.status === 401 || error.status === 403)) {
39
+ return null;
40
+ }
41
+ throw error;
27
42
  }
28
43
  }
44
+ /**
45
+ * Exchanges an email and password for a session token.
46
+ *
47
+ * Static because it runs before any credential exists: the whole point is to
48
+ * get one. `authenticate` accepts the returned Supabase JWT wherever it accepts
49
+ * an API key.
50
+ */
51
+ static async login(endpoint, email, password, timeoutMs) {
52
+ const response = await post("/api/auth/login", { email, password }, { endpoint, apiKey: "", timeoutMs });
53
+ if (!response.token)
54
+ throw new Error("The backend accepted the sign-in but returned no token");
55
+ return {
56
+ token: response.token,
57
+ user: { id: response.user?.id ?? "", email: response.user?.email ?? email },
58
+ };
59
+ }
60
+ /**
61
+ * Mints an API key for the signed-in account.
62
+ *
63
+ * A JWT expires; a key does not, so the CLI stores the key and forgets the
64
+ * token. Unscoped by default - the key acts as the account, and the app roles
65
+ * are what restrict it.
66
+ */
67
+ createApiKey(input) {
68
+ return post("/api/api-keys", {
69
+ name: input.name,
70
+ ...(input.appId ? { app_id: input.appId } : {}),
71
+ ...(input.role ? { role: input.role } : {}),
72
+ }, this.options);
73
+ }
29
74
  organizations() {
30
75
  return get("/api/organizations", this.options);
31
76
  }
77
+ /**
78
+ * Keys belonging to this account. The plain key is never returned again.
79
+ *
80
+ * Unwrapped here: this endpoint answers `{ success, keys }` while the member
81
+ * and permission lists answer bare arrays.
82
+ */
83
+ async apiKeys() {
84
+ const response = await get("/api/api-keys", this.options);
85
+ return Array.isArray(response) ? response : (response.keys ?? []);
86
+ }
87
+ revokeApiKey(id) {
88
+ return del(`/api/api-keys/${id}`, this.options);
89
+ }
90
+ orgMembers(organizationId) {
91
+ return get(`/api/organizations/${organizationId}/members`, this.options);
92
+ }
93
+ /** Adds by email; the server resolves it. Guarded by requireOrgAdmin. */
94
+ addOrgMember(organizationId, email, role) {
95
+ return post(`/api/organizations/${organizationId}/members`, { email, role }, this.options);
96
+ }
97
+ setOrgMemberRole(organizationId, userId, role) {
98
+ return put(`/api/organizations/${organizationId}/members/${userId}`, { role }, this.options);
99
+ }
100
+ removeOrgMember(organizationId, userId) {
101
+ return del(`/api/organizations/${organizationId}/members/${userId}`, this.options);
102
+ }
103
+ appPermissions(cloudAppId) {
104
+ return get(`/api/apps/${cloudAppId}/permissions`, this.options);
105
+ }
106
+ /** Grants by email. Guarded by requireAppAdmin. */
107
+ grantAppRole(cloudAppId, email, role) {
108
+ return post(`/api/apps/${cloudAppId}/permissions`, { email, role }, this.options);
109
+ }
110
+ revokeAppRole(cloudAppId, userId) {
111
+ return del(`/api/apps/${cloudAppId}/permissions/${userId}`, this.options);
112
+ }
32
113
  apps() {
33
114
  return get("/api/apps", this.options);
34
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/services/cloud.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AAEpF;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACL,OAAO,CAAc;IAEtC,YAAY,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAc,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO,GAAG,CAAsB,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,IAAI;QACF,OAAO,GAAG,CAAa,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,SAAS,CAAC,KAKT;QACC,OAAO,IAAI,CAAW,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,gFAAgF;IAChF,SAAS,CAAC,UAAkB;QAC1B,OAAO,GAAG,CAAC,aAAa,UAAU,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,kBAAkB,CAAC,KAAuB;QACxC,OAAO,IAAI,CAAoB,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,KAIb;QACC,OAAO,IAAI,CAAe,yBAAyB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,sFAAsF;IACtF,aAAa,CAAC,SAAiB,EAAE,UAAkB;QACjD,OAAO,GAAG,CACR,2BAA2B,SAAS,WAAW,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAC/E,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,UAAkB;QACzB,OAAO,GAAG,CAAiB,aAAa,UAAU,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED,QAAQ,CAAC,UAAkB,EAAE,OAAgB;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,GAAG,CAAiB,aAAa,UAAU,YAAY,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB,EAAE,IAAY;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEtE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,6CAA6C,SAAS,GAAG,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,yDAAyD;gBACvE,0EAA0E;gBAC1E,0BAA0B,CAC7B,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,YAAY,CAAC,KASZ;QACC,OAAO,cAAc,CACnB,mBAAmB,EACnB,KAAK,CAAC,QAAQ,EACd;YACE,MAAM,EAAE,KAAK,CAAC,KAAK;YACnB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;SACjC,EACD,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CACzC,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,KAUZ;QACC,OAAO,cAAc,CACnB,0BAA0B,EAC1B,KAAK,CAAC,QAAQ,EACd;YACE,MAAM,EAAE,KAAK,CAAC,KAAK;YACnB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;YACvC,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;SACjC,EACD,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CACzC,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/services/cloud.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@
7
7
  * the previous `fs.createReadStream` plus `maxBodyLength: Infinity` combination
8
8
  * worked, but only because the limit was disabled.
9
9
  */
10
+ /** A request that never came back. Distinguishable so a caller can retry it. */
11
+ export declare class TimeoutError extends Error {
12
+ constructor(url: string, timeoutMs: number);
13
+ }
10
14
  export declare class HttpError extends Error {
11
15
  readonly status: number;
12
16
  readonly body: unknown;
@@ -19,6 +23,7 @@ export interface HttpOptions {
19
23
  }
20
24
  export declare function get<T>(pathname: string, options: HttpOptions): Promise<T>;
21
25
  export declare function post<T>(pathname: string, body: unknown, options: HttpOptions): Promise<T>;
26
+ export declare function put<T>(pathname: string, body: unknown, options: HttpOptions): Promise<T>;
22
27
  /** A 204 is the success case here, so the caller gets nothing back. */
23
28
  export declare function del(pathname: string, options: HttpOptions): Promise<void>;
24
29
  export interface UploadResult {
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM3D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmFD,wBAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzF;AAED,uEAAuE;AACvE,wBAAsB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/E;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC,YAAY,CAAC,CA8CvB"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,gFAAgF;AAChF,qBAAa,YAAa,SAAQ,KAAK;gBACzB,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAI3C;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM3D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoFD,wBAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzF;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAExF;AAED,uEAAuE;AACvE,wBAAsB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/E;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC,YAAY,CAAC,CA8CvB"}
@@ -10,6 +10,13 @@ import path from "node:path";
10
10
  * the previous `fs.createReadStream` plus `maxBodyLength: Infinity` combination
11
11
  * worked, but only because the limit was disabled.
12
12
  */
13
+ /** A request that never came back. Distinguishable so a caller can retry it. */
14
+ export class TimeoutError extends Error {
15
+ constructor(url, timeoutMs) {
16
+ super(`${url} did not respond within ${Math.round(timeoutMs / 1000)}s`);
17
+ this.name = "TimeoutError";
18
+ }
19
+ }
13
20
  export class HttpError extends Error {
14
21
  status;
15
22
  body;
@@ -58,7 +65,8 @@ function messageFrom(body, fallback) {
58
65
  }
59
66
  async function request(method, url, options) {
60
67
  const controller = new AbortController();
61
- const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 30_000);
68
+ const timeoutMs = options.timeoutMs ?? 30_000;
69
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
62
70
  try {
63
71
  const response = await fetch(url, {
64
72
  method,
@@ -81,7 +89,7 @@ async function request(method, url, options) {
81
89
  if (error instanceof HttpError)
82
90
  throw error;
83
91
  if (error instanceof Error && error.name === "AbortError") {
84
- throw new Error(`${url} did not respond within the timeout`);
92
+ throw new TimeoutError(url, timeoutMs);
85
93
  }
86
94
  // A DNS or TLS failure surfaces as an opaque "fetch failed"; say which host.
87
95
  if (error instanceof TypeError) {
@@ -99,6 +107,9 @@ export function get(pathname, options) {
99
107
  export function post(pathname, body, options) {
100
108
  return request("POST", `${options.endpoint}${pathname}`, { ...options, body });
101
109
  }
110
+ export function put(pathname, body, options) {
111
+ return request("PUT", `${options.endpoint}${pathname}`, { ...options, body });
112
+ }
102
113
  /** A 204 is the success case here, so the caller gets nothing back. */
103
114
  export async function del(pathname, options) {
104
115
  await request("DELETE", `${options.endpoint}${pathname}`, options);
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;GAQG;AAEH,gFAAgF;AAChF,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,GAAW,EAAE,SAAiB;QACxC,KAAK,CAAC,GAAG,GAAG,2BAA2B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IACf,IAAI,CAAU;IAEvB,YAAY,OAAe,EAAE,MAAc,EAAE,IAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAQD,KAAK,UAAU,QAAQ,CAAC,QAAkB;IACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,WAAW,CAAC,IAAa,EAAE,QAAgB;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAA+B,CAAC;QAE/C,sEAAsE;QACtE,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;aAClC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aACzB,IAAI,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;aACjC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aACzB,IAAI,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEnF,IAAI,QAAQ,IAAI,MAAM;YAAE,OAAO,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAyC,EACzC,GAAW,EACX,OAAyC;IAEzC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;gBACzC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;aAC9E;YACD,yEAAyE;YACzE,yDAAyD;YACzD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7E,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CACjB,WAAW,CAAC,IAAI,EAAE,GAAG,MAAM,IAAI,GAAG,cAAc,QAAQ,CAAC,MAAM,EAAE,CAAC,EAClE,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAC;QACJ,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,KAAK,CAAC;QAC5C,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,6EAA6E;QAC7E,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,QAAgB,EAAE,OAAoB;IAC3D,OAAO,OAAO,CAAI,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,IAAI,CAAI,QAAgB,EAAE,IAAa,EAAE,OAAoB;IAC3E,OAAO,OAAO,CAAI,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,QAAgB,EAAE,IAAa,EAAE,OAAoB;IAC1E,OAAO,OAAO,CAAI,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,QAAgB,EAAE,OAAoB;IAC9D,MAAM,OAAO,CAAU,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,QAAgB,EAChB,MAA8B,EAC9B,OAAiE;IAEjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,iBAAiB,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE1E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,sEAAsE;YACtE,oEAAoE;YACpE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,EAAE;YACtD,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CACjB,WAAW,CAAC,IAAI,EAAE,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,EAC5D,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,KAAK,CAAC;QAC5C,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}