@supainc/supacatch-core 0.1.0-alpha.6
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.
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/adapter.d.ts +6 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +6 -0
- package/dist/adapter.js.map +1 -0
- package/dist/capture.d.ts +9 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +20 -0
- package/dist/capture.js.map +1 -0
- package/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -0
- package/dist/effect.d.ts +15 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +16 -0
- package/dist/effect.js.map +1 -0
- package/dist/errors.d.ts +44 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/event.d.ts +19 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +54 -0
- package/dist/event.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/automatic.d.ts +5 -0
- package/dist/internal/automatic.d.ts.map +1 -0
- package/dist/internal/automatic.js +28 -0
- package/dist/internal/automatic.js.map +1 -0
- package/dist/internal/context.d.ts +12 -0
- package/dist/internal/context.d.ts.map +1 -0
- package/dist/internal/context.js +10 -0
- package/dist/internal/context.js.map +1 -0
- package/dist/internal/dedupe.d.ts +3 -0
- package/dist/internal/dedupe.d.ts.map +1 -0
- package/dist/internal/dedupe.js +17 -0
- package/dist/internal/dedupe.js.map +1 -0
- package/dist/internal/fatal.d.ts +16 -0
- package/dist/internal/fatal.d.ts.map +1 -0
- package/dist/internal/fatal.js +41 -0
- package/dist/internal/fatal.js.map +1 -0
- package/dist/internal/runtime.d.ts +9 -0
- package/dist/internal/runtime.d.ts.map +1 -0
- package/dist/internal/runtime.js +26 -0
- package/dist/internal/runtime.js.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Supa, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# `@supainc/supacatch-core`
|
|
2
|
+
|
|
3
|
+
Shared client and Effect service for the SupaCatch JavaScript SDKs.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm install @supainc/supacatch-core@alpha
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
See the [SupaCatch JavaScript SDK documentation](https://github.com/supainc/supacatch-js#readme) for usage.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { captureAutomatic, registerAutomatic } from "./internal/automatic.js";
|
|
2
|
+
export { runWithContext, type CaptureContext } from "./internal/context.js";
|
|
3
|
+
export { once } from "./internal/dedupe.js";
|
|
4
|
+
export { FatalAdapter, beforeFatal, installFatalCapture, type FatalAdapterShape, } from "./internal/fatal.js";
|
|
5
|
+
export { init as initRuntime, layer as runtimeLayer } from "./internal/runtime.js";
|
|
6
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { captureAutomatic, registerAutomatic } from "./internal/automatic.js";
|
|
2
|
+
export { runWithContext } from "./internal/context.js";
|
|
3
|
+
export { once } from "./internal/dedupe.js";
|
|
4
|
+
export { FatalAdapter, beforeFatal, installFatalCapture, } from "./internal/fatal.js";
|
|
5
|
+
export { init as initRuntime, layer as runtimeLayer } from "./internal/runtime.js";
|
|
6
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAuB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Duration, Effect } from "effect";
|
|
2
|
+
import { HttpClient } from "effect/unstable/http";
|
|
3
|
+
import { CaptureTimeoutError, InvalidSuccessResponseError, RejectedResponseError, RequestEncodingError, TransportError, UnavailableResponseError, UnexpectedResponseError } from "./errors.js";
|
|
4
|
+
export declare const captureWith: (httpClient: HttpClient.HttpClient, config: {
|
|
5
|
+
readonly endpoint: URL;
|
|
6
|
+
readonly ingestKey: import("effect/Redacted").Redacted<string>;
|
|
7
|
+
readonly requestTimeout: Duration.Duration;
|
|
8
|
+
}, value: unknown) => Effect.Effect<string & import("effect/Brand").Brand<"EventId">, CaptureTimeoutError | InvalidSuccessResponseError | RejectedResponseError | RequestEncodingError | TransportError | UnavailableResponseError | UnexpectedResponseError, never>;
|
|
9
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,QAAQ,EAAE,MAAM,EAAwB,MAAM,QAAQ,CAAC;AACjF,OAAO,EAAE,UAAU,EAAyC,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,WAAW;;;;oQAwCtB,CAAC"}
|
package/dist/capture.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Cause, DateTime, Duration, Effect, Match, String as Str } from "effect";
|
|
2
|
+
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
|
|
3
|
+
import { CaptureTimeoutError, InvalidSuccessResponseError, RejectedResponseError, RequestEncodingError, TransportError, UnavailableResponseError, UnexpectedResponseError, } from "./errors.js";
|
|
4
|
+
import { EventRequest, normalizeException, SubmitEventResponse } from "./event.js";
|
|
5
|
+
export const captureWith = Effect.fn("SupaCatch.captureException")(function* (httpClient, config, value) {
|
|
6
|
+
const now = yield* DateTime.now;
|
|
7
|
+
const payload = normalizeException(value, now);
|
|
8
|
+
const eventUrl = new URL(config.endpoint);
|
|
9
|
+
eventUrl.pathname = `${Str.replace(/\/$/, "")(eventUrl.pathname)}/v1/events`;
|
|
10
|
+
eventUrl.search = "";
|
|
11
|
+
eventUrl.hash = "";
|
|
12
|
+
const request = yield* HttpClientRequest.post(eventUrl).pipe(HttpClientRequest.bearerToken(config.ingestKey), HttpClientRequest.acceptJson, HttpClientRequest.schemaBodyJson(EventRequest)(payload), Effect.mapError((cause) => new RequestEncodingError({ cause })));
|
|
13
|
+
const response = yield* httpClient.execute(request).pipe(Effect.timeout(config.requestTimeout), Effect.mapError((cause) => Cause.isTimeoutError(cause)
|
|
14
|
+
? new CaptureTimeoutError({ timeoutMillis: Duration.toMillis(config.requestTimeout) })
|
|
15
|
+
: new TransportError({ cause })));
|
|
16
|
+
yield* Match.value(response.status).pipe(Match.when(202, () => Effect.void), Match.whenOr(401, 403, (status) => Effect.fail(new RejectedResponseError({ status }))), Match.when(503, (status) => Effect.fail(new UnavailableResponseError({ status }))), Match.orElse((status) => Effect.fail(new UnexpectedResponseError({ status }))));
|
|
17
|
+
const accepted = yield* HttpClientResponse.schemaBodyJson(SubmitEventResponse)(response).pipe(Effect.mapError((cause) => new InvalidSuccessResponseError({ cause })));
|
|
18
|
+
return accepted.eventId;
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SdkConfig } from "./config.js";
|
|
2
|
+
import type { EventId } from "./event.js";
|
|
3
|
+
export interface SupaCatchClient {
|
|
4
|
+
readonly captureException: (value: unknown) => Promise<EventId>;
|
|
5
|
+
readonly dispose: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const createClient: (config: SdkConfig) => SupaCatchClient;
|
|
8
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,WAAY,SAAS,KAAG,eAgBhD,CAAC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Cause, Effect, Layer, ManagedRuntime, Option } from "effect";
|
|
2
|
+
import { FetchHttpClient } from "effect/unstable/http";
|
|
3
|
+
import { layer, SupaCatch } from "./effect.js";
|
|
4
|
+
import { TransportError } from "./errors.js";
|
|
5
|
+
export const createClient = (config) => {
|
|
6
|
+
const runtime = ManagedRuntime.make(layer(config).pipe(Layer.provide(FetchHttpClient.layer)));
|
|
7
|
+
return {
|
|
8
|
+
captureException: (value) => runtime.runPromise(Effect.flatMap(SupaCatch, (supaCatch) => supaCatch.captureException(value)).pipe(Effect.catchCause((cause) => Option.match(Cause.findErrorOption(cause), {
|
|
9
|
+
onSome: Effect.fail,
|
|
10
|
+
onNone: () => Effect.fail(new TransportError({ cause: Cause.pretty(cause) })),
|
|
11
|
+
})))),
|
|
12
|
+
dispose: () => void runtime.dispose(),
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAiB,EAAmB,EAAE;IACjE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC1B,OAAO,CAAC,UAAU,CAChB,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAC9E,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YACzC,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SAC9E,CAAC,CACH,CACF,CACF;QACH,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE;KACtC,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Duration, Effect, Schema } from "effect";
|
|
2
|
+
import { InvalidConfigurationError } from "./errors.js";
|
|
3
|
+
declare const Config: Schema.Struct<{
|
|
4
|
+
readonly endpoint: Schema.withDecodingDefault<Schema.URLFromString, never>;
|
|
5
|
+
readonly ingestKey: Schema.RedactedFromValue<Schema.String>;
|
|
6
|
+
readonly requestTimeout: Schema.withDecodingDefault<Schema.DurationFromMillis, never>;
|
|
7
|
+
}>;
|
|
8
|
+
export type SdkConfig = typeof Config.Encoded;
|
|
9
|
+
export type RuntimeConfig = typeof Config.Type;
|
|
10
|
+
export declare const resolveConfig: (input: {
|
|
11
|
+
readonly endpoint?: string | undefined;
|
|
12
|
+
readonly ingestKey: string;
|
|
13
|
+
readonly requestTimeout?: number | undefined;
|
|
14
|
+
}) => Effect.Effect<{
|
|
15
|
+
readonly endpoint: URL;
|
|
16
|
+
readonly ingestKey: import("effect/Redacted").Redacted<string>;
|
|
17
|
+
readonly requestTimeout: Duration.Duration;
|
|
18
|
+
}, InvalidConfigurationError, never>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,QAAA,MAAM,MAAM;;;;EAsBV,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,OAAO,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC;AAE/C,eAAO,MAAM,aAAa;;;;;;;;oCASzB,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Duration, Effect, Schema } from "effect";
|
|
2
|
+
import { InvalidConfigurationError } from "./errors.js";
|
|
3
|
+
const Config = Schema.Struct({
|
|
4
|
+
endpoint: Schema.URLFromString.pipe(Schema.check(Schema.makeFilter((endpoint) => endpoint.protocol === "http:" || endpoint.protocol === "https:"
|
|
5
|
+
? true
|
|
6
|
+
: "endpoint must use HTTP or HTTPS")), Schema.withDecodingDefault(Effect.succeed("https://ingest.catch.supa.dev"))),
|
|
7
|
+
ingestKey: Schema.RedactedFromValue(Schema.String.pipe(Schema.check(Schema.isMinLength(8)))),
|
|
8
|
+
requestTimeout: Schema.DurationFromMillis.pipe(Schema.check(Schema.makeFilter((requestTimeout) => Duration.isFinite(requestTimeout) && Duration.isPositive(requestTimeout)
|
|
9
|
+
? true
|
|
10
|
+
: "requestTimeout must be a positive number of milliseconds")), Schema.withDecodingDefault(Effect.succeed(5_000))),
|
|
11
|
+
});
|
|
12
|
+
export const resolveConfig = Effect.fn("SupaCatch.resolveConfig")((input) => Schema.decodeEffect(Config)(input).pipe(Effect.mapError((error) => new InvalidConfigurationError({
|
|
13
|
+
issue: error.message,
|
|
14
|
+
}))));
|
|
15
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,CACjC,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7B,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ;QAC7D,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,iCAAiC,CACtC,CACF,EACD,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAC5E;IACD,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,cAAc,EAAE,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAC5C,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CACnC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;QACtE,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,0DAA0D,CAC/D,CACF,EACD,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAClD;CACF,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,KAAgB,EAAE,EAAE,CACrF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CACrC,MAAM,CAAC,QAAQ,CACb,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,yBAAyB,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC,OAAO;CACrB,CAAC,CACL,CACF,CACF,CAAC"}
|
package/dist/effect.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { HttpClient } from "effect/unstable/http";
|
|
3
|
+
import type { SdkConfig } from "./config.js";
|
|
4
|
+
import type { CaptureError, InvalidConfigurationError } from "./errors.js";
|
|
5
|
+
import type { EventId } from "./event.js";
|
|
6
|
+
declare const SupaCatch_base: Context.ServiceClass<SupaCatch, "@supainc/supacatch-core/SupaCatch", {
|
|
7
|
+
readonly captureException: (value: unknown) => Effect.Effect<EventId, CaptureError>;
|
|
8
|
+
}>;
|
|
9
|
+
export declare class SupaCatch extends SupaCatch_base {
|
|
10
|
+
}
|
|
11
|
+
export declare const layer: (config: SdkConfig) => Layer.Layer<SupaCatch, InvalidConfigurationError, HttpClient.HttpClient>;
|
|
12
|
+
export type { SdkConfig } from "./config.js";
|
|
13
|
+
export * from "./errors.js";
|
|
14
|
+
export { EventId, EventRequest, SubmitEventResponse } from "./event.js";
|
|
15
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;;+BAKX,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;;AAHvF,qBAAa,SAAU,SAAQ,cAKS;CAAG;AAE3C,eAAO,MAAM,KAAK,WACR,SAAS,KAChB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,yBAAyB,EAAE,UAAU,CAAC,UAAU,CAWvE,CAAC;AAEJ,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/effect.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { HttpClient } from "effect/unstable/http";
|
|
3
|
+
import { captureWith } from "./capture.js";
|
|
4
|
+
import { resolveConfig } from "./config.js";
|
|
5
|
+
export class SupaCatch extends Context.Service()("@supainc/supacatch-core/SupaCatch") {
|
|
6
|
+
}
|
|
7
|
+
export const layer = (config) => Layer.effect(SupaCatch, Effect.gen(function* () {
|
|
8
|
+
const resolved = yield* resolveConfig(config);
|
|
9
|
+
const httpClient = yield* HttpClient.HttpClient;
|
|
10
|
+
return SupaCatch.of({
|
|
11
|
+
captureException: (value) => captureWith(httpClient, resolved, value),
|
|
12
|
+
});
|
|
13
|
+
}));
|
|
14
|
+
export * from "./errors.js";
|
|
15
|
+
export { EventId, EventRequest, SubmitEventResponse } from "./event.js";
|
|
16
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAK3C,CAAC,mCAAmC,CAAC;CAAG;AAE3C,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,MAAiB,EACyD,EAAE,CAC5E,KAAK,CAAC,MAAM,CACV,SAAS,EACT,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IAEhD,OAAO,SAAS,CAAC,EAAE,CAAC;QAClB,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC;KACtE,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC;AAGJ,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
declare const InvalidConfigurationError_base: Schema.Class<InvalidConfigurationError, Schema.TaggedStruct<"InvalidConfigurationError", {
|
|
3
|
+
readonly issue: Schema.String;
|
|
4
|
+
}>, import("effect/Cause").YieldableError>;
|
|
5
|
+
export declare class InvalidConfigurationError extends InvalidConfigurationError_base {
|
|
6
|
+
}
|
|
7
|
+
declare const RequestEncodingError_base: Schema.Class<RequestEncodingError, Schema.TaggedStruct<"RequestEncodingError", {
|
|
8
|
+
readonly cause: Schema.Defect;
|
|
9
|
+
}>, import("effect/Cause").YieldableError>;
|
|
10
|
+
export declare class RequestEncodingError extends RequestEncodingError_base {
|
|
11
|
+
}
|
|
12
|
+
declare const TransportError_base: Schema.Class<TransportError, Schema.TaggedStruct<"TransportError", {
|
|
13
|
+
readonly cause: Schema.Defect;
|
|
14
|
+
}>, import("effect/Cause").YieldableError>;
|
|
15
|
+
export declare class TransportError extends TransportError_base {
|
|
16
|
+
}
|
|
17
|
+
declare const CaptureTimeoutError_base: Schema.Class<CaptureTimeoutError, Schema.TaggedStruct<"CaptureTimeoutError", {
|
|
18
|
+
readonly timeoutMillis: Schema.Number;
|
|
19
|
+
}>, import("effect/Cause").YieldableError>;
|
|
20
|
+
export declare class CaptureTimeoutError extends CaptureTimeoutError_base {
|
|
21
|
+
}
|
|
22
|
+
declare const RejectedResponseError_base: Schema.Class<RejectedResponseError, Schema.TaggedStruct<"RejectedResponseError", {
|
|
23
|
+
readonly status: Schema.Number;
|
|
24
|
+
}>, import("effect/Cause").YieldableError>;
|
|
25
|
+
export declare class RejectedResponseError extends RejectedResponseError_base {
|
|
26
|
+
}
|
|
27
|
+
declare const UnavailableResponseError_base: Schema.Class<UnavailableResponseError, Schema.TaggedStruct<"UnavailableResponseError", {
|
|
28
|
+
readonly status: Schema.Number;
|
|
29
|
+
}>, import("effect/Cause").YieldableError>;
|
|
30
|
+
export declare class UnavailableResponseError extends UnavailableResponseError_base {
|
|
31
|
+
}
|
|
32
|
+
declare const UnexpectedResponseError_base: Schema.Class<UnexpectedResponseError, Schema.TaggedStruct<"UnexpectedResponseError", {
|
|
33
|
+
readonly status: Schema.Number;
|
|
34
|
+
}>, import("effect/Cause").YieldableError>;
|
|
35
|
+
export declare class UnexpectedResponseError extends UnexpectedResponseError_base {
|
|
36
|
+
}
|
|
37
|
+
declare const InvalidSuccessResponseError_base: Schema.Class<InvalidSuccessResponseError, Schema.TaggedStruct<"InvalidSuccessResponseError", {
|
|
38
|
+
readonly cause: Schema.Defect;
|
|
39
|
+
}>, import("effect/Cause").YieldableError>;
|
|
40
|
+
export declare class InvalidSuccessResponseError extends InvalidSuccessResponseError_base {
|
|
41
|
+
}
|
|
42
|
+
export type CaptureError = RequestEncodingError | TransportError | CaptureTimeoutError | RejectedResponseError | UnavailableResponseError | UnexpectedResponseError | InvalidSuccessResponseError;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;AAEhC,qBAAa,yBAA0B,SAAQ,8BAG9C;CAAG;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAGzC;CAAG;;;;AAEJ,qBAAa,cAAe,SAAQ,mBAElC;CAAG;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAGxC;CAAG;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAG1C;CAAG;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAG7C;CAAG;;;;AAEJ,qBAAa,uBAAwB,SAAQ,4BAG5C;CAAG;;;;AAEJ,qBAAa,2BAA4B,SAAQ,gCAGhD;CAAG;AAEJ,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,uBAAuB,GACvB,2BAA2B,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
export class InvalidConfigurationError extends Schema.TaggedErrorClass()("InvalidConfigurationError", { issue: Schema.String }) {
|
|
3
|
+
}
|
|
4
|
+
export class RequestEncodingError extends Schema.TaggedErrorClass()("RequestEncodingError", { cause: Schema.Defect() }) {
|
|
5
|
+
}
|
|
6
|
+
export class TransportError extends Schema.TaggedErrorClass()("TransportError", {
|
|
7
|
+
cause: Schema.Defect(),
|
|
8
|
+
}) {
|
|
9
|
+
}
|
|
10
|
+
export class CaptureTimeoutError extends Schema.TaggedErrorClass()("CaptureTimeoutError", { timeoutMillis: Schema.Number }) {
|
|
11
|
+
}
|
|
12
|
+
export class RejectedResponseError extends Schema.TaggedErrorClass()("RejectedResponseError", { status: Schema.Number }) {
|
|
13
|
+
}
|
|
14
|
+
export class UnavailableResponseError extends Schema.TaggedErrorClass()("UnavailableResponseError", { status: Schema.Number }) {
|
|
15
|
+
}
|
|
16
|
+
export class UnexpectedResponseError extends Schema.TaggedErrorClass()("UnexpectedResponseError", { status: Schema.Number }) {
|
|
17
|
+
}
|
|
18
|
+
export class InvalidSuccessResponseError extends Schema.TaggedErrorClass()("InvalidSuccessResponseError", { cause: Schema.Defect() }) {
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,gBAAgB,EAA6B,CACjG,2BAA2B,EAC3B,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CACzB;CAAG;AAEJ,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,gBAAgB,EAAwB,CACvF,sBAAsB,EACtB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAC3B;CAAG;AAEJ,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,gBAAgB,EAAkB,CAAC,gBAAgB,EAAE;IAC9F,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,gBAAgB,EAAuB,CACrF,qBAAqB,EACrB,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CACjC;CAAG;AAEJ,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,gBAAgB,EAAyB,CACzF,uBAAuB,EACvB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC1B;CAAG;AAEJ,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,gBAAgB,EAA4B,CAC/F,0BAA0B,EAC1B,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC1B;CAAG;AAEJ,MAAM,OAAO,uBAAwB,SAAQ,MAAM,CAAC,gBAAgB,EAA2B,CAC7F,yBAAyB,EACzB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC1B;CAAG;AAEJ,MAAM,OAAO,2BAA4B,SAAQ,MAAM,CAAC,gBAAgB,EAA+B,CACrG,6BAA6B,EAC7B,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAC3B;CAAG"}
|
package/dist/event.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DateTime, Schema } from "effect";
|
|
2
|
+
export declare const EventId: Schema.brand<Schema.String, "EventId">;
|
|
3
|
+
export type EventId = typeof EventId.Type;
|
|
4
|
+
declare const EventRequest_base: Schema.Class<EventRequest, Schema.Struct<{
|
|
5
|
+
readonly name: Schema.NonEmptyString;
|
|
6
|
+
readonly message: Schema.String;
|
|
7
|
+
readonly stackTrace: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
8
|
+
readonly timestamp: Schema.String;
|
|
9
|
+
}>, {}>;
|
|
10
|
+
export declare class EventRequest extends EventRequest_base {
|
|
11
|
+
}
|
|
12
|
+
declare const SubmitEventResponse_base: Schema.Class<SubmitEventResponse, Schema.Struct<{
|
|
13
|
+
readonly eventId: Schema.brand<Schema.String, "EventId">;
|
|
14
|
+
}>, {}>;
|
|
15
|
+
export declare class SubmitEventResponse extends SubmitEventResponse_base {
|
|
16
|
+
}
|
|
17
|
+
export declare const normalizeException: (value: unknown, timestamp: DateTime.Utc) => EventRequest;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE7D,eAAO,MAAM,OAAO,wCAA8E,CAAC;AACnG,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;;;;;;;AAM1C,qBAAa,YAAa,SAAQ,iBAOhC;CAAG;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAEvC;CAAG;AAmCL,eAAO,MAAM,kBAAkB,UAAW,OAAO,aAAa,QAAQ,CAAC,GAAG,KAAG,YAuB5E,CAAC"}
|
package/dist/event.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { DateTime, Option, Predicate, Schema } from "effect";
|
|
2
|
+
export const EventId = Schema.String.pipe(Schema.check(Schema.isUUID(7)), Schema.brand("EventId"));
|
|
3
|
+
const EventTimestamp = Schema.String.pipe(Schema.check(Schema.isPattern(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/)));
|
|
4
|
+
export class EventRequest extends Schema.Class("EventRequest")({
|
|
5
|
+
name: Schema.NonEmptyString.pipe(Schema.check(Schema.isMaxLength(200))),
|
|
6
|
+
message: Schema.String.pipe(Schema.check(Schema.isMaxLength(10_000))),
|
|
7
|
+
stackTrace: Schema.optional(Schema.NullOr(Schema.String.pipe(Schema.check(Schema.isMaxLength(70_000))))),
|
|
8
|
+
timestamp: EventTimestamp,
|
|
9
|
+
}) {
|
|
10
|
+
}
|
|
11
|
+
export class SubmitEventResponse extends Schema.Class("SubmitEventResponse")({
|
|
12
|
+
eventId: EventId,
|
|
13
|
+
}) {
|
|
14
|
+
}
|
|
15
|
+
const readString = (value, property) => Option.liftThrowable(() => Reflect.get(value, property))().pipe(Option.filter(Predicate.isString), Option.getOrUndefined);
|
|
16
|
+
const stringify = (value) => {
|
|
17
|
+
if (typeof value === "string")
|
|
18
|
+
return value;
|
|
19
|
+
if (typeof value === "bigint" || typeof value === "symbol") {
|
|
20
|
+
return globalThis.String(value);
|
|
21
|
+
}
|
|
22
|
+
const seen = new WeakSet();
|
|
23
|
+
return Option.liftThrowable(() => JSON.stringify(value, (_key, entry) => {
|
|
24
|
+
if (typeof entry === "bigint" || typeof entry === "symbol") {
|
|
25
|
+
return globalThis.String(entry);
|
|
26
|
+
}
|
|
27
|
+
if ((typeof entry === "object" && entry !== null) || typeof entry === "function") {
|
|
28
|
+
if (seen.has(entry))
|
|
29
|
+
return "[Circular]";
|
|
30
|
+
seen.add(entry);
|
|
31
|
+
}
|
|
32
|
+
return entry;
|
|
33
|
+
}))().pipe(Option.filter(Predicate.isString), Option.orElse(() => Option.liftThrowable(() => globalThis.String(value))()), Option.getOrElse(() => "[Unserializable value]"));
|
|
34
|
+
};
|
|
35
|
+
export const normalizeException = (value, timestamp) => {
|
|
36
|
+
const formattedTimestamp = DateTime.formatIso(timestamp);
|
|
37
|
+
const error = Option.liftThrowable(() => (Predicate.isError(value) ? value : undefined))().pipe(Option.getOrUndefined);
|
|
38
|
+
if (error === undefined) {
|
|
39
|
+
return new EventRequest({
|
|
40
|
+
name: "NonError",
|
|
41
|
+
message: stringify(value).slice(0, 10_000),
|
|
42
|
+
timestamp: formattedTimestamp,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const name = readString(error, "name");
|
|
46
|
+
const stack = readString(error, "stack");
|
|
47
|
+
return new EventRequest({
|
|
48
|
+
name: (name === undefined || name.length === 0 ? "Error" : name).slice(0, 200),
|
|
49
|
+
message: (readString(error, "message") ?? "").slice(0, 10_000),
|
|
50
|
+
...(stack === undefined ? {} : { stackTrace: stack.slice(0, 70_000) }),
|
|
51
|
+
timestamp: formattedTimestamp,
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAwB,MAAM,aAAa,CAAC;AAEjE,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type Capture } from "./context.js";
|
|
3
|
+
export declare const captureAutomatic: (value: unknown) => Effect.Effect<void, unknown>;
|
|
4
|
+
export declare const registerAutomatic: (capture: Capture) => (() => void);
|
|
5
|
+
//# sourceMappingURL=automatic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../../src/internal/automatic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAsB,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAkB,KAAK,OAAO,EAAuB,MAAM,cAAc,CAAC;AAajF,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAWzE,CAAC;AAEL,eAAO,MAAM,iBAAiB,YAAa,OAAO,KAAG,CAAC,MAAM,IAAI,CAa/D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { Effect, MutableRef, Option } from "effect";
|
|
3
|
+
import { installContext } from "./context.js";
|
|
4
|
+
import { once } from "./dedupe.js";
|
|
5
|
+
const requestContext = new AsyncLocalStorage();
|
|
6
|
+
const runtimeCapture = MutableRef.make(Option.none());
|
|
7
|
+
installContext((context, task) => requestContext.run(context, task));
|
|
8
|
+
export const captureAutomatic = (value) => Effect.suspend(() => {
|
|
9
|
+
const context = Option.fromNullishOr(requestContext.getStore()).pipe(Option.orElse(() => Option.map(MutableRef.get(runtimeCapture), (registration) => registration.context)));
|
|
10
|
+
return Option.match(context, {
|
|
11
|
+
onNone: () => Effect.succeed(undefined),
|
|
12
|
+
onSome: (current) => once(value, current, current.capture(value)),
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
export const registerAutomatic = (capture) => {
|
|
16
|
+
const registration = {
|
|
17
|
+
context: { capture },
|
|
18
|
+
token: Symbol("SupaCatchAutomaticCapture"),
|
|
19
|
+
};
|
|
20
|
+
MutableRef.set(runtimeCapture, Option.some(registration));
|
|
21
|
+
return () => {
|
|
22
|
+
const current = MutableRef.get(runtimeCapture);
|
|
23
|
+
if (Option.exists(current, ({ token }) => token === registration.token)) {
|
|
24
|
+
MutableRef.set(runtimeCapture, Option.none());
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=automatic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automatic.js","sourceRoot":"","sources":["../../src/internal/automatic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,cAAc,EAAqC,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAOnC,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAC/D,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAgB,CAAC,CAAC;AAEpE,cAAc,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAgC,EAAE,CAC/E,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;IAClB,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAClE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CACjB,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CACnF,CACF,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QACvC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAClE,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAgB,EAAE;IAClE,MAAM,YAAY,GAAiB;QACjC,OAAO,EAAE,EAAE,OAAO,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC,2BAA2B,CAAC;KAC3C,CAAC;IACF,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAE1D,OAAO,GAAG,EAAE;QACV,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
export type Capture = (value: unknown) => Effect.Effect<unknown, unknown>;
|
|
3
|
+
export interface CaptureContext {
|
|
4
|
+
readonly capture: Capture;
|
|
5
|
+
}
|
|
6
|
+
interface ContextRunner {
|
|
7
|
+
<Result>(context: CaptureContext, task: () => Result): Result;
|
|
8
|
+
}
|
|
9
|
+
export declare const installContext: (run: ContextRunner) => void;
|
|
10
|
+
export declare const runWithContext: <Result>(context: CaptureContext, task: () => Result) => Result;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,QAAQ,CAAC;AAEpD,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,aAAa;IACrB,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,MAAM,GAAG,MAAM,CAAC;CAC/D;AAID,eAAO,MAAM,cAAc,QAAS,aAAa,KAAG,IAEnD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,WAAW,cAAc,QAAQ,MAAM,MAAM,KAAG,MAIjF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Effect, MutableRef, Option } from "effect";
|
|
2
|
+
const runner = MutableRef.make(Option.none());
|
|
3
|
+
export const installContext = (run) => {
|
|
4
|
+
MutableRef.set(runner, Option.some(run));
|
|
5
|
+
};
|
|
6
|
+
export const runWithContext = (context, task) => Option.match(MutableRef.get(runner), {
|
|
7
|
+
onNone: task,
|
|
8
|
+
onSome: (run) => run(context, task),
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYpD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAiB,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAkB,EAAQ,EAAE;IACzD,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAS,OAAuB,EAAE,IAAkB,EAAU,EAAE,CAC5F,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;IACnC,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;CACpC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe.d.ts","sourceRoot":"","sources":["../../src/internal/dedupe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAqB,MAAM,QAAQ,CAAC;AAI7D,eAAO,MAAM,IAAI,GAAI,MAAM,EAAE,OAAO,EAAE,YAAY,SACzC,OAAO,SACP,MAAM,WACJ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,KACpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAsBxC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Duration, Effect, Option, Predicate } from "effect";
|
|
2
|
+
const inFlight = new WeakMap();
|
|
3
|
+
export const once = (value, owner, capture) => Effect.suspend(() => {
|
|
4
|
+
const key = Predicate.isObjectKeyword(value) ? Option.some(value) : Option.none();
|
|
5
|
+
return Option.match(key, {
|
|
6
|
+
onNone: () => capture.pipe(Effect.asVoid),
|
|
7
|
+
onSome: (object) => {
|
|
8
|
+
const owners = inFlight.get(object) ?? new WeakSet();
|
|
9
|
+
if (owners.has(owner))
|
|
10
|
+
return Effect.succeed(undefined);
|
|
11
|
+
inFlight.set(object, owners);
|
|
12
|
+
owners.add(owner);
|
|
13
|
+
return capture.pipe(Effect.asVoid, Effect.ensuring(Effect.sleep(Duration.millis(0)).pipe(Effect.andThen(Effect.sync(() => owners.delete(owner))), Effect.forkDetach, Effect.asVoid)));
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=dedupe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe.js","sourceRoot":"","sources":["../../src/internal/dedupe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE7D,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA2B,CAAC;AAExD,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,KAAc,EACd,KAAa,EACb,OAAqD,EACT,EAAE,CAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;IAClB,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClF,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACzC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,EAAU,CAAC;YAC7D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxD,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,IAAI,CACjB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACnC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EACvD,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,MAAM,CACd,CACF,CACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Effect, type Scope } from "effect";
|
|
2
|
+
export interface FatalAdapterShape {
|
|
3
|
+
readonly install: (onFatal: (value: unknown) => boolean) => () => void;
|
|
4
|
+
readonly onFirstFatal: (value: unknown) => void;
|
|
5
|
+
readonly finishFatal: (value: unknown) => void;
|
|
6
|
+
readonly finishDuplicateFatal: (value: unknown) => void;
|
|
7
|
+
}
|
|
8
|
+
declare const FatalAdapter_base: Context.ServiceClass<FatalAdapter, "@supainc/supacatch-core/internal/FatalAdapter", FatalAdapterShape>;
|
|
9
|
+
export declare class FatalAdapter extends FatalAdapter_base {
|
|
10
|
+
}
|
|
11
|
+
export declare const beforeFatal: (capture: Effect.Effect<unknown, unknown>) => Effect.Effect<void>;
|
|
12
|
+
export declare const captureBeforeFatal: (capture: Effect.Effect<unknown, unknown>) => Promise<void>;
|
|
13
|
+
export declare const installFatalCapture: (capture: (value: unknown) => Promise<void>) => Effect.Effect<() => void, never, FatalAdapter>;
|
|
14
|
+
export declare const installFatalCaptureScoped: (capture: (value: unknown) => Promise<void>) => Effect.Effect<() => void, never, FatalAdapter | Scope.Scope>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=fatal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fatal.d.ts","sourceRoot":"","sources":["../../src/internal/fatal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,EAAsB,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEnF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,KAAK,MAAM,IAAI,CAAC;IACvE,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzD;;AAED,qBAAa,YAAa,SAAQ,iBAEjC;CAAG;AAWJ,eAAO,MAAM,WAAW,YAAa,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CACA,CAAC;AAE1F,eAAO,MAAM,kBAAkB,YAAa,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,IAAI,CACjD,CAAC;AAE1C,eAAO,MAAM,mBAAmB,oBACb,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,mDAyC1C,CAAC;AAEH,eAAO,MAAM,yBAAyB,YAC3B,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KACzC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC,KAAK,CAC0B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Context, Duration, Effect, MutableRef, Option } from "effect";
|
|
2
|
+
export class FatalAdapter extends Context.Service()("@supainc/supacatch-core/internal/FatalAdapter") {
|
|
3
|
+
}
|
|
4
|
+
const fatalDeliveryDeadline = Duration.seconds(2);
|
|
5
|
+
const activeGlobalHandlerRegistration = MutableRef.make(Option.none());
|
|
6
|
+
export const beforeFatal = (capture) => Effect.raceFirst(capture.pipe(Effect.ignoreCause), Effect.sleep(fatalDeliveryDeadline));
|
|
7
|
+
export const captureBeforeFatal = (capture) => Effect.runPromise(beforeFatal(capture));
|
|
8
|
+
export const installFatalCapture = Effect.fn("SupaCatch.installFatalCapture")(function* (capture) {
|
|
9
|
+
const adapter = yield* FatalAdapter;
|
|
10
|
+
const token = Symbol("SupaCatchFatalCapture");
|
|
11
|
+
const handlingFatal = MutableRef.make(false);
|
|
12
|
+
const removeHandlers = adapter.install((value) => {
|
|
13
|
+
if (!MutableRef.compareAndSet(handlingFatal, false, true)) {
|
|
14
|
+
adapter.finishDuplicateFatal(value);
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
Effect.runSync(Effect.sync(() => adapter.onFirstFatal(value)).pipe(Effect.ignoreCause));
|
|
18
|
+
void capture(value).finally(() => adapter.finishFatal(value));
|
|
19
|
+
return true;
|
|
20
|
+
});
|
|
21
|
+
const deactivated = MutableRef.make(false);
|
|
22
|
+
const deactivate = () => {
|
|
23
|
+
if (!MutableRef.compareAndSet(deactivated, false, true))
|
|
24
|
+
return;
|
|
25
|
+
removeHandlers();
|
|
26
|
+
};
|
|
27
|
+
const previous = MutableRef.getAndSet(activeGlobalHandlerRegistration, Option.some({ token, deactivate }));
|
|
28
|
+
Option.match(previous, {
|
|
29
|
+
onNone: () => undefined,
|
|
30
|
+
onSome: (registration) => registration.deactivate(),
|
|
31
|
+
});
|
|
32
|
+
return () => {
|
|
33
|
+
const isCurrent = Option.exists(MutableRef.get(activeGlobalHandlerRegistration), (registration) => registration.token === token);
|
|
34
|
+
if (!isCurrent)
|
|
35
|
+
return;
|
|
36
|
+
MutableRef.set(activeGlobalHandlerRegistration, Option.none());
|
|
37
|
+
deactivate();
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
export const installFatalCaptureScoped = (capture) => Effect.acquireRelease(installFatalCapture(capture), (dispose) => Effect.sync(dispose));
|
|
41
|
+
//# sourceMappingURL=fatal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fatal.js","sourceRoot":"","sources":["../../src/internal/fatal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
2
|
+
import type { SdkConfig } from "../config.js";
|
|
3
|
+
import type { InvalidConfigurationError } from "../errors.js";
|
|
4
|
+
import { SupaCatch } from "../effect.js";
|
|
5
|
+
import { type SupaCatchClient } from "../client.js";
|
|
6
|
+
import { type FatalAdapterShape } from "./fatal.js";
|
|
7
|
+
export declare const init: (config: SdkConfig, adapter: FatalAdapterShape) => SupaCatchClient;
|
|
8
|
+
export declare const layer: (config: SdkConfig, adapter: FatalAdapterShape) => Layer.Layer<SupaCatch, InvalidConfigurationError>;
|
|
9
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/internal/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAA2B,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAGL,KAAK,iBAAiB,EAGvB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,IAAI,WAAY,SAAS,WAAW,iBAAiB,KAAG,eAmBpE,CAAC;AAEF,eAAO,MAAM,KAAK,WACR,SAAS,WACR,iBAAiB,KACzB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,yBAAyB,CAckC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Effect, Layer } from "effect";
|
|
2
|
+
import { FetchHttpClient } from "effect/unstable/http";
|
|
3
|
+
import { layer as supaCatchLayer, SupaCatch } from "../effect.js";
|
|
4
|
+
import { createClient } from "../client.js";
|
|
5
|
+
import { registerAutomatic } from "./automatic.js";
|
|
6
|
+
import { captureBeforeFatal, FatalAdapter, installFatalCapture, installFatalCaptureScoped, } from "./fatal.js";
|
|
7
|
+
export const init = (config, adapter) => {
|
|
8
|
+
const client = createClient(config);
|
|
9
|
+
const removeHandlers = Effect.runSync(installFatalCapture((value) => captureBeforeFatal(Effect.tryPromise(() => client.captureException(value)))).pipe(Effect.provideService(FatalAdapter, adapter)));
|
|
10
|
+
const deactivateClient = registerAutomatic((value) => Effect.tryPromise(() => client.captureException(value)));
|
|
11
|
+
return {
|
|
12
|
+
captureException: client.captureException,
|
|
13
|
+
dispose: () => {
|
|
14
|
+
deactivateClient();
|
|
15
|
+
removeHandlers();
|
|
16
|
+
client.dispose();
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export const layer = (config, adapter) => Layer.effect(SupaCatch, Effect.gen(function* () {
|
|
21
|
+
const service = yield* SupaCatch;
|
|
22
|
+
yield* Effect.acquireRelease(Effect.sync(() => registerAutomatic(service.captureException)), (deactivate) => Effect.sync(deactivate));
|
|
23
|
+
yield* installFatalCaptureScoped((value) => captureBeforeFatal(service.captureException(value)));
|
|
24
|
+
return service;
|
|
25
|
+
}).pipe(Effect.provideService(FatalAdapter, adapter))).pipe(Layer.provide(supaCatchLayer(config)), Layer.provide(FetchHttpClient.layer));
|
|
26
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/internal/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,YAAY,EAAwB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,YAAY,EAEZ,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAiB,EAAE,OAA0B,EAAmB,EAAE;IACrF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CACnC,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAC5E,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CACrD,CAAC;IAEF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CACxD,CAAC;IACF,OAAO;QACL,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,OAAO,EAAE,GAAG,EAAE;YACZ,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,MAAiB,EACjB,OAA0B,EACyB,EAAE,CACrD,KAAK,CAAC,MAAM,CACV,SAAS,EACT,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;IACjC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAC9D,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CAAC;IACF,KAAK,CAAC,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,EAAE,CACzC,kBAAkB,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CACpD,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CACtD,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@supainc/supacatch-core",
|
|
3
|
+
"version": "0.1.0-alpha.6",
|
|
4
|
+
"description": "Core SupaCatch JavaScript SDK",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/supainc/supacatch-js.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"type": "module",
|
|
15
|
+
"sideEffects": [
|
|
16
|
+
"./dist/internal/automatic.js"
|
|
17
|
+
],
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./effect": {
|
|
24
|
+
"types": "./dist/effect.d.ts",
|
|
25
|
+
"import": "./dist/effect.js"
|
|
26
|
+
},
|
|
27
|
+
"./adapter": {
|
|
28
|
+
"types": "./dist/adapter.d.ts",
|
|
29
|
+
"import": "./dist/adapter.js"
|
|
30
|
+
},
|
|
31
|
+
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public",
|
|
35
|
+
"provenance": true
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -b tsconfig.build.json",
|
|
39
|
+
"publint": "publint"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"effect": "4.0.0-beta.103"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20.19.0"
|
|
46
|
+
}
|
|
47
|
+
}
|