@distilled.cloud/fly-io 1.0.0-rc.5 → 1.0.0-rc.7

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 (56) hide show
  1. package/lib/credentials.d.ts +17 -0
  2. package/lib/credentials.d.ts.map +1 -1
  3. package/lib/credentials.js +39 -7
  4. package/lib/credentials.js.map +1 -1
  5. package/lib/errors.d.ts +32 -0
  6. package/lib/errors.d.ts.map +1 -1
  7. package/lib/errors.js +33 -0
  8. package/lib/errors.js.map +1 -1
  9. package/lib/index.d.ts +27 -2
  10. package/lib/index.d.ts.map +1 -1
  11. package/lib/index.js +27 -2
  12. package/lib/index.js.map +1 -1
  13. package/lib/pagination.d.ts +5 -0
  14. package/lib/pagination.d.ts.map +1 -0
  15. package/lib/pagination.js +5 -0
  16. package/lib/pagination.js.map +1 -0
  17. package/lib/protocol.d.ts +49 -7
  18. package/lib/protocol.d.ts.map +1 -1
  19. package/lib/protocol.js +529 -29
  20. package/lib/protocol.js.map +1 -1
  21. package/lib/services/addons.d.ts +466 -0
  22. package/lib/services/addons.d.ts.map +1 -0
  23. package/lib/services/addons.js +613 -0
  24. package/lib/services/addons.js.map +1 -0
  25. package/lib/services/index.d.ts +3 -0
  26. package/lib/services/index.d.ts.map +1 -1
  27. package/lib/services/index.js +3 -0
  28. package/lib/services/index.js.map +1 -1
  29. package/lib/services/machines.d.ts +1175 -1198
  30. package/lib/services/machines.d.ts.map +1 -1
  31. package/lib/services/machines.js +1297 -1310
  32. package/lib/services/machines.js.map +1 -1
  33. package/lib/services/mpg.d.ts +376 -0
  34. package/lib/services/mpg.d.ts.map +1 -0
  35. package/lib/services/mpg.js +570 -0
  36. package/lib/services/mpg.js.map +1 -0
  37. package/lib/services/sprites.d.ts +321 -0
  38. package/lib/services/sprites.d.ts.map +1 -0
  39. package/lib/services/sprites.js +407 -0
  40. package/lib/services/sprites.js.map +1 -0
  41. package/lib/traits.d.ts +18 -8
  42. package/lib/traits.d.ts.map +1 -1
  43. package/lib/traits.js +13 -3
  44. package/lib/traits.js.map +1 -1
  45. package/package.json +28 -4
  46. package/src/credentials.ts +53 -7
  47. package/src/errors.ts +39 -0
  48. package/src/index.ts +32 -1
  49. package/src/pagination.ts +12 -0
  50. package/src/protocol.ts +747 -34
  51. package/src/services/addons.ts +1313 -0
  52. package/src/services/index.ts +3 -0
  53. package/src/services/machines.ts +2998 -3049
  54. package/src/services/mpg.ts +1188 -0
  55. package/src/services/sprites.ts +917 -0
  56. package/src/traits.ts +37 -3
package/lib/protocol.js CHANGED
@@ -1,41 +1,541 @@
1
1
  /**
2
- * FlyIoProtocol — the shared bearer-REST protocol instantiated for Fly.io.
2
+ * Fly.io protocols — Machines REST, UI-EX REST (MPG), GraphQL add-ons, and
3
+ * Sprites REST.
3
4
  *
4
- * Fly.io's Machines API is a plain bearer-token JSON API with no response
5
- * envelope: 2xx bodies decode directly against the output schema and
6
- * failures answer `{ "error": "..." }` with a meaningful HTTP status. The
7
- * generic machinery (trait-driven request building, status-map error
8
- * matching, retryAfter hints) lives in `@distilled.cloud/core/protocol-rest`;
9
- * this module supplies the Fly.io specifics: credentials → base URL +
10
- * `Authorization: Bearer` header, and the `UnknownFlyIoError` fallback for
11
- * statuses outside the shared map (mirroring v0's `matchError`).
5
+ * Machines (`FlyIoProtocol`) is a plain bearer-token JSON API at
6
+ * `api.machines.dev/v1`. MPG (`FlyApiProtocol`) is the same token against
7
+ * `https://api.fly.io`. GraphQL add-ons (`FlyGraphqlProtocol`) POST
8
+ * `{ query, operationName, variables }` to `https://api.fly.io/graphql`.
9
+ *
10
+ * Sprites (`SpritesProtocol`) also resolve `FLY_API_TOKEN` (same
11
+ * {@link Credentials} as Machines). Sprite CRUD rejects a Fly macaroon as
12
+ * Bearer, so the protocol mints a Sprites bearer once:
13
+ *
14
+ * POST https://api.sprites.dev/v1/organizations/{org}/tokens
15
+ * Authorization: FlyV1 {FLY_API_TOKEN}
16
+ *
17
+ * Org slug comes from Machines `GET /tokens/current` (GraphQL fallback).
18
+ * The minted token is cached process-wide, then sent as
19
+ * `Authorization: Bearer` on sprite ops. There is no `SPRITES_TOKEN`.
12
20
  */
21
+ import * as Context from "effect/Context";
13
22
  import * as Effect from "effect/Effect";
23
+ import * as Layer from "effect/Layer";
24
+ import * as Option from "effect/Option";
14
25
  import * as Redacted from "effect/Redacted";
15
- import { makeRestProtocol } from "@distilled.cloud/core/protocol-rest";
16
- import { Credentials } from "./credentials.js";
17
- import { UnknownFlyIoError } from "./errors.js";
18
- export const FlyIoProtocol = makeRestProtocol({
19
- // Resolve credentials on the calling fiber (per request) — the service
20
- // holds an effect, so rotating tokens Just Work.
21
- credentials: Effect.gen(function* () {
22
- const resolve = yield* Credentials;
23
- return yield* resolve;
24
- }),
26
+ import * as Schema from "effect/Schema";
27
+ import * as HttpClient from "effect/unstable/http/HttpClient";
28
+ import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
29
+ import * as API from "@distilled.cloud/core/api";
30
+ import { makeRestProtocol, unwrapRedactedDeep, wrapSensitive, } from "@distilled.cloud/core/protocol-rest";
31
+ import { buildRequest, getAnn, mapKeys, matchTypedError, } from "@distilled.cloud/core/protocol-http";
32
+ import { HTTP_STATUS_MAP, InternalServerError, } from "@distilled.cloud/core/errors";
33
+ import { parseRetryAfterForStatus } from "@distilled.cloud/core/retry-after";
34
+ import { Credentials, DEFAULT_FLY_API_BASE_URL, DEFAULT_SPRITES_API_BASE_URL, } from "./credentials.js";
35
+ import { ConfigError as FlyConfigError, FlyIoParseError, CreateExtensionTosAgreementNotAuthorized, SpritesNotEnabled, UnknownFlyIoError, } from "./errors.js";
36
+ import { graphqlOpSymbol, httpSymbol, responsePathSymbol, } from "./traits.js";
37
+ const flyErrorEnvelope = (body) => {
38
+ if (body === null || typeof body !== "object")
39
+ return undefined;
40
+ const b = body;
41
+ const errors = b.errors;
42
+ const detail = errors && typeof errors.detail === "string" ? errors.detail : undefined;
43
+ return {
44
+ message: typeof b.error === "string"
45
+ ? b.error
46
+ : typeof b.message === "string"
47
+ ? b.message
48
+ : detail,
49
+ };
50
+ };
51
+ /** Sprites prefers `message` when the body carries both `error` (code) and `message`. */
52
+ const spritesErrorEnvelope = (body) => {
53
+ if (body === null || typeof body !== "object")
54
+ return undefined;
55
+ const b = body;
56
+ const message = typeof b.message === "string"
57
+ ? b.message
58
+ : typeof b.error === "string"
59
+ ? b.error
60
+ : undefined;
61
+ const code = typeof b.error === "string" && typeof b.message === "string"
62
+ ? b.error
63
+ : undefined;
64
+ return { message, code };
65
+ };
66
+ const resolveFlyCreds = Effect.gen(function* () {
67
+ const resolve = yield* Credentials;
68
+ return yield* resolve;
69
+ });
70
+ /**
71
+ * Per-call signal that this Machines request is the Fly Machine itself
72
+ * (unix socket `/.fly/api`). Org tokens stay on {@link Credentials} for
73
+ * GetSecret in the same process; this service only changes headers:
74
+ * omit `Authorization`, send `Connection: close`.
75
+ */
76
+ export class MachineIdentity extends Context.Service()("FlyIoMachineIdentity") {
77
+ }
78
+ const FlyIoProtocolRest = makeRestProtocol({
79
+ credentials: resolveFlyCreds,
25
80
  baseUrl: (creds) => creds.apiBaseUrl,
26
81
  headers: (creds) => ({
27
82
  Authorization: `Bearer ${Redacted.value(creds.apiKey)}`,
28
83
  }),
29
- // Fly.io's error body is `{ "error": string }` — the default lenient
30
- // envelope already reads `error`, but pin it down explicitly.
31
- errorEnvelope: (body) => {
32
- if (body === null || typeof body !== "object")
33
- return undefined;
34
- const b = body;
35
- return {
36
- message: typeof b.error === "string" ? b.error : undefined,
37
- };
38
- },
84
+ errorEnvelope: flyErrorEnvelope,
85
+ unknownError: ({ message, body }) => new UnknownFlyIoError({ message, body }),
86
+ });
87
+ export const FlyIoProtocol = Layer.effect(API.Protocol, Effect.gen(function* () {
88
+ const rest = yield* API.Protocol;
89
+ return API.Protocol.of({
90
+ encode: (args) => Effect.gen(function* () {
91
+ const request = yield* rest.encode(args);
92
+ const machine = yield* Effect.serviceOption(MachineIdentity);
93
+ if (Option.isNone(machine))
94
+ return request;
95
+ return request.pipe(HttpClientRequest.removeHeader("authorization"), HttpClientRequest.setHeader("connection", "close"));
96
+ }),
97
+ decode: rest.decode,
98
+ });
99
+ })).pipe(Layer.provide(FlyIoProtocolRest));
100
+ /** MPG UI-EX REST at `https://api.fly.io` with the Machines bearer token. */
101
+ export const FlyApiProtocol = makeRestProtocol({
102
+ credentials: resolveFlyCreds,
103
+ baseUrl: () => DEFAULT_FLY_API_BASE_URL,
104
+ headers: (creds) => ({
105
+ Authorization: `Bearer ${Redacted.value(creds.apiKey)}`,
106
+ }),
107
+ errorEnvelope: flyErrorEnvelope,
39
108
  unknownError: ({ message, body }) => new UnknownFlyIoError({ message, body }),
40
109
  });
110
+ const parseMaybeNdjson = (body) => {
111
+ if (typeof body !== "string")
112
+ return body;
113
+ const lines = body
114
+ .split(/\r?\n/)
115
+ .map((l) => l.trim())
116
+ .filter((l) => l.length > 0);
117
+ if (lines.length === 0)
118
+ return body;
119
+ try {
120
+ return lines.map((l) => JSON.parse(l));
121
+ }
122
+ catch {
123
+ return body;
124
+ }
125
+ };
126
+ /**
127
+ * HTTP exec (`POST /sprites/{name}/exec`) returns `application/octet-stream`
128
+ * frames: 1-byte stream id + payload. Ids: 1 stdout, 2 stderr, 3 exit
129
+ * (payload is a single exit-code byte). HTTP may coalesce chunks; for a
130
+ * complete body the exit frame is the last two bytes when present.
131
+ */
132
+ const parseSpritesExecFrames = (bytes) => {
133
+ if (bytes.length === 0)
134
+ return undefined;
135
+ const first = bytes[0];
136
+ if (first > 3)
137
+ return undefined;
138
+ let end = bytes.length;
139
+ let exit_code = 0;
140
+ if (end >= 2 && bytes[end - 2] === 3) {
141
+ exit_code = bytes[end - 1];
142
+ end -= 2;
143
+ }
144
+ let stdout = "";
145
+ let stderr = "";
146
+ if (end > 0) {
147
+ const decoder = new TextDecoder();
148
+ const id = bytes[0];
149
+ const payload = decoder.decode(bytes.subarray(1, end));
150
+ if (id === 2)
151
+ stderr = payload;
152
+ else
153
+ stdout = payload;
154
+ }
155
+ return { stdout, stderr, exit_code };
156
+ };
157
+ const fail = (e) => Effect.fail(e);
158
+ /** Strip a leading `FlyV1` / `Bearer` scheme so we can re-prefix `FlyV1`. */
159
+ const stripFlyAuthScheme = (token) => {
160
+ const trimmed = token.trim();
161
+ const space = trimmed.indexOf(" ");
162
+ if (space === -1)
163
+ return trimmed;
164
+ const scheme = trimmed.slice(0, space).toLowerCase();
165
+ if (scheme === "flyv1" || scheme === "bearer") {
166
+ return trimmed.slice(space + 1).trim();
167
+ }
168
+ return trimmed;
169
+ };
170
+ const isMintOp = (http) => http !== undefined &&
171
+ http.method === "POST" &&
172
+ /\/organizations\/\{[^}]+}\/tokens$/.test(http.uri);
173
+ const SPRITES_NOT_ENABLED = /sprites not enabled/i;
174
+ const readResponseText = (response) => response.text.pipe(Effect.orDie, Effect.map((text) => text ?? ""));
175
+ const parseJson = (text) => {
176
+ if (text.trim().length === 0)
177
+ return undefined;
178
+ try {
179
+ return JSON.parse(text);
180
+ }
181
+ catch {
182
+ return undefined;
183
+ }
184
+ };
185
+ const haystackOf = (body, text) => {
186
+ const parts = [text];
187
+ if (body !== null && typeof body === "object") {
188
+ const b = body;
189
+ if (typeof b.message === "string")
190
+ parts.push(b.message);
191
+ if (typeof b.error === "string")
192
+ parts.push(b.error);
193
+ }
194
+ return parts.join(" ");
195
+ };
196
+ const errorEnv = (body) => spritesErrorEnvelope(body) ?? flyErrorEnvelope(body) ?? {};
197
+ const failHttp = (status, body, text, headers) => {
198
+ const env = errorEnv(body);
199
+ const message = env.message ?? (text.trim().length > 0 ? text.trim() : `HTTP ${status}`);
200
+ if (status === 401 && SPRITES_NOT_ENABLED.test(haystackOf(body, message))) {
201
+ return fail(new SpritesNotEnabled({ message }));
202
+ }
203
+ const StatusClass = HTTP_STATUS_MAP[status];
204
+ if (StatusClass && status >= 400) {
205
+ return fail(new StatusClass({
206
+ message,
207
+ retryAfter: parseRetryAfterForStatus(status, headers),
208
+ }));
209
+ }
210
+ return fail(new UnknownFlyIoError({ message, body: body ?? text }));
211
+ };
212
+ const orgFromTokensCurrent = (body) => {
213
+ if (body === null || typeof body !== "object")
214
+ return undefined;
215
+ const tokens = body.tokens;
216
+ if (!Array.isArray(tokens) || tokens.length === 0)
217
+ return undefined;
218
+ const first = tokens[0];
219
+ if (typeof first.org_slug === "string" && first.org_slug.length > 0) {
220
+ return first.org_slug;
221
+ }
222
+ if (typeof first.organization === "string" && first.organization.length > 0) {
223
+ return first.organization;
224
+ }
225
+ return undefined;
226
+ };
227
+ const orgFromGraphql = (body) => {
228
+ if (body === null || typeof body !== "object")
229
+ return undefined;
230
+ const data = body.data;
231
+ if (data === null || typeof data !== "object")
232
+ return undefined;
233
+ const viewer = data.viewer;
234
+ const root = viewer !== null && typeof viewer === "object" ? viewer : data;
235
+ const personal = root
236
+ .personalOrganization;
237
+ if (typeof personal?.slug === "string" && personal.slug.length > 0) {
238
+ return personal.slug;
239
+ }
240
+ const nodes = root.organizations
241
+ ?.nodes;
242
+ if (Array.isArray(nodes)) {
243
+ for (const node of nodes) {
244
+ if (node !== null &&
245
+ typeof node === "object" &&
246
+ typeof node.slug === "string" &&
247
+ node.slug.length > 0) {
248
+ return node.slug;
249
+ }
250
+ }
251
+ }
252
+ return undefined;
253
+ };
254
+ const discoverOrgSlug = (fly) => Effect.gen(function* () {
255
+ const http = yield* HttpClient.HttpClient;
256
+ const token = Redacted.value(fly.apiKey);
257
+ const machinesRoot = fly.apiBaseUrl.replace(/\/+$/, "");
258
+ const currentReq = HttpClientRequest.make("GET")(`${machinesRoot}/tokens/current`).pipe(HttpClientRequest.setHeaders({
259
+ Authorization: `Bearer ${token}`,
260
+ Accept: "application/json",
261
+ }));
262
+ const currentRes = yield* http.execute(currentReq);
263
+ const currentText = yield* readResponseText(currentRes);
264
+ const currentJson = parseJson(currentText);
265
+ if (currentRes.status < 400) {
266
+ const slug = orgFromTokensCurrent(currentJson);
267
+ if (slug !== undefined)
268
+ return slug;
269
+ }
270
+ const gqlReq = HttpClientRequest.make("POST")(`${DEFAULT_FLY_API_BASE_URL}/graphql`).pipe(HttpClientRequest.setHeaders({
271
+ Authorization: `Bearer ${token}`,
272
+ Accept: "application/json",
273
+ }), HttpClientRequest.bodyJsonUnsafe({
274
+ query: "{ viewer { personalOrganization { slug } organizations { nodes { slug } } } }",
275
+ }));
276
+ const gqlRes = yield* http.execute(gqlReq);
277
+ const gqlText = yield* readResponseText(gqlRes);
278
+ const gqlJson = parseJson(gqlText);
279
+ if (gqlRes.status < 400) {
280
+ const slug = orgFromGraphql(gqlJson);
281
+ if (slug !== undefined)
282
+ return slug;
283
+ }
284
+ return yield* new FlyConfigError({
285
+ message: "Could not discover a Fly organization slug from /tokens/current or GraphQL",
286
+ });
287
+ });
288
+ const mintOnce = (fly) => Effect.gen(function* () {
289
+ const http = yield* HttpClient.HttpClient;
290
+ const orgSlug = yield* discoverOrgSlug(fly);
291
+ const macaroon = stripFlyAuthScheme(Redacted.value(fly.apiKey));
292
+ const request = HttpClientRequest.make("POST")(`${DEFAULT_SPRITES_API_BASE_URL}/organizations/${encodeURIComponent(orgSlug)}/tokens`).pipe(HttpClientRequest.setHeaders({
293
+ Authorization: `FlyV1 ${macaroon}`,
294
+ Accept: "application/json",
295
+ "Content-Type": "application/json",
296
+ }), HttpClientRequest.bodyJsonUnsafe({
297
+ description: "Alchemy Sprites token",
298
+ }));
299
+ const response = yield* http.execute(request);
300
+ const text = yield* readResponseText(response);
301
+ const json = parseJson(text);
302
+ const headers = response.headers;
303
+ if (response.status >= 400) {
304
+ return yield* failHttp(response.status, json, text, headers);
305
+ }
306
+ const token = json !== null && typeof json === "object"
307
+ ? json.token
308
+ : undefined;
309
+ if (typeof token !== "string" || token.length === 0) {
310
+ return yield* fail(new FlyIoParseError({
311
+ body: json ?? text,
312
+ cause: "mint response missing token",
313
+ }));
314
+ }
315
+ // Cache the raw string — Effect.cached must not hold a Redacted (the
316
+ // registry entry is not restored from a memoized Exit).
317
+ return token;
318
+ });
319
+ const mintedTokens = new Map();
320
+ const mintInFlight = new Map();
321
+ /** Mint (and process-wide cache) a Sprites bearer from `FLY_API_TOKEN`. */
322
+ const mintSpritesToken = (fly) => Effect.gen(function* () {
323
+ const key = Redacted.value(fly.apiKey);
324
+ const hit = mintedTokens.get(key);
325
+ if (hit !== undefined)
326
+ return hit;
327
+ const pending = mintInFlight.get(key);
328
+ if (pending !== undefined)
329
+ return yield* pending;
330
+ const run = mintOnce(fly).pipe(Effect.tap((token) => Effect.sync(() => {
331
+ mintedTokens.set(key, token);
332
+ mintInFlight.delete(key);
333
+ })), Effect.tapError(() => Effect.sync(() => mintInFlight.delete(key))));
334
+ mintInFlight.set(key, run);
335
+ return yield* run;
336
+ });
337
+ const encodeSpritesRequest = ({ input, inputAst, }) => Effect.gen(function* () {
338
+ const fly = yield* resolveFlyCreds;
339
+ const http = getAnn(inputAst, httpSymbol);
340
+ const mint = isMintOp(http);
341
+ let authorization;
342
+ if (mint) {
343
+ authorization = `FlyV1 ${stripFlyAuthScheme(Redacted.value(fly.apiKey))}`;
344
+ }
345
+ else {
346
+ const token = yield* mintSpritesToken(fly);
347
+ authorization = `Bearer ${token}`;
348
+ }
349
+ return buildRequest({
350
+ input: unwrapRedactedDeep(input),
351
+ inputAst,
352
+ baseUrl: DEFAULT_SPRITES_API_BASE_URL,
353
+ headers: {
354
+ Authorization: authorization,
355
+ Accept: "application/json",
356
+ },
357
+ });
358
+ });
359
+ const decodeSpritesResponse = ({ response, outputAst, errors: errorClasses, }) => Effect.gen(function* () {
360
+ const buffer = yield* response.arrayBuffer.pipe(Effect.map((bytes) => new Uint8Array(bytes)));
361
+ const text = new TextDecoder().decode(buffer);
362
+ const execFrames = parseSpritesExecFrames(buffer);
363
+ let json;
364
+ let nonJson = false;
365
+ if (execFrames === undefined && text.trim().length > 0) {
366
+ try {
367
+ json = JSON.parse(text);
368
+ }
369
+ catch {
370
+ nonJson = true;
371
+ }
372
+ }
373
+ const status = response.status;
374
+ const headers = response.headers;
375
+ if (status >= 400) {
376
+ const env = nonJson ? {} : errorEnv(json);
377
+ const message = env.message ??
378
+ (nonJson && text.trim() ? text.trim() : `HTTP ${status}`);
379
+ if (SPRITES_NOT_ENABLED.test(haystackOf(nonJson ? text : json, message))) {
380
+ return yield* fail(new SpritesNotEnabled({ message }));
381
+ }
382
+ const typed = matchTypedError(errorClasses, status, [
383
+ {
384
+ code: typeof env.code === "number" ? env.code : undefined,
385
+ message,
386
+ },
387
+ ]);
388
+ if (typed !== undefined)
389
+ return yield* fail(typed);
390
+ const StatusErrorClass = HTTP_STATUS_MAP[status];
391
+ if (StatusErrorClass) {
392
+ return yield* fail(new StatusErrorClass({
393
+ message,
394
+ retryAfter: parseRetryAfterForStatus(status, headers),
395
+ }));
396
+ }
397
+ if (status >= 500) {
398
+ return yield* fail(new InternalServerError({
399
+ message,
400
+ retryAfter: parseRetryAfterForStatus(status, headers),
401
+ }));
402
+ }
403
+ return yield* fail(new UnknownFlyIoError({
404
+ message,
405
+ body: nonJson ? text : json,
406
+ }));
407
+ }
408
+ if (execFrames !== undefined) {
409
+ return wrapSensitive(outputAst, mapKeys(outputAst, execFrames, "decode"));
410
+ }
411
+ let body = nonJson ? text : (json ?? {});
412
+ body = parseMaybeNdjson(body);
413
+ return wrapSensitive(outputAst, mapKeys(outputAst, body, "decode"));
414
+ });
415
+ /** Sprites REST at `https://api.sprites.dev/v1`, minted from `FLY_API_TOKEN`. */
416
+ export const SpritesProtocol = Layer.succeed(API.Protocol, API.Protocol.of({
417
+ encode: (args) => encodeSpritesRequest(args),
418
+ decode: (args) => decodeSpritesResponse(args),
419
+ }));
420
+ // =============================================================================
421
+ // GraphQL add-ons (Tigris, Redis) — POST https://api.fly.io/graphql
422
+ // =============================================================================
423
+ const GraphQLError = Schema.Struct({
424
+ message: Schema.String,
425
+ path: Schema.optional(Schema.Array(Schema.Unknown)),
426
+ extensions: Schema.optional(Schema.Struct({
427
+ code: Schema.optional(Schema.String),
428
+ })),
429
+ });
430
+ const GraphQLEnvelope = Schema.Struct({
431
+ data: Schema.optional(Schema.NullOr(Schema.Unknown)),
432
+ errors: Schema.optional(Schema.Array(GraphQLError)),
433
+ });
434
+ const decodeEnvelope = Schema.decodeUnknownOption(GraphQLEnvelope);
435
+ const matchGraphqlError = (status, errorBody, headers, errorClasses) => {
436
+ const envelope = decodeEnvelope(errorBody);
437
+ if (envelope._tag === "Some" && envelope.value.errors?.length) {
438
+ const first = envelope.value.errors[0];
439
+ const message = first.message;
440
+ const typed = matchTypedError(errorClasses, status, [{ message }]);
441
+ if (typed !== undefined)
442
+ return fail(typed);
443
+ if (/not authorized to access this createextensiontosagreement/i.test(message)) {
444
+ return fail(new CreateExtensionTosAgreementNotAuthorized({ message }));
445
+ }
446
+ const StatusClass = HTTP_STATUS_MAP[status];
447
+ if (StatusClass && status >= 400) {
448
+ return fail(new StatusClass({
449
+ message,
450
+ retryAfter: parseRetryAfterForStatus(status, headers),
451
+ }));
452
+ }
453
+ return fail(new UnknownFlyIoError({
454
+ code: first.extensions?.code,
455
+ message,
456
+ body: errorBody,
457
+ }));
458
+ }
459
+ const StatusClass = HTTP_STATUS_MAP[status];
460
+ if (StatusClass && status >= 400) {
461
+ return fail(new StatusClass({
462
+ message: `HTTP ${status}`,
463
+ retryAfter: parseRetryAfterForStatus(status, headers),
464
+ }));
465
+ }
466
+ return fail(new UnknownFlyIoError({ body: errorBody }));
467
+ };
468
+ const graphqlEncode = ({ input, inputAst, }) => Effect.gen(function* () {
469
+ const resolveCredentials = yield* Credentials;
470
+ const creds = yield* resolveCredentials;
471
+ const op = getAnn(inputAst, graphqlOpSymbol);
472
+ if (!op) {
473
+ throw new Error("operation input is missing the GraphQLOp() trait");
474
+ }
475
+ const http = getAnn(inputAst, httpSymbol);
476
+ const variables = {};
477
+ for (const [k, v] of Object.entries((input ?? {}))) {
478
+ if (v !== undefined)
479
+ variables[k] = v;
480
+ }
481
+ const url = `${DEFAULT_FLY_API_BASE_URL}${http?.uri ?? "/graphql"}`;
482
+ return HttpClientRequest.make("POST")(url).pipe(HttpClientRequest.setHeaders({
483
+ Authorization: `Bearer ${Redacted.value(creds.apiKey)}`,
484
+ Accept: "application/json",
485
+ }), HttpClientRequest.bodyJsonUnsafe({
486
+ query: op.query,
487
+ operationName: op.operationName,
488
+ variables,
489
+ }));
490
+ });
491
+ const graphqlDecode = ({ response, outputAst, errors, }) => Effect.gen(function* () {
492
+ const text = (yield* response.text.pipe(Effect.orDie)) ?? "";
493
+ const status = response.status;
494
+ const headers = response.headers;
495
+ let json;
496
+ let parsed = false;
497
+ if (text.trim().length > 0) {
498
+ try {
499
+ json = JSON.parse(text);
500
+ parsed = true;
501
+ }
502
+ catch {
503
+ parsed = false;
504
+ }
505
+ }
506
+ if (!parsed) {
507
+ if (status >= 400) {
508
+ return yield* matchGraphqlError(status, text, headers, errors);
509
+ }
510
+ return yield* fail(new FlyIoParseError({
511
+ body: text,
512
+ cause: "response body is not valid JSON",
513
+ }));
514
+ }
515
+ const envelope = json;
516
+ const hasGraphQLErrors = envelope !== null &&
517
+ typeof envelope === "object" &&
518
+ Array.isArray(envelope.errors) &&
519
+ envelope.errors.length > 0;
520
+ if (hasGraphQLErrors || status >= 400) {
521
+ return yield* matchGraphqlError(status, json, headers, errors);
522
+ }
523
+ const path = getAnn(outputAst, responsePathSymbol);
524
+ let payload = envelope !== null && typeof envelope === "object"
525
+ ? envelope.data
526
+ : undefined;
527
+ if (path !== undefined) {
528
+ for (const seg of path.split(".")) {
529
+ payload =
530
+ payload !== null && typeof payload === "object"
531
+ ? payload[seg]
532
+ : undefined;
533
+ }
534
+ }
535
+ return payload === undefined ? null : payload;
536
+ });
537
+ export const FlyGraphqlProtocol = Layer.succeed(API.Protocol, API.Protocol.of({
538
+ encode: (args) => graphqlEncode(args),
539
+ decode: graphqlDecode,
540
+ }));
41
541
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAgBpE,MAAM,CAAC,MAAM,aAAa,GACxB,gBAAgB,CAAS;IACvB,uEAAuE;IACvE,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnB,aAAa,EAAE,UAAU,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KACxD,CAAC;IACF,qEAAqE;IACrE,8DAA8D;IAC9D,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QACtB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChE,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC3D,CAAC;IACJ,CAAC;IACD,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAClC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;CAC3C,CAAC,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}