@ontemper/sdk 0.1.0-rc.1 → 0.2.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 (96) hide show
  1. package/README.md +92 -22
  2. package/dist/AxiosError.d.ts +46 -0
  3. package/dist/AxiosError.d.ts.map +1 -0
  4. package/dist/AxiosError.js +118 -0
  5. package/dist/AxiosError.js.map +1 -0
  6. package/dist/Contract/Invocation.d.ts +21 -0
  7. package/dist/Contract/Invocation.d.ts.map +1 -0
  8. package/dist/Contract/Invocation.js +2 -0
  9. package/dist/Contract/Invocation.js.map +1 -0
  10. package/dist/Contract/Manifest.d.ts +125 -0
  11. package/dist/Contract/Manifest.d.ts.map +1 -0
  12. package/dist/Contract/Manifest.js +59 -0
  13. package/dist/Contract/Manifest.js.map +1 -0
  14. package/dist/Contract/RuntimeApi.d.ts +143 -0
  15. package/dist/Contract/RuntimeApi.d.ts.map +1 -0
  16. package/dist/Contract/RuntimeApi.js +148 -0
  17. package/dist/Contract/RuntimeApi.js.map +1 -0
  18. package/dist/Contract/index.d.ts +4 -0
  19. package/dist/Contract/index.d.ts.map +1 -0
  20. package/dist/Contract/index.js +3 -0
  21. package/dist/Contract/index.js.map +1 -0
  22. package/dist/Correlation.d.ts +33 -0
  23. package/dist/Correlation.d.ts.map +1 -0
  24. package/dist/Correlation.js +57 -0
  25. package/dist/Correlation.js.map +1 -0
  26. package/dist/HttpApiResource.d.ts +32 -0
  27. package/dist/HttpApiResource.d.ts.map +1 -0
  28. package/dist/HttpApiResource.js +35 -0
  29. package/dist/HttpApiResource.js.map +1 -0
  30. package/dist/HttpClient.d.ts +10 -0
  31. package/dist/HttpClient.d.ts.map +1 -0
  32. package/dist/HttpClient.js +167 -0
  33. package/dist/HttpClient.js.map +1 -0
  34. package/dist/HttpPayload.d.ts +9 -0
  35. package/dist/HttpPayload.d.ts.map +1 -0
  36. package/dist/HttpPayload.js +32 -0
  37. package/dist/HttpPayload.js.map +1 -0
  38. package/dist/Invocation.d.ts +1 -20
  39. package/dist/Invocation.d.ts.map +1 -1
  40. package/dist/Invocation.js.map +1 -1
  41. package/dist/LogContext.d.ts +59 -0
  42. package/dist/LogContext.d.ts.map +1 -0
  43. package/dist/LogContext.js +47 -0
  44. package/dist/LogContext.js.map +1 -0
  45. package/dist/Logger.d.ts +3 -3
  46. package/dist/Logger.d.ts.map +1 -1
  47. package/dist/Logger.js +305 -37
  48. package/dist/Logger.js.map +1 -1
  49. package/dist/Manifest.d.ts +4 -16
  50. package/dist/Manifest.d.ts.map +1 -1
  51. package/dist/Manifest.js +65 -4
  52. package/dist/Manifest.js.map +1 -1
  53. package/dist/Middleware.d.ts +5 -2
  54. package/dist/Middleware.d.ts.map +1 -1
  55. package/dist/Middleware.js +278 -27
  56. package/dist/Middleware.js.map +1 -1
  57. package/dist/Redaction.d.ts +27 -0
  58. package/dist/Redaction.d.ts.map +1 -0
  59. package/dist/Redaction.js +149 -0
  60. package/dist/Redaction.js.map +1 -0
  61. package/dist/Resource.d.ts +66 -0
  62. package/dist/Resource.d.ts.map +1 -0
  63. package/dist/Resource.js +57 -0
  64. package/dist/Resource.js.map +1 -0
  65. package/dist/ResourcesErrors.d.ts +36 -0
  66. package/dist/ResourcesErrors.d.ts.map +1 -0
  67. package/dist/ResourcesErrors.js +27 -0
  68. package/dist/ResourcesErrors.js.map +1 -0
  69. package/dist/ResourcesToken.d.ts +10 -0
  70. package/dist/ResourcesToken.d.ts.map +1 -0
  71. package/dist/ResourcesToken.js +63 -0
  72. package/dist/ResourcesToken.js.map +1 -0
  73. package/dist/RuntimeResources.d.ts +26 -0
  74. package/dist/RuntimeResources.d.ts.map +1 -0
  75. package/dist/RuntimeResources.js +115 -0
  76. package/dist/RuntimeResources.js.map +1 -0
  77. package/dist/Trigger.d.ts +1 -26
  78. package/dist/Trigger.d.ts.map +1 -1
  79. package/dist/Trigger.js +1 -24
  80. package/dist/Trigger.js.map +1 -1
  81. package/dist/Workflow.d.ts +26 -9
  82. package/dist/Workflow.d.ts.map +1 -1
  83. package/dist/Workflow.js +48 -12
  84. package/dist/Workflow.js.map +1 -1
  85. package/dist/cli.d.ts.map +1 -1
  86. package/dist/cli.js +193 -41
  87. package/dist/cli.js.map +1 -1
  88. package/dist/index.d.ts +15 -4
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +12 -2
  91. package/dist/index.js.map +1 -1
  92. package/dist/testing.d.ts +34 -2
  93. package/dist/testing.d.ts.map +1 -1
  94. package/dist/testing.js +35 -0
  95. package/dist/testing.js.map +1 -1
  96. package/package.json +6 -2
@@ -0,0 +1,167 @@
1
+ import { Cause, Effect, Exit, Layer, Option, Stream } from 'effect';
2
+ import { HttpClient, HttpClientError, HttpClientRequest, HttpClientResponse, } from 'effect/unstable/http';
3
+ import { LegacyAxiosErrorFormat, STREAM_ABORTED, toAxiosError, toAxiosErrorJson, } from './AxiosError.js';
4
+ import { bodyOf, safeJsonParse } from './HttpPayload.js';
5
+ import { CurrentLogContext, logSpan, TRACE_HEADER, } from './LogContext.js';
6
+ /** Legacy `traceAxios` sends the request trace id; a 128-bit id also travels as W3C `traceparent`. */
7
+ const withTrace = (request, context) => {
8
+ if (context === undefined)
9
+ return request;
10
+ const traced = HttpClientRequest.setHeader(request, TRACE_HEADER, context.traceId);
11
+ const traceHex = context.traceId.replaceAll('-', '').toLowerCase();
12
+ if (request.headers.traceparent !== undefined || !/^[0-9a-f]{32}$/.test(traceHex) || /^0+$/.test(traceHex)) {
13
+ return traced;
14
+ }
15
+ const parentId = Array.from(crypto.getRandomValues(new Uint8Array(8)), (byte) => byte.toString(16).padStart(2, '0'));
16
+ return HttpClientRequest.setHeader(traced, 'traceparent', `00-${traceHex}-${parentId.join('')}-01`);
17
+ };
18
+ const fetchBody = (body) => {
19
+ switch (body._tag) {
20
+ case 'Raw':
21
+ // SAFETY: a raw body goes to fetch as-is, exactly as `FetchHttpClient` sends it.
22
+ return Effect.succeed(body.body);
23
+ case 'Uint8Array':
24
+ // SAFETY: fetch sends any byte view; lib.dom narrows `BodyInit` to ArrayBuffer-backed views.
25
+ return Effect.succeed(body.body);
26
+ case 'FormData':
27
+ return Effect.succeed(body.formData);
28
+ case 'Stream':
29
+ return Stream.toReadableStreamEffect(body.stream);
30
+ case 'Empty':
31
+ return Effect.succeed(undefined);
32
+ }
33
+ };
34
+ const send = (outboundFetch, request, url, signal) => Effect.flatMap(fetchBody(request.body), (body) => {
35
+ // A stream body must be sent half-duplex.
36
+ const init = {
37
+ method: request.method,
38
+ headers: { ...request.headers },
39
+ body,
40
+ signal,
41
+ duplex: body instanceof ReadableStream ? 'half' : undefined,
42
+ };
43
+ return Effect.tryPromise({
44
+ try: () => outboundFetch(url, init),
45
+ catch: (cause) => new HttpClientError.HttpClientError({ reason: new HttpClientError.TransportError({ request, cause }) }),
46
+ });
47
+ });
48
+ /**
49
+ * The response a span line logs: the one received, or for a failed call the one on axios's error, as
50
+ * legacy `traceAxios` took it. axios 1.16 kept an aborted stream's response on the error; axios before
51
+ * 1.13 kept none.
52
+ */
53
+ const responseOf = (exit, format) => {
54
+ if (exit === undefined)
55
+ return undefined;
56
+ if (Exit.isSuccess(exit)) {
57
+ const { response, body } = exit.value;
58
+ return { headers: { ...response.headers }, status: response.status, body };
59
+ }
60
+ const error = Cause.squash(exit.cause);
61
+ if (format === 'toJSON' || !HttpClientError.isHttpClientError(error) || error.response === undefined)
62
+ return undefined;
63
+ return { headers: { ...error.response.headers }, status: error.response.status };
64
+ };
65
+ /** Legacy `buildOutgoingHttpPayload` (sdk/logger/src/axios.ts:48-70): the query leaves the logged URL. */
66
+ const outgoingOf = (request, response) => {
67
+ const url = Option.getOrUndefined(HttpClientRequest.toUrl(request));
68
+ // Axios merged `params` over the URL's own query, so the last value of a repeated key wins.
69
+ const query = url === undefined ? {} : Object.fromEntries(url.searchParams);
70
+ if (url !== undefined)
71
+ url.search = '';
72
+ return {
73
+ type: 'http',
74
+ http: {
75
+ url: url?.toString() ?? request.url,
76
+ query: Object.keys(query).length > 0 ? query : undefined,
77
+ method: request.method.toLowerCase(),
78
+ incoming: false,
79
+ request: { headers: { ...request.headers }, body: bodyOf(request.body) },
80
+ response,
81
+ },
82
+ };
83
+ };
84
+ /**
85
+ * Legacy axios rejected every non-2xx status, so the span ends `failed`, logging the error axios raised
86
+ * in the shape `toError` gives.
87
+ */
88
+ const failureOf = (exit, toError) => {
89
+ if (Exit.isFailure(exit)) {
90
+ const error = Cause.squash(exit.cause);
91
+ return Option.some(HttpClientError.isHttpClientError(error) ? toError(error) : error);
92
+ }
93
+ const { response } = exit.value;
94
+ if (response.status >= 200 && response.status < 300)
95
+ return Option.none();
96
+ return Option.some(toError(new HttpClientError.HttpClientError({
97
+ reason: new HttpClientError.StatusCodeError({
98
+ request: response.request,
99
+ response,
100
+ description: 'non 2xx status code',
101
+ }),
102
+ })));
103
+ };
104
+ /** Logged in place of a body the SDK leaves unread; the logged headers keep its type and length. */
105
+ const UNBUFFERED = '[Unbuffered]';
106
+ /** Releases a body nobody will read; cancelling one whose read already failed rejects, harmlessly. */
107
+ const cancelBody = (response) => {
108
+ const body = response.body;
109
+ return body === null ? Effect.void : Effect.ignore(Effect.tryPromise(() => body.cancel()));
110
+ };
111
+ /**
112
+ * Axios buffered every body. The SDK reads one for the log only when it is finite text: empty, JSON,
113
+ * XML, form, JavaScript, `text/*` other than `text/event-stream`, or untyped with a `content-length`.
114
+ * Any other body, a stream or binary, reaches the caller unread.
115
+ */
116
+ const isBufferedBody = (response) => {
117
+ if (response.body === null)
118
+ return true;
119
+ const contentType = response.headers.get('content-type');
120
+ if (contentType === null)
121
+ return response.headers.has('content-length');
122
+ const essence = contentType.split(';')[0].trim().toLowerCase();
123
+ return (essence === 'application/json' ||
124
+ essence.endsWith('+json') ||
125
+ essence === 'application/xml' ||
126
+ essence.endsWith('+xml') ||
127
+ essence === 'application/x-www-form-urlencoded' ||
128
+ essence === 'application/javascript' ||
129
+ (essence.startsWith('text/') && essence !== 'text/event-stream'));
130
+ };
131
+ /**
132
+ * The workflow's `HttpClient`: every call carries the request trace and logs legacy
133
+ * `Outgoing HTTP request` lines, unless `HttpClient.TracerDisabledWhen` holds for the request.
134
+ */
135
+ export const httpClientLayer = (outboundFetch) => Layer.mergeAll(Layer.succeed(HttpClient.HttpClient, HttpClient.make((request, url, signal, fiber) => {
136
+ // fetch sets the length of the body it sends, so the logged headers are the sent ones.
137
+ const traced = HttpClientRequest.removeHeader(withTrace(request, fiber.getRef(CurrentLogContext)), 'content-length');
138
+ const exchange = send(outboundFetch, traced, url, signal);
139
+ if (fiber.getRef(HttpClient.TracerDisabledWhen)(traced)) {
140
+ return Effect.map(exchange, (response) => HttpClientResponse.fromWeb(traced, response));
141
+ }
142
+ const format = fiber.getRef(LegacyAxiosErrorFormat);
143
+ const toError = format === 'toJSON' ? toAxiosErrorJson : toAxiosError;
144
+ return exchange.pipe(Effect.flatMap((response) => {
145
+ const client = HttpClientResponse.fromWeb(traced, response);
146
+ if (!isBufferedBody(response))
147
+ return Effect.succeed({ response: client, body: UNBUFFERED });
148
+ return Effect.tryPromise({
149
+ try: () => response.clone().text(),
150
+ // axios rejected a body that ended early as an aborted stream, and so does the call.
151
+ catch: (cause) => new HttpClientError.HttpClientError({
152
+ reason: new HttpClientError.DecodeError({
153
+ request: traced,
154
+ response: client,
155
+ cause,
156
+ description: STREAM_ABORTED,
157
+ }),
158
+ }),
159
+ }).pipe(Effect.map((text) => ({ response: client, body: safeJsonParse(text) })), Effect.tapError(() => cancelBody(response)));
160
+ }), logSpan('Outgoing HTTP request', {
161
+ fields: (exit) => outgoingOf(traced, responseOf(exit, format)),
162
+ failure: (exit) => failureOf(exit, toError),
163
+ }), Effect.map(({ response }) => response));
164
+ })),
165
+ // The platform sends its own `traceparent`; Effect's span propagation would add `b3` to partner calls.
166
+ Layer.succeed(HttpClient.TracerPropagationEnabled, false));
167
+ //# sourceMappingURL=HttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../src/HttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { HttpBody } from 'effect/unstable/http';
2
+ import type { LogJson } from './LogContext.js';
3
+ /** Legacy `safeJsonParse`: JSON text becomes its value; any other text stays as sent. */
4
+ export declare const safeJsonParse: (text: string) => LogJson;
5
+ /** Form fields as logged: a file part logs as `{}`, as pino serialized a `File`. */
6
+ export declare const formDataFields: (form: FormData) => LogJson;
7
+ /** The logged form of a buffered body. Streams are never consumed for a log line. */
8
+ export declare const bodyOf: (body: HttpBody.HttpBody) => LogJson;
9
+ //# sourceMappingURL=HttpPayload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpPayload.d.ts","sourceRoot":"","sources":["../src/HttpPayload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,yFAAyF;AACzF,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,OAM5C,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,cAAc,SAAU,QAAQ,KAAG,OACyD,CAAC;AAI1G,qFAAqF;AACrF,eAAO,MAAM,MAAM,SAAU,QAAQ,CAAC,QAAQ,KAAG,OAehD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Predicate } from 'effect';
2
+ /** Legacy `safeJsonParse`: JSON text becomes its value; any other text stays as sent. */
3
+ export const safeJsonParse = (text) => {
4
+ try {
5
+ return JSON.parse(text);
6
+ }
7
+ catch {
8
+ return text;
9
+ }
10
+ };
11
+ /** Form fields as logged: a file part logs as `{}`, as pino serialized a `File`. */
12
+ export const formDataFields = (form) => Object.fromEntries(Array.from(form, ([name, value]) => [name, Predicate.isString(value) ? value : {}]));
13
+ const decoder = new TextDecoder();
14
+ /** The logged form of a buffered body. Streams are never consumed for a log line. */
15
+ export const bodyOf = (body) => {
16
+ switch (body._tag) {
17
+ case 'Uint8Array':
18
+ return safeJsonParse(body.text ?? decoder.decode(body.body));
19
+ case 'Raw':
20
+ if (Predicate.isString(body.body))
21
+ return safeJsonParse(body.body);
22
+ return body.body instanceof Uint8Array || body.body instanceof ArrayBuffer
23
+ ? safeJsonParse(decoder.decode(body.body))
24
+ : undefined;
25
+ case 'FormData':
26
+ return formDataFields(body.formData);
27
+ case 'Empty':
28
+ case 'Stream':
29
+ return undefined;
30
+ }
31
+ };
32
+ //# sourceMappingURL=HttpPayload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpPayload.js","sourceRoot":"","sources":["../src/HttpPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAInC,yFAAyF;AACzF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE;IACrD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAc,EAAW,EAAE,CACxD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE1G,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,qFAAqF;AACrF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAuB,EAAW,EAAE;IACzD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,KAAK,KAAK;YACR,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC,IAAI,YAAY,UAAU,IAAI,IAAI,CAAC,IAAI,YAAY,WAAW;gBACxE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,CAAC,CAAC,SAAS,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
@@ -1,24 +1,5 @@
1
1
  import { Context } from 'effect';
2
- /** Who admitted this invocation. Mirrors the platform `RunTriggerKind`; `http` is the guest default. */
3
- export type InvocationTriggerKind = 'http' | 'schedule' | 'manual' | 'agent' | 'as2' | 'sftp' | 'kafka' | 'child';
4
- /**
5
- * The exact object the Firecracker guest passes as the second `fetch` argument.
6
- * Fields are additive only: the platform may append, never rename or remove.
7
- */
8
- export interface InvocationContext {
9
- readonly workflowId: string;
10
- readonly deploymentId: string;
11
- readonly executionId: string;
12
- /** Durable Run identity. Empty when a host predates unified Run admission. */
13
- readonly runId: string;
14
- /** 1-based attempt counter for this Run. */
15
- readonly attempt: number;
16
- readonly triggerKind: InvocationTriggerKind;
17
- /** Absolute epoch milliseconds. The SDK interrupts the handler fiber when it passes. */
18
- readonly deadline: number;
19
- /** Run-scoped platform token for AS2, EDI, and Resource calls. Empty outside a platform host. */
20
- readonly token: string;
21
- }
2
+ import type { InvocationContext } from './Contract/Invocation.js';
22
3
  declare const Invocation_base: Context.ServiceClass<Invocation, "@temper/workflow/Invocation", InvocationContext>;
23
4
  export declare class Invocation extends Invocation_base {
24
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Invocation.d.ts","sourceRoot":"","sources":["../src/Invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,wGAAwG;AACxG,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAElH;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;;AAED,qBAAa,UAAW,SAAQ,eAA+E;CAAG"}
1
+ {"version":3,"file":"Invocation.d.ts","sourceRoot":"","sources":["../src/Invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;;AAElE,qBAAa,UAAW,SAAQ,eAA+E;CAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../src/Invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAwBjC,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,OAAO,EAAiC,CAAC,6BAA6B,CAAC;CAAG"}
1
+ {"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../src/Invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,OAAO,EAAiC,CAAC,6BAA6B,CAAC;CAAG"}
@@ -0,0 +1,59 @@
1
+ import { Context, Effect, Exit, Option } from 'effect';
2
+ /** Legacy correlation header: read from the caller, echoed on responses, and sent on outbound requests. */
3
+ export declare const TRACE_HEADER = "x-unnbound-trace-id";
4
+ /** Correlation carried on every log line of one request (legacy `UnnboundContext`). */
5
+ export interface LogContext {
6
+ readonly traceId: string;
7
+ readonly messageId?: string | undefined;
8
+ /** The SDK generated `messageId`, so it differs between attempts of one Run. */
9
+ readonly messageIdMinted?: boolean | undefined;
10
+ readonly source?: string | undefined;
11
+ /** Chained span ids, innermost first: `"<child> <parent>"`. */
12
+ readonly spanId?: string | undefined;
13
+ }
14
+ export declare const CurrentLogContext: Context.Reference<LogContext | undefined>;
15
+ /** A value as a JSON log line holds it; the logger converts every logged value to one. */
16
+ export type LogJson = string | number | boolean | null | undefined | ReadonlyArray<LogJson> | {
17
+ [key: string]: LogJson;
18
+ };
19
+ /** Structured fields of one log line; plain-object `Effect.log*` arguments become top-level keys. */
20
+ export type LogFields = {
21
+ readonly [key: string]: LogJson;
22
+ };
23
+ export interface LogSpanOptions<A, E> {
24
+ /** Payload of every span line; `undefined` while the span has not ended. */
25
+ readonly fields: (exit: Exit.Exit<A, E> | undefined) => LogFields;
26
+ /** The `err` of a failed end; `none` completes the span. */
27
+ readonly failure: (exit: Exit.Exit<A, E>) => Option.Option<unknown>;
28
+ }
29
+ /**
30
+ * Legacy `startSpan`: logs `<name> started.`, then `<name> completed.` or `<name> failed.` with
31
+ * `duration` in ms, all inside one child span, including when the span is interrupted.
32
+ */
33
+ export declare const logSpan: <A, E>(name: string, options: LogSpanOptions<A, E>) => <R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
34
+ /** What a legacy `startSpan` getter received: nothing when the span starts, then its result or error. */
35
+ export type SpanOutcome<A> = {
36
+ readonly result: A;
37
+ readonly error?: never;
38
+ } | {
39
+ readonly error: unknown;
40
+ readonly result?: never;
41
+ };
42
+ /** How `withSpanLines` logs a failed span. */
43
+ export interface SpanLinesOptions {
44
+ /**
45
+ * The `err` of `<name> failed.` for what the span failed with, such as `toAxiosErrorJson` of an
46
+ * `HttpClientError` behind it; `undefined` logs the failure itself.
47
+ */
48
+ readonly err?: (failure: {
49
+ readonly error: unknown;
50
+ }) => Error | undefined;
51
+ }
52
+ /**
53
+ * Legacy `startSpan` (sdk/logger/src/span.ts:15-45) as an Effect combinator: `<name> started.`, then
54
+ * `<name> completed.` with `duration`, or `<name> failed.` with `err` and `duration`, all in a child
55
+ * span whose id chains as `"<child> <parent>"`. `fields` go into each line, like the legacy getter.
56
+ */
57
+ export declare function withSpanLines<A>(name: string, fields: (outcome?: SpanOutcome<A>) => LogFields, options?: SpanLinesOptions): <E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
58
+ export declare function withSpanLines(name: string, fields?: LogFields, options?: SpanLinesOptions): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
59
+ //# sourceMappingURL=LogContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogContext.d.ts","sourceRoot":"","sources":["../src/LogContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { Cause, Clock, Context, Effect, Exit, Option, Predicate } from 'effect';
2
+ /** Legacy correlation header: read from the caller, echoed on responses, and sent on outbound requests. */
3
+ export const TRACE_HEADER = 'x-unnbound-trace-id';
4
+ export const CurrentLogContext = Context.Reference('@temper/workflow/LogContext', {
5
+ defaultValue: () => undefined,
6
+ });
7
+ const childOf = (parent) => {
8
+ const spanId = crypto.randomUUID();
9
+ return {
10
+ ...parent,
11
+ traceId: parent?.traceId ?? crypto.randomUUID(),
12
+ spanId: parent?.spanId === undefined ? spanId : `${spanId} ${parent.spanId}`,
13
+ };
14
+ };
15
+ /**
16
+ * Legacy `startSpan`: logs `<name> started.`, then `<name> completed.` or `<name> failed.` with
17
+ * `duration` in ms, all inside one child span, including when the span is interrupted.
18
+ */
19
+ export const logSpan = (name, options) => (effect) => Effect.withFiber((fiber) => Effect.gen(function* () {
20
+ const started = yield* Clock.monotonicTimeNanos;
21
+ yield* Effect.logInfo(`${name} started.`, options.fields(undefined));
22
+ return yield* Effect.onExit(effect, (exit) => Effect.flatMap(Clock.monotonicTimeNanos, (ended) => {
23
+ const duration = Math.round(Number(ended - started) / 1_000_000);
24
+ return Option.match(options.failure(exit), {
25
+ onNone: () => Effect.logInfo(`${name} completed.`, { ...options.fields(exit), duration }),
26
+ onSome: (err) => Effect.logError(`${name} failed.`, { ...options.fields(exit), err, duration }),
27
+ });
28
+ }));
29
+ }).pipe(Effect.provideService(CurrentLogContext, childOf(fiber.getRef(CurrentLogContext)))));
30
+ export function withSpanLines(name, fields = {}, options = {}) {
31
+ return (effect) => logSpan(name, {
32
+ fields: (exit) => {
33
+ if (!Predicate.isFunction(fields))
34
+ return fields;
35
+ if (exit === undefined)
36
+ return fields();
37
+ return Exit.isSuccess(exit) ? fields({ result: exit.value }) : fields({ error: Cause.squash(exit.cause) });
38
+ },
39
+ failure: (exit) => {
40
+ if (Exit.isSuccess(exit))
41
+ return Option.none();
42
+ const error = Cause.squash(exit.cause);
43
+ return Option.some(options.err?.({ error }) ?? error);
44
+ },
45
+ })(effect);
46
+ }
47
+ //# sourceMappingURL=LogContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogContext.js","sourceRoot":"","sources":["../src/LogContext.ts"],"names":[],"mappings":"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"}
package/dist/Logger.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Logger } from 'effect';
1
+ import { Config, Layer } from 'effect';
2
+ /** Replaces Effect's loggers with the workflow line logger, keeps span events, and applies `LOG_LEVEL`. */
3
+ export declare const loggerLayer: (writeLine: (line: string) => void) => Layer.Layer<never, Config.ConfigError>;
2
4
  export declare const writeStdoutLine: (line: string) => void;
3
- /** Replaces the default console logger for every workflow request fiber. */
4
- export declare const makeWorkflowLoggers: (writeLine: (line: string) => void) => ReadonlySet<Logger.Logger<unknown, unknown>>;
5
5
  //# sourceMappingURL=Logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAc,MAAM,QAAQ,CAAC;AA0CnD,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,IAE9C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,cAAe,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAK/G,CAAC"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EAIN,KAAK,EAMN,MAAM,QAAQ,CAAC;AAmVhB,2GAA2G;AAC3G,eAAO,MAAM,WAAW,cAAe,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAQlG,CAAC;AAEJ,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,IAE9C,CAAC"}