@distilled.cloud/customerio 0.0.0 → 1.0.0-rc.9

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 (47) hide show
  1. package/LICENSE +201 -0
  2. package/lib/credentials.d.ts +29 -0
  3. package/lib/credentials.d.ts.map +1 -0
  4. package/lib/credentials.js +35 -0
  5. package/lib/credentials.js.map +1 -0
  6. package/lib/errors.d.ts +36 -0
  7. package/lib/errors.d.ts.map +1 -0
  8. package/lib/errors.js +26 -0
  9. package/lib/errors.js.map +1 -0
  10. package/lib/index.d.ts +24 -0
  11. package/lib/index.d.ts.map +1 -0
  12. package/lib/index.js +28 -0
  13. package/lib/index.js.map +1 -0
  14. package/lib/pagination.d.ts +9 -0
  15. package/lib/pagination.d.ts.map +1 -0
  16. package/lib/pagination.js +9 -0
  17. package/lib/pagination.js.map +1 -0
  18. package/lib/protocol.d.ts +18 -0
  19. package/lib/protocol.d.ts.map +1 -0
  20. package/lib/protocol.js +84 -0
  21. package/lib/protocol.js.map +1 -0
  22. package/lib/retry.d.ts +32 -0
  23. package/lib/retry.d.ts.map +1 -0
  24. package/lib/retry.js +32 -0
  25. package/lib/retry.js.map +1 -0
  26. package/lib/services/customerio.d.ts +16370 -0
  27. package/lib/services/customerio.d.ts.map +1 -0
  28. package/lib/services/customerio.js +12603 -0
  29. package/lib/services/customerio.js.map +1 -0
  30. package/lib/services/index.d.ts +2 -0
  31. package/lib/services/index.d.ts.map +1 -0
  32. package/lib/services/index.js +3 -0
  33. package/lib/services/index.js.map +1 -0
  34. package/lib/traits.d.ts +11 -0
  35. package/lib/traits.d.ts.map +1 -0
  36. package/lib/traits.js +11 -0
  37. package/lib/traits.js.map +1 -0
  38. package/package.json +77 -6
  39. package/src/credentials.ts +57 -0
  40. package/src/errors.ts +50 -0
  41. package/src/index.ts +37 -0
  42. package/src/pagination.ts +8 -0
  43. package/src/protocol.ts +114 -0
  44. package/src/retry.ts +56 -0
  45. package/src/services/customerio.ts +38497 -0
  46. package/src/services/index.ts +2 -0
  47. package/src/traits.ts +44 -0
@@ -0,0 +1,2 @@
1
+ export * as customerio from "./customerio.ts";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // AUTO-GENERATED by scripts/generate.ts. Do not edit.
2
+ export * as customerio from "./customerio.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Customer.io SDK trait surface — hand-written.
3
+ *
4
+ * Re-exports the generic protocol traits from core (so generated operations
5
+ * import everything from one place). Customer.io has no envelope of its own;
6
+ * the REST-protocol traits (SensitiveValue / RawResponse) come from
7
+ * `core/protocol-rest`.
8
+ */
9
+ export { Body, Header, Query, Label, Http, ResponseCode, HttpBody, FormDataFile, KeyDictionary, UnionCases, applyErrorMatchers, getErrorMatchers, type HttpTrait, type ErrorMatcher, bodySymbol, headerSymbol, querySymbol, labelSymbol, httpSymbol, responseCodeSymbol, httpBodySymbol, formDataFileSymbol, keyDictionarySymbol, unionCasesSymbol, errorMatchersSymbol, } from "@distilled.cloud/core/trait";
10
+ export { SensitiveValue, RawResponse, RawResponseRoot, sensitiveValueSymbol, rawResponseSymbol, rawResponseRootSymbol, } from "@distilled.cloud/core/protocol-rest";
11
+ //# sourceMappingURL=traits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traits.d.ts","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC"}
package/lib/traits.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Customer.io SDK trait surface — hand-written.
3
+ *
4
+ * Re-exports the generic protocol traits from core (so generated operations
5
+ * import everything from one place). Customer.io has no envelope of its own;
6
+ * the REST-protocol traits (SensitiveValue / RawResponse) come from
7
+ * `core/protocol-rest`.
8
+ */
9
+ export { Body, Header, Query, Label, Http, ResponseCode, HttpBody, FormDataFile, KeyDictionary, UnionCases, applyErrorMatchers, getErrorMatchers, bodySymbol, headerSymbol, querySymbol, labelSymbol, httpSymbol, responseCodeSymbol, httpBodySymbol, formDataFileSymbol, keyDictionarySymbol, unionCasesSymbol, errorMatchersSymbol, } from "@distilled.cloud/core/trait";
10
+ export { SensitiveValue, RawResponse, RawResponseRoot, sensitiveValueSymbol, rawResponseSymbol, rawResponseRootSymbol, } from "@distilled.cloud/core/protocol-rest";
11
+ //# sourceMappingURL=traits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traits.js","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAGhB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,85 @@
1
1
  {
2
2
  "name": "@distilled.cloud/customerio",
3
- "version": "0.0.0",
4
- "description": "Placeholder package for an upcoming distilled SDK.",
5
- "license": "Apache-2.0",
3
+ "version": "1.0.0-rc.9",
6
4
  "repository": {
7
5
  "type": "git",
8
6
  "url": "https://github.com/alchemy-run/distilled",
9
7
  "directory": "packages/customerio"
10
8
  },
11
- "publishConfig": {
12
- "access": "public"
9
+ "license": "Apache-2.0",
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "files": [
13
+ "lib",
14
+ "src"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "types": "./lib/index.d.ts",
19
+ "bun": "./src/index.ts",
20
+ "worker": "./src/index.ts",
21
+ "default": "./lib/index.js"
22
+ },
23
+ "./Credentials": {
24
+ "types": "./lib/credentials.d.ts",
25
+ "bun": "./src/credentials.ts",
26
+ "worker": "./src/credentials.ts",
27
+ "default": "./lib/credentials.js"
28
+ },
29
+ "./Errors": {
30
+ "types": "./lib/errors.d.ts",
31
+ "bun": "./src/errors.ts",
32
+ "worker": "./src/errors.ts",
33
+ "default": "./lib/errors.js"
34
+ },
35
+ "./Traits": {
36
+ "types": "./lib/traits.d.ts",
37
+ "bun": "./src/traits.ts",
38
+ "worker": "./src/traits.ts",
39
+ "default": "./lib/traits.js"
40
+ },
41
+ "./Pagination": {
42
+ "types": "./lib/pagination.d.ts",
43
+ "bun": "./src/pagination.ts",
44
+ "worker": "./src/pagination.ts",
45
+ "default": "./lib/pagination.js"
46
+ },
47
+ "./Protocol": {
48
+ "types": "./lib/protocol.d.ts",
49
+ "bun": "./src/protocol.ts",
50
+ "worker": "./src/protocol.ts",
51
+ "default": "./lib/protocol.js"
52
+ },
53
+ "./Retry": {
54
+ "types": "./lib/retry.d.ts",
55
+ "bun": "./src/retry.ts",
56
+ "worker": "./src/retry.ts",
57
+ "default": "./lib/retry.js"
58
+ },
59
+ "./*": {
60
+ "types": "./lib/services/*.d.ts",
61
+ "bun": "./src/services/*.ts",
62
+ "worker": "./src/services/*.ts",
63
+ "default": "./lib/services/*.js"
64
+ }
65
+ },
66
+ "dependencies": {
67
+ "@distilled.cloud/core": "1.0.0-rc.9"
68
+ },
69
+ "devDependencies": {
70
+ "@types/bun": "latest",
71
+ "@types/node": "latest",
72
+ "@effect/platform-bun": ">=4.0.0-rc.112 || >=4.0.0"
73
+ },
74
+ "peerDependencies": {
75
+ "effect": ">=4.0.0-rc.112 || >=4.0.0"
76
+ },
77
+ "scripts": {
78
+ "build": "tsc -b",
79
+ "convert": "bun scripts/convert.ts",
80
+ "generate": "bun scripts/convert.ts && bun scripts/generate.ts",
81
+ "typecheck": "tsc -p tsconfig.json",
82
+ "specs:fetch": "git submodule update --force --init --depth=1 specs/spec-mirror-customerio",
83
+ "specs:update": "git submodule update --remote --force --depth=1 specs/spec-mirror-customerio"
13
84
  }
14
- }
85
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Customer.io credentials — hand-written.
3
+ *
4
+ * The `Credentials` service holds an *effect* that resolves the current
5
+ * credentials on every request (the protocol layer resolves it per request
6
+ * on the calling fiber). The Journeys App API authenticates with an App API
7
+ * Key as `Authorization: Bearer <apiKey>`.
8
+ */
9
+ import * as Context from "effect/Context";
10
+ import * as Effect from "effect/Effect";
11
+ import * as Layer from "effect/Layer";
12
+ import * as Redacted from "effect/Redacted";
13
+ import { ConfigError } from "@distilled.cloud/core/errors";
14
+
15
+ export const DEFAULT_API_BASE_URL = "https://api.customer.io";
16
+
17
+ export interface Config {
18
+ readonly apiKey: Redacted.Redacted<string>;
19
+ readonly apiBaseUrl: string;
20
+ }
21
+
22
+ export class Credentials extends Context.Service<
23
+ Credentials,
24
+ Effect.Effect<Config>
25
+ >()("CustomerioCredentials") {}
26
+
27
+ /** Layer from a plain App API key + optional base URL (EU: https://api-eu.customer.io). */
28
+ export const fromApiKey = (config: {
29
+ readonly apiKey: string;
30
+ readonly apiBaseUrl?: string;
31
+ }): Layer.Layer<Credentials> =>
32
+ Layer.succeed(
33
+ Credentials,
34
+ Effect.succeed({
35
+ apiKey: Redacted.make(config.apiKey),
36
+ apiBaseUrl: config.apiBaseUrl ?? DEFAULT_API_BASE_URL,
37
+ }),
38
+ );
39
+
40
+ /** Reads CUSTOMERIO_API_KEY (required) and CUSTOMERIO_API_BASE_URL (optional). */
41
+ export const CredentialsFromEnv: Layer.Layer<Credentials> = Layer.succeed(
42
+ Credentials,
43
+ Effect.gen(function* () {
44
+ const apiKey = process.env.CUSTOMERIO_API_KEY;
45
+
46
+ if (!apiKey) {
47
+ return yield* new ConfigError({
48
+ message: "CUSTOMERIO_API_KEY environment variable is required",
49
+ });
50
+ }
51
+
52
+ return {
53
+ apiKey: Redacted.make(apiKey),
54
+ apiBaseUrl: process.env.CUSTOMERIO_API_BASE_URL ?? DEFAULT_API_BASE_URL,
55
+ };
56
+ }).pipe(Effect.orDie),
57
+ );
package/src/errors.ts ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Customer.io-specific error types.
3
+ *
4
+ * Re-exports the common HTTP errors from core and adds the Customer.io
5
+ * fallback errors. Note the generated service module additionally defines
6
+ * its own per-status matcher classes (BadRequest/NotFound/…) for the
7
+ * statuses each operation declares — those share `_tag`s with the core
8
+ * classes here, so `catchTag` works against either.
9
+ */
10
+ export {
11
+ BadGateway,
12
+ BadRequest,
13
+ Conflict,
14
+ ConfigError,
15
+ Forbidden,
16
+ GatewayTimeout,
17
+ InternalServerError,
18
+ Locked,
19
+ NotFound,
20
+ ServiceUnavailable,
21
+ TooManyRequests,
22
+ Unauthorized,
23
+ UnprocessableEntity,
24
+ HTTP_STATUS_MAP,
25
+ DEFAULT_ERRORS,
26
+ API_ERRORS,
27
+ } from "@distilled.cloud/core/errors";
28
+ export type { DefaultErrors } from "@distilled.cloud/core/errors";
29
+
30
+ import * as Schema from "effect/Schema";
31
+ import * as Category from "@distilled.cloud/core/category";
32
+
33
+ /** Unknown Customer.io error — returned when nothing else matches the failure. */
34
+ export class UnknownCustomerioError extends Schema.TaggedError<UnknownCustomerioError>()(
35
+ "UnknownCustomerioError",
36
+ {
37
+ code: Schema.optional(Schema.String),
38
+ message: Schema.optional(Schema.String),
39
+ body: Schema.Unknown,
40
+ },
41
+ ).pipe(Category.withServerError) {}
42
+
43
+ /** Schema parse error wrapper. */
44
+ export class CustomerioParseError extends Schema.TaggedError<CustomerioParseError>()(
45
+ "CustomerioParseError",
46
+ {
47
+ body: Schema.Unknown,
48
+ cause: Schema.Unknown,
49
+ },
50
+ ).pipe(Category.withParseError) {}
package/src/index.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @distilled.cloud/customerio — Customer.io SDK for Effect.
3
+ *
4
+ * `./services` is generated by `scripts/generate.ts` from the Smithy models
5
+ * in `.generated-specs` (written by `scripts/convert.ts` from the OpenAPI
6
+ * specs). Everything else in this folder is hand-written.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import * as Customerio from "@distilled.cloud/customerio";
11
+ *
12
+ * const campaigns = yield* Customerio.Services.customerio.listCampaigns({});
13
+ * ```
14
+ */
15
+ export * from "./credentials.ts";
16
+ export * from "./errors.ts";
17
+ export * as T from "./traits.ts";
18
+ export {
19
+ CustomerioProtocol,
20
+ type CustomerioOpError,
21
+ type CustomerioOpContext,
22
+ } from "./protocol.ts";
23
+ export { paginateCursor } from "./pagination.ts";
24
+ export * as Retry from "./retry.ts";
25
+ export * as Services from "./services/index.ts";
26
+ // Operations (and their request/response types) are importable straight off
27
+ // the package root. The service-local typed error classes shadow the
28
+ // same-named shared ones from ./errors.ts — the ops actually raise the
29
+ // service-local classes.
30
+ export * from "./services/customerio.ts";
31
+ export {
32
+ BadRequest,
33
+ Conflict,
34
+ Forbidden,
35
+ NotFound,
36
+ UnprocessableEntity,
37
+ } from "./services/customerio.ts";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Customer.io pagination — hand-written.
3
+ *
4
+ * Paginated list operations that the converter stamps as cursor-mode
5
+ * (`cursor` in, `pagination.cursor` out) pass core's {@link paginateCursor}
6
+ * strategy to `API.makePaginated`.
7
+ */
8
+ export { paginateCursor } from "@distilled.cloud/core/pagination";
@@ -0,0 +1,114 @@
1
+ /**
2
+ * CustomerioProtocol — hand-written.
3
+ *
4
+ * Customer.io's Journeys App API speaks bearer-authenticated JSON REST (no
5
+ * response envelope), so the protocol is one `makeRestProtocol` call from
6
+ * `core/protocol-rest`:
7
+ *
8
+ * request: credentials → `Authorization: Bearer <apiKey>` + base URL
9
+ * (default https://api.customer.io; EU is
10
+ * https://api-eu.customer.io), resolved from the calling fiber
11
+ * on every request
12
+ *
13
+ * response: 2xx JSON is the payload (sensitive members delivered as
14
+ * `Redacted`); non-2xx `{ errors: [{ detail }] }` /
15
+ * `{ meta: { errors } }` bodies map to the operation's typed
16
+ * error classes by status, then the shared HTTP-status classes,
17
+ * then {@link UnknownCustomerioError}.
18
+ */
19
+ import * as Effect from "effect/Effect";
20
+ import type * as Layer from "effect/Layer";
21
+ import * as Redacted from "effect/Redacted";
22
+ import type * as HttpClient from "effect/unstable/http/HttpClient";
23
+ import type * as HttpClientError from "effect/unstable/http/HttpClientError";
24
+ import type * as API from "@distilled.cloud/core/api";
25
+ import {
26
+ makeRestProtocol,
27
+ type RestErrorEnvelope,
28
+ } from "@distilled.cloud/core/protocol-rest";
29
+ import type { API_ERRORS, ConfigError } from "@distilled.cloud/core/errors";
30
+ import { Credentials, type Config } from "./credentials.ts";
31
+ import { UnknownCustomerioError } from "./errors.ts";
32
+
33
+ /**
34
+ * Error channel shared by every generated Customer.io operation. Generated
35
+ * service files annotate operations with `API.OperationMethod<I, O,
36
+ * CustomerioOpError, CustomerioOpContext>` explicitly so the compiler never
37
+ * infers these back out of the schema generics.
38
+ */
39
+ export type CustomerioOpError =
40
+ | InstanceType<(typeof API_ERRORS)[number]>
41
+ | UnknownCustomerioError
42
+ | ConfigError
43
+ | HttpClientError.HttpClientError;
44
+
45
+ /** Context (requirements) shared by every generated Customer.io operation. */
46
+ export type CustomerioOpContext = Credentials | HttpClient.HttpClient;
47
+
48
+ /**
49
+ * Customer.io error bodies are one of:
50
+ * `{ errors: [{ detail, status, meta? }] }`
51
+ * `{ meta: { errors: string[] } }`
52
+ * `{ message }` / `{ error }`
53
+ */
54
+ const errorEnvelope = (body: unknown): RestErrorEnvelope | undefined => {
55
+ if (body === null || typeof body !== "object") return undefined;
56
+ const b = body as Record<string, unknown>;
57
+ const errors = Array.isArray(b.errors) ? b.errors : undefined;
58
+ const first =
59
+ errors !== undefined && errors.length > 0 && typeof errors[0] === "object"
60
+ ? (errors[0] as Record<string, unknown>)
61
+ : undefined;
62
+ const meta =
63
+ b.meta !== null && typeof b.meta === "object"
64
+ ? (b.meta as Record<string, unknown>)
65
+ : undefined;
66
+ const metaErrors = Array.isArray(meta?.errors) ? meta.errors : undefined;
67
+ const message =
68
+ typeof first?.detail === "string"
69
+ ? first.detail
70
+ : typeof first?.message === "string"
71
+ ? first.message
72
+ : typeof metaErrors?.[0] === "string"
73
+ ? metaErrors[0]
74
+ : typeof b.message === "string"
75
+ ? b.message
76
+ : typeof b.error === "string"
77
+ ? b.error
78
+ : undefined;
79
+ const code =
80
+ typeof first?.status === "number" || typeof first?.status === "string"
81
+ ? first.status
82
+ : typeof first?.code === "string" || typeof first?.code === "number"
83
+ ? first.code
84
+ : typeof b.code === "string" || typeof b.code === "number"
85
+ ? b.code
86
+ : undefined;
87
+ return { code, message };
88
+ };
89
+
90
+ export const CustomerioProtocol: Layer.Layer<API.Protocol> =
91
+ makeRestProtocol<Config>({
92
+ // The Credentials service holds an effect — resolving it here (per
93
+ // request, on the calling fiber) picks up context-provided credentials.
94
+ credentials: Effect.gen(function* () {
95
+ const resolve = yield* Credentials;
96
+ return yield* resolve;
97
+ }),
98
+ baseUrl: (creds) => creds.apiBaseUrl,
99
+ headers: (creds) => ({
100
+ Authorization: `Bearer ${Redacted.value(creds.apiKey)}`,
101
+ }),
102
+ errorEnvelope,
103
+ unknownError: ({ code, message, body }) =>
104
+ new UnknownCustomerioError({
105
+ code:
106
+ typeof code === "string"
107
+ ? code
108
+ : code !== undefined
109
+ ? String(code)
110
+ : undefined,
111
+ message,
112
+ body,
113
+ }),
114
+ });
package/src/retry.ts ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Customer.io retry configuration.
3
+ *
4
+ * Defines the per-SDK `Retry` Context.Service tag that generated operations
5
+ * wire into `API.make`. Callers can install a blanket retry policy at the
6
+ * layer level and have every Customer.io API call below it pick it up:
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import * as Customerio from "@distilled.cloud/customerio";
11
+ *
12
+ * myEffect.pipe(Customerio.Retry.transient);
13
+ * Effect.provide(myEffect, Layer.succeed(Customerio.Retry.Retry, customPolicy));
14
+ * ```
15
+ */
16
+ import * as Context from "effect/Context";
17
+ import * as Effect from "effect/Effect";
18
+ import * as Layer from "effect/Layer";
19
+ import {
20
+ type Policy,
21
+ throttlingFactory,
22
+ transientFactory,
23
+ } from "@distilled.cloud/core/retry";
24
+
25
+ export {
26
+ type Options,
27
+ type Factory,
28
+ type Policy,
29
+ makeDefault,
30
+ jittered,
31
+ capped,
32
+ throttlingOptions,
33
+ transientOptions,
34
+ throttlingFactory,
35
+ transientFactory,
36
+ } from "@distilled.cloud/core/retry";
37
+
38
+ /** Context tag for configuring retry behavior of Customer.io API calls. */
39
+ export class Retry extends Context.Service<Retry, Policy>()(
40
+ "CustomerioRetry",
41
+ ) {}
42
+
43
+ /** Provides a custom retry policy to every Customer.io API call below it. */
44
+ export const policy = (optionsOrFactory: Policy) =>
45
+ Effect.provide(Layer.succeed(Retry, optionsOrFactory));
46
+
47
+ /** Disables all automatic retries. */
48
+ export const none = Effect.provide(
49
+ Layer.succeed(Retry, { while: () => false }),
50
+ );
51
+
52
+ /** Apply the throttling retry policy (retries throttling errors indefinitely). */
53
+ export const throttling = policy(throttlingFactory);
54
+
55
+ /** Apply the transient retry policy (retries all transient errors indefinitely). */
56
+ export const transient = policy(transientFactory);