@livestore/utils 0.0.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.
- package/dist/.tsbuildinfo.json +1 -0
- package/dist/Deferred.d.ts +10 -0
- package/dist/Deferred.d.ts.map +1 -0
- package/dist/Deferred.js +18 -0
- package/dist/Deferred.js.map +1 -0
- package/dist/NoopTracer.d.ts +9 -0
- package/dist/NoopTracer.d.ts.map +1 -0
- package/dist/NoopTracer.js +54 -0
- package/dist/NoopTracer.js.map +1 -0
- package/dist/base64.d.ts +12 -0
- package/dist/base64.d.ts.map +1 -0
- package/dist/base64.js +114 -0
- package/dist/base64.js.map +1 -0
- package/dist/binary.d.ts +4 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +23 -0
- package/dist/binary.js.map +1 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +28 -0
- package/dist/browser.js.map +1 -0
- package/dist/effect/Debounce.d.ts +5 -0
- package/dist/effect/Debounce.d.ts.map +1 -0
- package/dist/effect/Debounce.js +33 -0
- package/dist/effect/Debounce.js.map +1 -0
- package/dist/effect/Effect.d.ts +7 -0
- package/dist/effect/Effect.d.ts.map +1 -0
- package/dist/effect/Effect.js +17 -0
- package/dist/effect/Effect.js.map +1 -0
- package/dist/effect/EndableQueue.d.ts +11 -0
- package/dist/effect/EndableQueue.d.ts.map +1 -0
- package/dist/effect/EndableQueue.js +22 -0
- package/dist/effect/EndableQueue.js.map +1 -0
- package/dist/effect/EnvVar.d.ts +16 -0
- package/dist/effect/EnvVar.d.ts.map +1 -0
- package/dist/effect/EnvVar.js +21 -0
- package/dist/effect/EnvVar.js.map +1 -0
- package/dist/effect/Error.d.ts +12 -0
- package/dist/effect/Error.d.ts.map +1 -0
- package/dist/effect/Error.js +13 -0
- package/dist/effect/Error.js.map +1 -0
- package/dist/effect/Gate.d.ts +14 -0
- package/dist/effect/Gate.d.ts.map +1 -0
- package/dist/effect/Gate.js +17 -0
- package/dist/effect/Gate.js.map +1 -0
- package/dist/effect/Layer.d.ts +6 -0
- package/dist/effect/Layer.d.ts.map +1 -0
- package/dist/effect/Layer.js +11 -0
- package/dist/effect/Layer.js.map +1 -0
- package/dist/effect/Otel/Dummy.d.ts +5 -0
- package/dist/effect/Otel/Dummy.d.ts.map +1 -0
- package/dist/effect/Otel/Dummy.js +22 -0
- package/dist/effect/Otel/Dummy.js.map +1 -0
- package/dist/effect/Otel/Meter.d.ts +20 -0
- package/dist/effect/Otel/Meter.d.ts.map +1 -0
- package/dist/effect/Otel/Meter.js +76 -0
- package/dist/effect/Otel/Meter.js.map +1 -0
- package/dist/effect/Otel/OtlpGrpc.d.ts +6 -0
- package/dist/effect/Otel/OtlpGrpc.d.ts.map +1 -0
- package/dist/effect/Otel/OtlpGrpc.js +42 -0
- package/dist/effect/Otel/OtlpGrpc.js.map +1 -0
- package/dist/effect/Otel/OtlpHttp.d.ts +6 -0
- package/dist/effect/Otel/OtlpHttp.d.ts.map +1 -0
- package/dist/effect/Otel/OtlpHttp.js +42 -0
- package/dist/effect/Otel/OtlpHttp.js.map +1 -0
- package/dist/effect/Otel/OtlpWebsocket.d.ts +6 -0
- package/dist/effect/Otel/OtlpWebsocket.d.ts.map +1 -0
- package/dist/effect/Otel/OtlpWebsocket.js +42 -0
- package/dist/effect/Otel/OtlpWebsocket.js.map +1 -0
- package/dist/effect/Otel/Span.d.ts +32 -0
- package/dist/effect/Otel/Span.d.ts.map +1 -0
- package/dist/effect/Otel/Span.js +97 -0
- package/dist/effect/Otel/Span.js.map +1 -0
- package/dist/effect/Otel/Tracer.d.ts +15 -0
- package/dist/effect/Otel/Tracer.d.ts.map +1 -0
- package/dist/effect/Otel/Tracer.js +17 -0
- package/dist/effect/Otel/Tracer.js.map +1 -0
- package/dist/effect/Otel/index.d.ts +8 -0
- package/dist/effect/Otel/index.d.ts.map +1 -0
- package/dist/effect/Otel/index.js +9 -0
- package/dist/effect/Otel/index.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.d.ts +14 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.js +15 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.d.ts +14 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.js +15 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.d.ts +19 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.js +17 -0
- package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/MetricsProvider.d.ts +10 -0
- package/dist/effect/Otel/lib-metrics/MetricsProvider.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/MetricsProvider.js +4 -0
- package/dist/effect/Otel/lib-metrics/MetricsProvider.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.d.ts +16 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.js +39 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.d.ts +16 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.js +39 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.d.ts +16 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.js +39 -0
- package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.js.map +1 -0
- package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.d.ts +17 -0
- package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.d.ts.map +1 -0
- package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.js +27 -0
- package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.d.ts +18 -0
- package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.js +31 -0
- package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.d.ts +19 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.js +36 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.d.ts +19 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.js +36 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.d.ts +9 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.js +29 -0
- package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/SimpleProcessor.d.ts +19 -0
- package/dist/effect/Otel/lib-tracer/SimpleProcessor.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/SimpleProcessor.js +25 -0
- package/dist/effect/Otel/lib-tracer/SimpleProcessor.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/TracerProvider.d.ts +10 -0
- package/dist/effect/Otel/lib-tracer/TracerProvider.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/TracerProvider.js +7 -0
- package/dist/effect/Otel/lib-tracer/TracerProvider.js.map +1 -0
- package/dist/effect/Otel/lib-tracer/WebProvider.d.ts +18 -0
- package/dist/effect/Otel/lib-tracer/WebProvider.d.ts.map +1 -0
- package/dist/effect/Otel/lib-tracer/WebProvider.js +25 -0
- package/dist/effect/Otel/lib-tracer/WebProvider.js.map +1 -0
- package/dist/effect/ReadonlyArray.d.ts +4 -0
- package/dist/effect/ReadonlyArray.d.ts.map +1 -0
- package/dist/effect/ReadonlyArray.js +11 -0
- package/dist/effect/ReadonlyArray.js.map +1 -0
- package/dist/effect/RequestResolver.d.ts +11 -0
- package/dist/effect/RequestResolver.d.ts.map +1 -0
- package/dist/effect/RequestResolver.js +18 -0
- package/dist/effect/RequestResolver.js.map +1 -0
- package/dist/effect/STM.d.ts +3 -0
- package/dist/effect/STM.d.ts.map +1 -0
- package/dist/effect/STM.js +3 -0
- package/dist/effect/STM.js.map +1 -0
- package/dist/effect/Schedule.d.ts +5 -0
- package/dist/effect/Schedule.d.ts.map +1 -0
- package/dist/effect/Schedule.js +7 -0
- package/dist/effect/Schedule.js.map +1 -0
- package/dist/effect/Scheduler.d.ts +49 -0
- package/dist/effect/Scheduler.d.ts.map +1 -0
- package/dist/effect/Scheduler.js +168 -0
- package/dist/effect/Scheduler.js.map +1 -0
- package/dist/effect/Schema/SchemaHash.d.ts +3 -0
- package/dist/effect/Schema/SchemaHash.d.ts.map +1 -0
- package/dist/effect/Schema/SchemaHash.js +15 -0
- package/dist/effect/Schema/SchemaHash.js.map +1 -0
- package/dist/effect/Schema/SchemaHash.test.d.ts +2 -0
- package/dist/effect/Schema/SchemaHash.test.d.ts.map +1 -0
- package/dist/effect/Schema/SchemaHash.test.js +13 -0
- package/dist/effect/Schema/SchemaHash.test.js.map +1 -0
- package/dist/effect/Schema/SchemaJsonWrapper.d.ts +11 -0
- package/dist/effect/Schema/SchemaJsonWrapper.d.ts.map +1 -0
- package/dist/effect/Schema/SchemaJsonWrapper.js +38 -0
- package/dist/effect/Schema/SchemaJsonWrapper.js.map +1 -0
- package/dist/effect/Schema/SchemaJsonWrapper.test.d.ts +2 -0
- package/dist/effect/Schema/SchemaJsonWrapper.test.d.ts.map +1 -0
- package/dist/effect/Schema/SchemaJsonWrapper.test.js +42 -0
- package/dist/effect/Schema/SchemaJsonWrapper.test.js.map +1 -0
- package/dist/effect/Schema/index.d.ts +15 -0
- package/dist/effect/Schema/index.d.ts.map +1 -0
- package/dist/effect/Schema/index.js +14 -0
- package/dist/effect/Schema/index.js.map +1 -0
- package/dist/effect/ServiceContext.d.ts +39 -0
- package/dist/effect/ServiceContext.d.ts.map +1 -0
- package/dist/effect/ServiceContext.js +61 -0
- package/dist/effect/ServiceContext.js.map +1 -0
- package/dist/effect/SmartQueue.d.ts +38 -0
- package/dist/effect/SmartQueue.d.ts.map +1 -0
- package/dist/effect/SmartQueue.js +123 -0
- package/dist/effect/SmartQueue.js.map +1 -0
- package/dist/effect/Stream/chainSwitch.d.ts +3 -0
- package/dist/effect/Stream/chainSwitch.d.ts.map +1 -0
- package/dist/effect/Stream/chainSwitch.js +48 -0
- package/dist/effect/Stream/chainSwitch.js.map +1 -0
- package/dist/effect/Stream/index.d.ts +37 -0
- package/dist/effect/Stream/index.d.ts.map +1 -0
- package/dist/effect/Stream/index.js +82 -0
- package/dist/effect/Stream/index.js.map +1 -0
- package/dist/effect/SubscriptionRef.d.ts +10 -0
- package/dist/effect/SubscriptionRef.d.ts.map +1 -0
- package/dist/effect/SubscriptionRef.js +8 -0
- package/dist/effect/SubscriptionRef.js.map +1 -0
- package/dist/effect/TimeoutGate.d.ts +13 -0
- package/dist/effect/TimeoutGate.d.ts.map +1 -0
- package/dist/effect/TimeoutGate.js +41 -0
- package/dist/effect/TimeoutGate.js.map +1 -0
- package/dist/effect/WebCrypto.d.ts +18 -0
- package/dist/effect/WebCrypto.d.ts.map +1 -0
- package/dist/effect/WebCrypto.js +56 -0
- package/dist/effect/WebCrypto.js.map +1 -0
- package/dist/effect/WebLock.d.ts +5 -0
- package/dist/effect/WebLock.d.ts.map +1 -0
- package/dist/effect/WebLock.js +20 -0
- package/dist/effect/WebLock.js.map +1 -0
- package/dist/effect/browser.d.ts +19 -0
- package/dist/effect/browser.d.ts.map +1 -0
- package/dist/effect/browser.js +82 -0
- package/dist/effect/browser.js.map +1 -0
- package/dist/effect/fetch.d.ts +89 -0
- package/dist/effect/fetch.d.ts.map +1 -0
- package/dist/effect/fetch.js +142 -0
- package/dist/effect/fetch.js.map +1 -0
- package/dist/effect/index.d.ts +50 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +58 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/global.d.ts +5 -0
- package/dist/global.d.ts.map +1 -0
- package/dist/global.js +2 -0
- package/dist/global.js.map +1 -0
- package/dist/guards.d.ts +6 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +6 -0
- package/dist/guards.js.map +1 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -0
- package/dist/object/index.d.ts +10 -0
- package/dist/object/index.d.ts.map +1 -0
- package/dist/object/index.js +10 -0
- package/dist/object/index.js.map +1 -0
- package/dist/object/omit.d.ts +3 -0
- package/dist/object/omit.d.ts.map +1 -0
- package/dist/object/omit.js +14 -0
- package/dist/object/omit.js.map +1 -0
- package/dist/object/pick.d.ts +14 -0
- package/dist/object/pick.d.ts.map +1 -0
- package/dist/object/pick.js +17 -0
- package/dist/object/pick.js.map +1 -0
- package/dist/promise.d.ts +6 -0
- package/dist/promise.d.ts.map +1 -0
- package/dist/promise.js +27 -0
- package/dist/promise.js.map +1 -0
- package/dist/set.d.ts +2 -0
- package/dist/set.d.ts.map +1 -0
- package/dist/set.js +10 -0
- package/dist/set.js.map +1 -0
- package/dist/single-item.d.ts +8 -0
- package/dist/single-item.d.ts.map +1 -0
- package/dist/single-item.js +9 -0
- package/dist/single-item.js.map +1 -0
- package/dist/string.d.ts +3 -0
- package/dist/string.d.ts.map +1 -0
- package/dist/string.js +3 -0
- package/dist/string.js.map +1 -0
- package/dist/time.d.ts +12 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +22 -0
- package/dist/time.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/json.d.ts +27 -0
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/json.js +2 -0
- package/dist/types/json.js.map +1 -0
- package/package.json +58 -0
- package/src/Deferred.ts +24 -0
- package/src/NoopTracer.ts +75 -0
- package/src/base64.ts +118 -0
- package/src/browser.ts +32 -0
- package/src/effect/Effect.ts +27 -0
- package/src/effect/Error.ts +12 -0
- package/src/effect/Otel/Dummy.ts +32 -0
- package/src/effect/Otel/Meter.ts +145 -0
- package/src/effect/Otel/OtlpGrpc.ts +75 -0
- package/src/effect/Otel/OtlpHttp.ts +75 -0
- package/src/effect/Otel/OtlpWebsocket.ts +75 -0
- package/src/effect/Otel/Span.ts +222 -0
- package/src/effect/Otel/Tracer.ts +30 -0
- package/src/effect/Otel/index.ts +8 -0
- package/src/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.ts +39 -0
- package/src/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.ts +39 -0
- package/src/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.ts +47 -0
- package/src/effect/Otel/lib-metrics/MetricsProvider.ts +12 -0
- package/src/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.ts +77 -0
- package/src/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.ts +77 -0
- package/src/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.ts +80 -0
- package/src/effect/Otel/lib-metrics/PeriodicMetricsProvider.ts +55 -0
- package/src/effect/Otel/lib-tracer/BatchSpanProcessor.ts +58 -0
- package/src/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.ts +64 -0
- package/src/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.ts +64 -0
- package/src/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.ts +38 -0
- package/src/effect/Otel/lib-tracer/README.md +1 -0
- package/src/effect/Otel/lib-tracer/SimpleProcessor.ts +46 -0
- package/src/effect/Otel/lib-tracer/TracerProvider.ts +16 -0
- package/src/effect/Otel/lib-tracer/WebProvider.ts +48 -0
- package/src/effect/Schedule.ts +12 -0
- package/src/effect/ServiceContext.ts +116 -0
- package/src/effect/index.ts +65 -0
- package/src/global.ts +5 -0
- package/src/guards.ts +8 -0
- package/src/index.ts +217 -0
- package/src/object/index.ts +24 -0
- package/src/object/omit.ts +17 -0
- package/src/object/pick.ts +27 -0
- package/src/promise.ts +43 -0
- package/src/set.ts +10 -0
- package/src/string.ts +2 -0
- package/src/time.ts +25 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Context from '@effect/data/Context'
|
|
2
|
+
import type { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'
|
|
3
|
+
|
|
4
|
+
//
|
|
5
|
+
// ets_tracing Provider
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
export const TracerProviderSymbol = Symbol.for('effect-otel/TracerProvider')
|
|
9
|
+
export type TracerProviderSymbol = typeof TracerProviderSymbol
|
|
10
|
+
|
|
11
|
+
export interface TracerProvider {
|
|
12
|
+
readonly [TracerProviderSymbol]: TracerProviderSymbol
|
|
13
|
+
readonly tracerProvider: BasicTracerProvider
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const TracerProvider = Context.Tag<TracerProvider>(TracerProviderSymbol)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as Context from '@effect/data/Context'
|
|
2
|
+
import { identity, pipe } from '@effect/data/Function'
|
|
3
|
+
import * as Option from '@effect/data/Option'
|
|
4
|
+
import * as Effect from '@effect/io/Effect'
|
|
5
|
+
import * as Layer from '@effect/io/Layer'
|
|
6
|
+
import type { WebTracerConfig } from '@opentelemetry/sdk-trace-web'
|
|
7
|
+
import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'
|
|
8
|
+
|
|
9
|
+
import { TracerProvider, TracerProviderSymbol } from './TracerProvider.js'
|
|
10
|
+
|
|
11
|
+
export const WebTracerProviderConfigSymbol = Symbol.for('effect-otel/WebTracerProviderConfig')
|
|
12
|
+
type WebTracerProviderConfigSymbol = typeof WebTracerProviderConfigSymbol
|
|
13
|
+
|
|
14
|
+
export interface WebTracerProviderConfig {
|
|
15
|
+
[WebTracerProviderConfigSymbol]: WebTracerProviderConfigSymbol
|
|
16
|
+
|
|
17
|
+
readonly config: WebTracerConfig
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const WebTracerProviderConfig = Context.Tag<WebTracerProviderConfig>(WebTracerProviderConfigSymbol)
|
|
21
|
+
|
|
22
|
+
export const LiveWebTracerProviderConfig = (config: WebTracerConfig) =>
|
|
23
|
+
Layer.succeed(WebTracerProviderConfig, {
|
|
24
|
+
[WebTracerProviderConfigSymbol]: WebTracerProviderConfigSymbol,
|
|
25
|
+
config,
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
export const makeWebTracingProvider = Effect.gen(function* ($) {
|
|
29
|
+
const ctx = yield* $(Effect.context<never>())
|
|
30
|
+
|
|
31
|
+
const config = pipe(
|
|
32
|
+
Context.getOption(ctx, WebTracerProviderConfig),
|
|
33
|
+
Option.map((_) => _.config),
|
|
34
|
+
Option.getOrUndefined,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
const tracerProvider = yield* $(Effect.sync(() => new WebTracerProvider(config)))
|
|
38
|
+
|
|
39
|
+
return identity<TracerProvider>({
|
|
40
|
+
[TracerProviderSymbol]: TracerProviderSymbol,
|
|
41
|
+
tracerProvider,
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
export const WebProviderLayer = Layer.scoped(TracerProvider, makeWebTracingProvider)
|
|
46
|
+
|
|
47
|
+
export const WebProvider = (config?: WebTracerConfig) =>
|
|
48
|
+
config ? Layer.provide(LiveWebTracerProviderConfig(config), WebProviderLayer) : WebProviderLayer
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as Duration from '@effect/data/Duration'
|
|
2
|
+
import { pipe } from '@effect/data/Function'
|
|
3
|
+
import * as Schedule from '@effect/io/Schedule'
|
|
4
|
+
|
|
5
|
+
export * from '@effect/io/Schedule'
|
|
6
|
+
|
|
7
|
+
export const exponentialBackoff10Sec: Schedule.Schedule<never, unknown, Duration.DurationInput> = pipe(
|
|
8
|
+
Schedule.exponential(Duration.millis(10), 4), // 10ms, 40ms, 160ms, 640ms, 2560ms, ...
|
|
9
|
+
Schedule.andThenEither(Schedule.spaced(Duration.seconds(1))),
|
|
10
|
+
Schedule.compose(Schedule.elapsed),
|
|
11
|
+
Schedule.whileOutput(Duration.lessThanOrEqualTo(Duration.seconds(10))), // max 10 seconds
|
|
12
|
+
)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { pipe } from '@effect/data/Function'
|
|
2
|
+
import * as Cause from '@effect/io/Cause'
|
|
3
|
+
import * as Effect from '@effect/io/Effect'
|
|
4
|
+
import * as Exit from '@effect/io/Exit'
|
|
5
|
+
import * as Fiber from '@effect/io/Fiber'
|
|
6
|
+
import * as Layer from '@effect/io/Layer'
|
|
7
|
+
import type * as Runtime from '@effect/io/Runtime'
|
|
8
|
+
import * as Scope from '@effect/io/Scope'
|
|
9
|
+
|
|
10
|
+
export interface MainLayer<Ctx> {
|
|
11
|
+
layer: Layer.Layer<never, never, Ctx>
|
|
12
|
+
close: Effect.Effect<never, never, void>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const unsafeMainLayer = <Ctx>(original: Layer.Layer<never, never, Ctx>): MainLayer<Ctx> => {
|
|
16
|
+
const scope = Effect.runSync(Scope.make())
|
|
17
|
+
const layer = pipe(
|
|
18
|
+
original,
|
|
19
|
+
Layer.memoize,
|
|
20
|
+
Effect.parallelFinalizers, // NOTE this runs the layer teardown in parallel
|
|
21
|
+
Effect.provideService(Scope.Scope, scope),
|
|
22
|
+
Effect.runSync,
|
|
23
|
+
)
|
|
24
|
+
return { layer, close: Scope.close(scope, Exit.unit) }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const make = <TStaticData, Ctx>(
|
|
28
|
+
staticData: TStaticData,
|
|
29
|
+
runtime: Runtime.Runtime<Ctx>,
|
|
30
|
+
close: Effect.Effect<never, never, void> = Effect.dieMessage('close not implemented'),
|
|
31
|
+
): ServiceContext<Ctx, TStaticData> => {
|
|
32
|
+
return {
|
|
33
|
+
provide: (self) => Effect.provideSomeRuntime(runtime)(self),
|
|
34
|
+
runWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) =>
|
|
35
|
+
runWithErrorLog(Effect.provideSomeRuntime(runtime)(self)),
|
|
36
|
+
runSync: <E, A>(self: Effect.Effect<Ctx, E, A>) => Effect.runSync(Effect.provideSomeRuntime(runtime)(self)),
|
|
37
|
+
runPromiseWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) =>
|
|
38
|
+
runPromiseWithErrorLog(Effect.provideSomeRuntime(runtime)(self)),
|
|
39
|
+
runPromiseExit: <E, A>(self: Effect.Effect<Ctx, E, A>) =>
|
|
40
|
+
Effect.runPromiseExit(Effect.provideSomeRuntime(runtime)(self)),
|
|
41
|
+
runPromise: <E, A>(self: Effect.Effect<Ctx, E, A>) => Effect.runPromise(Effect.provideSomeRuntime(runtime)(self)),
|
|
42
|
+
withRuntime: (fn) => fn(runtime),
|
|
43
|
+
close: close,
|
|
44
|
+
closePromise: () => Effect.runPromise(close),
|
|
45
|
+
staticData,
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ServiceContext<Ctx, TStaticData> {
|
|
50
|
+
readonly provide: <E, A>(self: Effect.Effect<Ctx, E, A>) => Effect.Effect<never, E, A>
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Fire and Forget. Errors are logged however.
|
|
54
|
+
*/
|
|
55
|
+
readonly runWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) => AbortCallback
|
|
56
|
+
|
|
57
|
+
readonly runSync: <E, A>(self: Effect.Effect<Ctx, E, A>) => A
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Fire and Forget. A promise that never fails nor returns any value.
|
|
61
|
+
* Errors are logged however.
|
|
62
|
+
*/
|
|
63
|
+
readonly runPromiseWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) => Promise<A | undefined>
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* A Promise that never fails, the Resolved value is an Exit result that can be either Success or Failed
|
|
67
|
+
*/
|
|
68
|
+
readonly runPromiseExit: <E, A>(self: Effect.Effect<Ctx, E, A>) => Promise<Exit.Exit<E, A>>
|
|
69
|
+
readonly runPromise: <E, A>(self: Effect.Effect<Ctx, E, A>) => Promise<A>
|
|
70
|
+
|
|
71
|
+
readonly withRuntime: (fn: (runtime: Runtime.Runtime<Ctx>) => void) => void
|
|
72
|
+
|
|
73
|
+
/** Closes the ServiceContext and closing all its layers */
|
|
74
|
+
readonly close: Effect.Effect<never, never, void>
|
|
75
|
+
readonly closePromise: () => Promise<void>
|
|
76
|
+
readonly staticData: TStaticData
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type AbortCallback = () => void
|
|
80
|
+
|
|
81
|
+
export const runWithErrorLog = <E, A>(self: Effect.Effect<never, E, A>) => {
|
|
82
|
+
const fiber = Effect.runFork(self)
|
|
83
|
+
fiber.unsafeAddObserver((ex) => {
|
|
84
|
+
if (ex._tag === 'Failure' && Cause.isInterruptedOnly(ex.cause) === false) {
|
|
85
|
+
console.error(Cause.pretty(ex.cause))
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
return () => {
|
|
89
|
+
Effect.runFork(Fiber.interrupt(fiber))
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export const runPromiseWithErrorLog = <E, A>(self: Effect.Effect<never, E, A>) =>
|
|
94
|
+
Effect.runPromiseExit(self).then((ex) => {
|
|
95
|
+
if (ex._tag === 'Failure') {
|
|
96
|
+
console.error(Cause.pretty(ex.cause))
|
|
97
|
+
return undefined
|
|
98
|
+
} else {
|
|
99
|
+
return ex.value
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
export const MissingContext = Effect.die('service context not provided, wrap your app in LiveServiceContext')
|
|
104
|
+
|
|
105
|
+
export const empty = <Ctx, TStaticData>(): ServiceContext<Ctx, TStaticData> => ({
|
|
106
|
+
provide: () => MissingContext,
|
|
107
|
+
runWithErrorLog: () => runWithErrorLog(MissingContext),
|
|
108
|
+
runSync: () => Effect.runSync(MissingContext),
|
|
109
|
+
runPromiseWithErrorLog: () => runPromiseWithErrorLog(MissingContext),
|
|
110
|
+
runPromiseExit: () => Effect.runPromiseExit(MissingContext),
|
|
111
|
+
runPromise: () => Effect.runPromise(MissingContext),
|
|
112
|
+
withRuntime: () => Effect.runSync(MissingContext),
|
|
113
|
+
close: Effect.dieMessage('Empty ServiceContext cannot be closed'),
|
|
114
|
+
closePromise: () => Promise.reject('Empty ServiceContext cannot be closed'),
|
|
115
|
+
staticData: {} as TStaticData,
|
|
116
|
+
})
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import '../global.js'
|
|
2
|
+
|
|
3
|
+
// io
|
|
4
|
+
export * as Effect from './Effect.js'
|
|
5
|
+
export * as Scope from '@effect/io/Scope'
|
|
6
|
+
export * as Schedule from './Schedule.js'
|
|
7
|
+
export * as Layer from '@effect/io/Layer'
|
|
8
|
+
export * as Ref from '@effect/io/Ref'
|
|
9
|
+
export * as SynchronizedRef from '@effect/io/SynchronizedRef'
|
|
10
|
+
export * as Queue from '@effect/io/Queue'
|
|
11
|
+
export * as Fiber from '@effect/io/Fiber'
|
|
12
|
+
export * as FiberId from '@effect/io/FiberId'
|
|
13
|
+
export * as RuntimeFlags from '@effect/io/RuntimeFlags'
|
|
14
|
+
export * as Hub from '@effect/io/Hub'
|
|
15
|
+
export * as Exit from '@effect/io/Exit'
|
|
16
|
+
export * as Cause from '@effect/io/Cause'
|
|
17
|
+
export * as Runtime from '@effect/io/Runtime'
|
|
18
|
+
export * as Scheduler from '@effect/io/Scheduler'
|
|
19
|
+
export * as FiberRef from '@effect/io/FiberRef'
|
|
20
|
+
export * as FiberRefs from '@effect/io/FiberRefs'
|
|
21
|
+
export * as FiberRefsPatch from '@effect/io/FiberRefsPatch'
|
|
22
|
+
export * as Deferred from '@effect/io/Deferred'
|
|
23
|
+
export * as Metric from '@effect/io/Metric'
|
|
24
|
+
export * as MetricState from '@effect/io/MetricState'
|
|
25
|
+
export * as Request from '@effect/io/Request'
|
|
26
|
+
|
|
27
|
+
// data
|
|
28
|
+
export * as Context from '@effect/data/Context'
|
|
29
|
+
export * as Data from '@effect/data/Data'
|
|
30
|
+
export { TaggedClass as Tagged } from '@effect/data/Data'
|
|
31
|
+
export * as Either from '@effect/data/Either'
|
|
32
|
+
export * as Brand from '@effect/data/Brand'
|
|
33
|
+
export * as Hash from '@effect/data/Hash'
|
|
34
|
+
export * as Equal from '@effect/data/Equal'
|
|
35
|
+
export * as Ord from '@effect/data/Order'
|
|
36
|
+
export * as Chunk from '@effect/data/Chunk'
|
|
37
|
+
export * as Duration from '@effect/data/Duration'
|
|
38
|
+
export * as ReadonlyArray from '@effect/data/ReadonlyArray'
|
|
39
|
+
export * as ReadonlyRecord from '@effect/data/ReadonlyRecord'
|
|
40
|
+
export * as SortedMap from '@effect/data/SortedMap'
|
|
41
|
+
export * as HashMap from '@effect/data/HashMap'
|
|
42
|
+
export * as HashSet from '@effect/data/HashSet'
|
|
43
|
+
export * as MutableHashSet from '@effect/data/MutableHashSet'
|
|
44
|
+
export * as Option from '@effect/data/Option'
|
|
45
|
+
export { pipe, identity } from '@effect/data/Function'
|
|
46
|
+
|
|
47
|
+
// stream
|
|
48
|
+
export * as Stream from '@effect/stream/Stream'
|
|
49
|
+
export * as Channel from '@effect/stream/Channel'
|
|
50
|
+
export * as SubscriptionRef from '@effect/stream/SubscriptionRef'
|
|
51
|
+
|
|
52
|
+
// schema
|
|
53
|
+
export * as Schema from '@effect/schema/Schema'
|
|
54
|
+
|
|
55
|
+
// match
|
|
56
|
+
export * as Match from '@effect/match'
|
|
57
|
+
|
|
58
|
+
// otel
|
|
59
|
+
export * as Otel from './Otel/index.js'
|
|
60
|
+
|
|
61
|
+
// error
|
|
62
|
+
export * from './Error.js'
|
|
63
|
+
|
|
64
|
+
// ServiceContext
|
|
65
|
+
export * as ServiceContext from './ServiceContext.js'
|
package/src/global.ts
ADDED
package/src/guards.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const isNotUndefined = <T>(_: T | undefined): _ is T => _ !== undefined
|
|
2
|
+
|
|
3
|
+
export const isNotNull = <T>(_: T | null): _ is T => _ !== null
|
|
4
|
+
export const isUndefined = <T>(_: T | undefined): _ is undefined => _ === undefined
|
|
5
|
+
|
|
6
|
+
export const isNil = (val: any): val is null | undefined => val === null || val === undefined
|
|
7
|
+
|
|
8
|
+
export const isNotNil = <T>(val: T | undefined | null): val is T => val !== null && val !== undefined
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
export * from './string.js'
|
|
2
|
+
export * from './guards.js'
|
|
3
|
+
export * from './object/index.js'
|
|
4
|
+
export * from './promise.js'
|
|
5
|
+
export * from './time.js'
|
|
6
|
+
export * from './NoopTracer.js'
|
|
7
|
+
export * from './set.js'
|
|
8
|
+
export * from './browser.js'
|
|
9
|
+
export * from './Deferred.js'
|
|
10
|
+
export * as base64 from './base64.js'
|
|
11
|
+
export { default as prettyBytes } from 'pretty-bytes'
|
|
12
|
+
|
|
13
|
+
export { v4 as uuid } from 'uuid'
|
|
14
|
+
|
|
15
|
+
import type * as otel from '@opentelemetry/api'
|
|
16
|
+
|
|
17
|
+
export * as dateFns from 'date-fns'
|
|
18
|
+
|
|
19
|
+
export type Prettify<T> = T extends infer U ? { [K in keyof U]: Prettify<U[K]> } : never
|
|
20
|
+
export type PrettifyFlat<T> = T extends infer U ? { [K in keyof U]: U[K] } : never
|
|
21
|
+
|
|
22
|
+
export type TypeEq<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false
|
|
23
|
+
|
|
24
|
+
/** `A` is subtype of `B` */
|
|
25
|
+
export type IsSubtype<A, B> = A extends B ? true : false
|
|
26
|
+
export type AssertTrue<T extends true> = T
|
|
27
|
+
|
|
28
|
+
export type Writeable<T> = { -readonly [P in keyof T]: T[P] }
|
|
29
|
+
export type DeepWriteable<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> }
|
|
30
|
+
|
|
31
|
+
export type Primitive = null | undefined | string | number | boolean | symbol | bigint
|
|
32
|
+
|
|
33
|
+
export type LiteralUnion<LiteralType, BaseType extends Primitive> = LiteralType | (BaseType & Record<never, never>)
|
|
34
|
+
|
|
35
|
+
export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
|
|
36
|
+
|
|
37
|
+
export const times = (n: number, fn: (index: number) => {}): void => {
|
|
38
|
+
for (let i = 0; i < n; i++) {
|
|
39
|
+
fn(i)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const debugCatch = <T>(try_: () => T): T => {
|
|
44
|
+
try {
|
|
45
|
+
return try_()
|
|
46
|
+
} catch (e: any) {
|
|
47
|
+
debugger
|
|
48
|
+
throw e
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const recRemoveUndefinedValues = (val: any): void => {
|
|
53
|
+
if (Array.isArray(val)) {
|
|
54
|
+
val.forEach(recRemoveUndefinedValues)
|
|
55
|
+
} else if (typeof val === 'object') {
|
|
56
|
+
Object.keys(val).forEach((key) => {
|
|
57
|
+
if (val[key] === undefined) {
|
|
58
|
+
delete val[key]
|
|
59
|
+
} else {
|
|
60
|
+
recRemoveUndefinedValues(val[key])
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const debugDeepCopy = <T>(val: T): T => JSON.parse(JSON.stringify(val))
|
|
67
|
+
|
|
68
|
+
export const prop =
|
|
69
|
+
<T extends {}, K extends keyof T>(key: K) =>
|
|
70
|
+
(obj: T): T[K] =>
|
|
71
|
+
obj[key]
|
|
72
|
+
|
|
73
|
+
export const objectToString = (error: any): string => {
|
|
74
|
+
const stack = typeof process !== 'undefined' && process.env.CL_DEBUG ? error.stack : undefined
|
|
75
|
+
const str = error.toString()
|
|
76
|
+
const stackStr = stack ? `\n${stack}` : ''
|
|
77
|
+
if (str !== '[object Object]') return str + stackStr
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
return JSON.stringify({ ...error, stack }, null, 2)
|
|
81
|
+
} catch (e: any) {
|
|
82
|
+
console.log(error)
|
|
83
|
+
|
|
84
|
+
return 'Error while printing error: ' + e
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const errorToString = objectToString
|
|
89
|
+
|
|
90
|
+
export const capitalizeFirstLetter = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1)
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Use this to make assertion at end of if-else chain that all members of a
|
|
94
|
+
* union have been accounted for.
|
|
95
|
+
*/
|
|
96
|
+
/* eslint-disable-next-line prefer-arrow/prefer-arrow-functions */
|
|
97
|
+
export function casesHandled(unexpectedCase: never): never {
|
|
98
|
+
debugger
|
|
99
|
+
throw new Error(`A case was not handled for value: ${truncate(objectToString(unexpectedCase), 1000)}`)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const shouldNeverHappen = (msg?: string): never => {
|
|
103
|
+
debugger
|
|
104
|
+
throw new Error(`This should never happen ${msg}`)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const assertNever = (failIfFalse: boolean, msg?: string): void => {
|
|
108
|
+
if (failIfFalse === false) {
|
|
109
|
+
debugger
|
|
110
|
+
throw new Error(`This should never happen ${msg}`)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export const debuggerPipe = <T>(val: T): T => {
|
|
115
|
+
debugger
|
|
116
|
+
return val
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const truncate = (str: string, length: number): string => {
|
|
120
|
+
if (str.length > length) {
|
|
121
|
+
return str.slice(0, length) + '...'
|
|
122
|
+
} else {
|
|
123
|
+
return str
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export const notYetImplemented = (msg?: string): never => {
|
|
128
|
+
debugger
|
|
129
|
+
throw new Error(`Not yet implemented ${msg}`)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const noop = () => {}
|
|
133
|
+
|
|
134
|
+
export type Thunk<T> = () => T
|
|
135
|
+
|
|
136
|
+
export const unwrapThunk = <T>(_: T | (() => T)): T => {
|
|
137
|
+
if (typeof _ === 'function') {
|
|
138
|
+
return (_ as any)()
|
|
139
|
+
} else {
|
|
140
|
+
return _
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export type NullableFieldsToOptional<T> = PrettifyFlat<
|
|
145
|
+
Partial<T> & {
|
|
146
|
+
[K in keyof T as null extends T[K] ? K : never]?: Exclude<T[K], null>
|
|
147
|
+
} & {
|
|
148
|
+
[K in keyof T as null extends T[K] ? never : K]: T[K]
|
|
149
|
+
}
|
|
150
|
+
>
|
|
151
|
+
|
|
152
|
+
/** `end` is not included */
|
|
153
|
+
export const range = (start: number, end: number): number[] => {
|
|
154
|
+
const length = end - start
|
|
155
|
+
return Array.from({ length }, (_, i) => start + i)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export const throttle = (fn: () => void, ms: number) => {
|
|
159
|
+
let shouldWait = false
|
|
160
|
+
let shouldCallAgain = false
|
|
161
|
+
|
|
162
|
+
const timeoutFunc = () => {
|
|
163
|
+
if (shouldCallAgain) {
|
|
164
|
+
fn()
|
|
165
|
+
shouldCallAgain = false
|
|
166
|
+
setTimeout(timeoutFunc, ms)
|
|
167
|
+
} else {
|
|
168
|
+
shouldWait = false
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return () => {
|
|
173
|
+
if (shouldWait) {
|
|
174
|
+
shouldCallAgain = true
|
|
175
|
+
return
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
fn()
|
|
179
|
+
shouldWait = true
|
|
180
|
+
setTimeout(timeoutFunc, ms)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export const getTraceParentHeader = (parentSpan: otel.Span) => {
|
|
185
|
+
const spanContext = parentSpan.spanContext()
|
|
186
|
+
// Format: {version}-{trace_id}-{span_id}-{trace_flags}
|
|
187
|
+
// https://www.w3.org/TR/trace-context/#examples-of-http-traceparent-headers
|
|
188
|
+
return `00-${spanContext.traceId}-${spanContext.spanId}-01`
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export const assertTag = <TObj extends { _tag: string }, TTag extends TObj['_tag']>(
|
|
192
|
+
obj: TObj,
|
|
193
|
+
tag: TTag,
|
|
194
|
+
): Extract<TObj, { _tag: TTag }> => {
|
|
195
|
+
if (obj._tag !== tag) {
|
|
196
|
+
throw new Error(`Expected tag ${tag} but got ${obj._tag}`)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return obj as any
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export const getEnv = (varName: string) => {
|
|
203
|
+
let value: string | undefined
|
|
204
|
+
|
|
205
|
+
// @ts-expect-error `import.meta.env` might not be defined
|
|
206
|
+
if (import.meta.env !== undefined) {
|
|
207
|
+
// @ts-expect-error `import.meta.env` might not be defined
|
|
208
|
+
value = import.meta.env[varName]
|
|
209
|
+
// eslint-disable-next-line unicorn/no-negated-condition
|
|
210
|
+
} else if (globalThis.process?.env !== undefined) {
|
|
211
|
+
value = globalThis.process.env[varName]
|
|
212
|
+
} else {
|
|
213
|
+
throw new Error(`No environment variables found (neither import.meta.env nor process.env)`)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return value
|
|
217
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { pipe } from '@effect/data/Function'
|
|
2
|
+
|
|
3
|
+
export * from './pick.js'
|
|
4
|
+
export * from './omit.js'
|
|
5
|
+
|
|
6
|
+
type ValueOfRecord<R extends Record<any, any>> = R extends Record<any, infer V> ? V : never
|
|
7
|
+
|
|
8
|
+
export const mapObjectValues = <O_In extends Record<string, any>, V_Out>(
|
|
9
|
+
obj: O_In,
|
|
10
|
+
mapValue: (key: keyof O_In, val: ValueOfRecord<O_In>) => V_Out,
|
|
11
|
+
): { [K in keyof O_In]: V_Out } => {
|
|
12
|
+
const mappedEntries = Object.entries(obj).map(([key, val]) => [key, mapValue(key as keyof O_In, val)] as const)
|
|
13
|
+
return Object.fromEntries(mappedEntries) as any
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][]
|
|
17
|
+
|
|
18
|
+
export const objectEntries = <T extends Record<string, any>>(obj: T): Entries<T> => Object.entries(obj) as Entries<T>
|
|
19
|
+
|
|
20
|
+
export const keyObjectFromObject = <TObj extends Record<string, any>>(obj: TObj): { [K in keyof TObj]: K } =>
|
|
21
|
+
pipe(
|
|
22
|
+
objectEntries(obj).map(([k]) => [k, k]),
|
|
23
|
+
Object.fromEntries,
|
|
24
|
+
) as any
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
|
|
2
|
+
// type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
|
|
3
|
+
// type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
|
|
4
|
+
// type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
|
|
5
|
+
|
|
6
|
+
/** Returns a shallowly cloned object with the provided keys omitted */
|
|
7
|
+
export const omit = <Obj extends Record<string, any>, Keys extends keyof Obj>(
|
|
8
|
+
obj: Obj,
|
|
9
|
+
keys: Keys[],
|
|
10
|
+
): Omit<Obj, Keys> => {
|
|
11
|
+
return Object.keys(obj).reduce((acc, key: any) => {
|
|
12
|
+
if (!keys.includes(key)) {
|
|
13
|
+
acc[key] = (obj as any)[key]
|
|
14
|
+
}
|
|
15
|
+
return acc
|
|
16
|
+
}, {} as any)
|
|
17
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
|
|
2
|
+
type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
|
|
3
|
+
type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
|
|
4
|
+
type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
|
|
5
|
+
|
|
6
|
+
export const pick = <Obj, Keys extends keyof Obj>(obj: Obj, keys: Keys[]): ConvertPick<{ [K in Keys]: Obj[K] }> => {
|
|
7
|
+
return keys.reduce((acc, key) => {
|
|
8
|
+
acc[key] = obj[key]
|
|
9
|
+
return acc
|
|
10
|
+
}, {} as any)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const pickAllOrElse = <Obj, Keys extends keyof Obj, TElse>(
|
|
14
|
+
obj: Obj,
|
|
15
|
+
keys: Keys[],
|
|
16
|
+
elseValue: TElse,
|
|
17
|
+
): ConvertPick<{ [K in Keys]: NonNullable<Obj[K]> }> | TElse => {
|
|
18
|
+
const ret = {} as any
|
|
19
|
+
for (const key of keys) {
|
|
20
|
+
if (obj[key] === undefined) {
|
|
21
|
+
return elseValue
|
|
22
|
+
}
|
|
23
|
+
ret[key] = obj[key]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return ret
|
|
27
|
+
}
|
package/src/promise.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Promise.all + Array.map */
|
|
2
|
+
export const promiseMap = <T, Res>(arr: T[], map: (el: T, index?: number) => Res | Promise<Res>) =>
|
|
3
|
+
Promise.all(arr.map(map))
|
|
4
|
+
|
|
5
|
+
export const promiseMapDict = async <T, Res>(
|
|
6
|
+
dict: Record<string, T>,
|
|
7
|
+
map: (el: T, index?: number) => Res | Promise<Res>,
|
|
8
|
+
): Promise<Record<string, Res>> => {
|
|
9
|
+
const mappedEntries = await Promise.all(Object.entries(dict).map(async ([key, val]) => [key, await map(val)]))
|
|
10
|
+
return Object.fromEntries(mappedEntries)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const promiseMapToDict = async <T, Res>(
|
|
14
|
+
arr: T[],
|
|
15
|
+
mapValue: (el: T, index?: number) => Res | Promise<Res>,
|
|
16
|
+
mapKey: (el: T, index?: number) => string,
|
|
17
|
+
): Promise<Record<string, Res>> => {
|
|
18
|
+
const mappedEntries = await Promise.all(arr.map(async (el, index) => [mapKey(el, index), await mapValue(el, index)]))
|
|
19
|
+
|
|
20
|
+
return Object.fromEntries(mappedEntries)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const promiseMapPool = async <T, Res>(
|
|
24
|
+
arr: T[],
|
|
25
|
+
map: (el: T, index?: number) => Promise<Res>,
|
|
26
|
+
poolLimit: number,
|
|
27
|
+
): Promise<Res[]> => {
|
|
28
|
+
const ret: Promise<Res>[] = []
|
|
29
|
+
const executing: Promise<Res>[] = []
|
|
30
|
+
for (const [index, item] of arr.entries()) {
|
|
31
|
+
const p = Promise.resolve().then(() => map(item, index))
|
|
32
|
+
ret.push(p)
|
|
33
|
+
|
|
34
|
+
if (poolLimit <= arr.length) {
|
|
35
|
+
const e: any = p.then(() => executing.splice(executing.indexOf(e), 1))
|
|
36
|
+
executing.push(e)
|
|
37
|
+
if (executing.length >= poolLimit) {
|
|
38
|
+
await Promise.race(executing)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return Promise.all(ret)
|
|
43
|
+
}
|
package/src/set.ts
ADDED
package/src/string.ts
ADDED
package/src/time.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const minuteInMs = 1000 * 60
|
|
2
|
+
|
|
3
|
+
export const time = {
|
|
4
|
+
ms: 1,
|
|
5
|
+
sec: 1000,
|
|
6
|
+
min: 60 * 1000,
|
|
7
|
+
hour: 60 * 60 * 1000,
|
|
8
|
+
day: 24 * 60 * 60 * 1000,
|
|
9
|
+
week: 7 * 24 * 60 * 60 * 1000,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Returns a string of format `m:ss` / `mm:ss` / `h:mm:ss` / ... */
|
|
13
|
+
export const msAsTimeString = (ms: number) => {
|
|
14
|
+
const seconds = Math.floor(ms / 1000)
|
|
15
|
+
const minutes = Math.floor(seconds / 60)
|
|
16
|
+
const hours = Math.floor(minutes / 60)
|
|
17
|
+
const remainingSeconds = (seconds % 60).toString().padStart(2, '0')
|
|
18
|
+
const remainingMinutes = hours > 0 ? (minutes % 60).toString().padStart(2, '0') : minutes % 60
|
|
19
|
+
|
|
20
|
+
const timeString = [hours > 0 ? `${hours}:` : '', `${remainingMinutes}:`, `${remainingSeconds}`]
|
|
21
|
+
.filter((val) => val !== '')
|
|
22
|
+
.join('')
|
|
23
|
+
|
|
24
|
+
return timeString
|
|
25
|
+
}
|
package/tsconfig.json
ADDED