effect-start 0.23.0 → 0.25.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/ChildProcess.js +32 -20
- package/dist/Commander.js +377 -293
- package/dist/ContentNegotiation.js +424 -318
- package/dist/Cookies.js +340 -271
- package/dist/Development.js +85 -49
- package/dist/Effectify.js +22 -14
- package/dist/Entity.js +260 -195
- package/dist/Fetch.js +192 -0
- package/dist/FilePathPattern.js +88 -77
- package/dist/FileRouter.js +192 -136
- package/dist/FileRouterCodegen.js +262 -191
- package/dist/FileSystem.js +126 -64
- package/dist/Http.js +96 -77
- package/dist/PathPattern.js +311 -273
- package/dist/PlatformError.js +36 -21
- package/dist/PlatformRuntime.js +65 -40
- package/dist/Route.js +122 -79
- package/dist/RouteBody.js +83 -58
- package/dist/RouteError.js +46 -25
- package/dist/RouteHook.js +58 -34
- package/dist/RouteHttp.js +346 -237
- package/dist/RouteHttpTracer.js +86 -58
- package/dist/RouteMount.js +81 -58
- package/dist/RouteSchema.js +253 -170
- package/dist/RouteSse.js +87 -72
- package/dist/RouteTree.js +99 -73
- package/dist/RouteTrie.js +160 -133
- package/dist/SchemaExtra.js +87 -62
- package/dist/Socket.js +32 -21
- package/dist/SqlIntrospect.js +317 -268
- package/dist/Start.js +55 -25
- package/dist/StartApp.js +3 -21
- package/dist/StreamExtra.js +109 -74
- package/dist/System.js +37 -21
- package/dist/TuplePathPattern.js +64 -58
- package/dist/Unique.js +159 -120
- package/dist/Values.js +48 -32
- package/dist/bun/BunBundle.js +158 -109
- package/dist/bun/BunChildProcessSpawner.js +121 -82
- package/dist/bun/BunImportTrackerPlugin.js +85 -63
- package/dist/bun/BunRoute.js +135 -99
- package/dist/bun/BunRuntime.js +39 -29
- package/dist/bun/BunServer.js +268 -140
- package/dist/bun/BunVirtualFilesPlugin.js +47 -33
- package/dist/bun/_BunEnhancedResolve.js +107 -82
- package/dist/bun/index.js +5 -5
- package/dist/bundler/Bundle.js +82 -38
- package/dist/bundler/BundleFiles.js +140 -82
- package/dist/bundler/BundleRoute.js +49 -38
- package/dist/client/Overlay.js +29 -28
- package/dist/client/ScrollState.js +94 -82
- package/dist/client/index.js +79 -61
- package/dist/console/Console.js +40 -24
- package/dist/console/ConsoleErrors.js +189 -178
- package/dist/console/ConsoleLogger.js +52 -43
- package/dist/console/ConsoleMetrics.js +69 -58
- package/dist/console/ConsoleProcess.js +57 -47
- package/dist/console/ConsoleStore.js +56 -45
- package/dist/console/ConsoleTracer.js +101 -88
- package/dist/console/Simulation.js +714 -563
- package/dist/console/index.js +3 -3
- package/dist/console/routes/tree.js +29 -28
- package/dist/datastar/actions/fetch.js +514 -381
- package/dist/datastar/actions/peek.js +12 -12
- package/dist/datastar/actions/setAll.js +18 -11
- package/dist/datastar/actions/toggleAll.js +18 -11
- package/dist/datastar/attributes/attr.js +48 -47
- package/dist/datastar/attributes/bind.js +186 -167
- package/dist/datastar/attributes/class.js +51 -44
- package/dist/datastar/attributes/computed.js +23 -24
- package/dist/datastar/attributes/effect.js +9 -8
- package/dist/datastar/attributes/indicator.js +32 -29
- package/dist/datastar/attributes/init.js +26 -25
- package/dist/datastar/attributes/jsonSignals.js +32 -29
- package/dist/datastar/attributes/on.js +76 -73
- package/dist/datastar/attributes/onIntersect.js +51 -51
- package/dist/datastar/attributes/onInterval.js +30 -29
- package/dist/datastar/attributes/onSignalPatch.js +49 -40
- package/dist/datastar/attributes/ref.js +10 -9
- package/dist/datastar/attributes/show.js +31 -30
- package/dist/datastar/attributes/signals.js +17 -16
- package/dist/datastar/attributes/style.js +56 -49
- package/dist/datastar/attributes/text.js +28 -25
- package/dist/datastar/engine.js +1079 -933
- package/dist/datastar/index.js +25 -24
- package/dist/datastar/utils.js +203 -155
- package/dist/datastar/watchers/patchElements.js +459 -372
- package/dist/datastar/watchers/patchSignals.js +13 -13
- package/dist/experimental/EncryptedCookies.js +305 -189
- package/dist/experimental/index.js +1 -1
- package/dist/hyper/Hyper.js +22 -17
- package/dist/hyper/HyperHtml.js +138 -123
- package/dist/hyper/HyperNode.js +11 -9
- package/dist/hyper/HyperRoute.js +41 -28
- package/dist/hyper/html.js +27 -27
- package/dist/hyper/index.js +5 -5
- package/dist/hyper/jsx-runtime.js +11 -5
- package/dist/index.js +8 -8
- package/dist/node/NodeFileSystem.js +606 -341
- package/dist/node/NodeUtils.js +21 -18
- package/dist/sql/Sql.js +8 -0
- package/dist/sql/bun/index.js +134 -67
- package/dist/sql/index.js +1 -0
- package/dist/sql/libsql/index.js +156 -0
- package/dist/sql/mssql/docker.js +103 -60
- package/dist/sql/mssql/index.js +182 -101
- package/dist/testing/TestLogger.js +39 -29
- package/dist/testing/index.js +2 -2
- package/dist/testing/utils.js +45 -23
- package/dist/x/cloudflare/CloudflareTunnel.js +61 -28
- package/dist/x/cloudflare/index.js +1 -1
- package/dist/x/tailscale/TailscaleTunnel.js +86 -60
- package/dist/x/tailscale/index.js +1 -1
- package/dist/x/tailwind/TailwindPlugin.js +280 -205
- package/dist/x/tailwind/compile.js +185 -129
- package/dist/x/tailwind/plugin.js +13 -11
- package/package.json +1 -1
- package/src/Development.ts +3 -1
- package/src/Entity.ts +17 -0
- package/src/Fetch.ts +271 -0
- package/src/SqlIntrospect.ts +64 -70
- package/src/Start.ts +24 -22
- package/src/StartApp.ts +11 -0
- package/src/bun/BunServer.ts +89 -16
- package/src/hyper/HyperHtml.ts +0 -1
- package/src/sql/bun/index.ts +1 -1
- package/src/sql/index.ts +1 -0
- package/src/sql/libsql/index.ts +173 -0
- package/src/sql/libsql/libsql.d.ts +39 -0
- package/src/sql/mssql/index.ts +1 -1
- package/src/x/tailscale/TailscaleTunnel.ts +7 -5
- package/dist/BlobStore.d.ts +0 -80
- package/dist/BlobStore.js +0 -19
- package/dist/ChildProcess.d.ts +0 -60
- package/dist/Commander.d.ts +0 -100
- package/dist/ContentNegotiation.d.ts +0 -12
- package/dist/Cookies.d.ts +0 -47
- package/dist/Development.d.ts +0 -39
- package/dist/Effectify.d.ts +0 -209
- package/dist/Entity.d.ts +0 -47
- package/dist/FilePathPattern.d.ts +0 -29
- package/dist/FileRouter.d.ts +0 -56
- package/dist/FileRouterCodegen.d.ts +0 -18
- package/dist/FileRouterPattern.d.ts +0 -9
- package/dist/FileRouterPattern.js +0 -35
- package/dist/FileSystem.d.ts +0 -158
- package/dist/Http.d.ts +0 -37
- package/dist/HttpAppExtra.d.ts +0 -7
- package/dist/HttpAppExtra.js +0 -320
- package/dist/HttpUtils.d.ts +0 -3
- package/dist/HttpUtils.js +0 -11
- package/dist/PathPattern.d.ts +0 -134
- package/dist/PlatformError.d.ts +0 -38
- package/dist/PlatformRuntime.d.ts +0 -27
- package/dist/Route.d.ts +0 -97
- package/dist/RouteBody.d.ts +0 -47
- package/dist/RouteError.d.ts +0 -98
- package/dist/RouteHook.d.ts +0 -12
- package/dist/RouteHttp.d.ts +0 -21
- package/dist/RouteHttpTracer.d.ts +0 -10
- package/dist/RouteMount.d.ts +0 -86
- package/dist/RouteSchema.d.ts +0 -86
- package/dist/RouteSse.d.ts +0 -21
- package/dist/RouteTree.d.ts +0 -57
- package/dist/RouteTrie.d.ts +0 -20
- package/dist/RouterPattern.d.ts +0 -118
- package/dist/RouterPattern.js +0 -269
- package/dist/SchemaExtra.d.ts +0 -7
- package/dist/Socket.d.ts +0 -27
- package/dist/Sql.d.ts +0 -34
- package/dist/Sql.js +0 -5
- package/dist/SqlIntrospect.d.ts +0 -91
- package/dist/Start.d.ts +0 -44
- package/dist/StartApp.d.ts +0 -19
- package/dist/StreamExtra.d.ts +0 -28
- package/dist/System.d.ts +0 -7
- package/dist/TuplePathPattern.d.ts +0 -9
- package/dist/Unique.d.ts +0 -50
- package/dist/Values.d.ts +0 -27
- package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
- package/dist/bun/BunBlobStoreDisk.js +0 -116
- package/dist/bun/BunBlobStoreS3.d.ts +0 -11
- package/dist/bun/BunBlobStoreS3.js +0 -89
- package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
- package/dist/bun/BunBlobWatcherDisk.js +0 -60
- package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
- package/dist/bun/BunBlobWatcherQueue.js +0 -17
- package/dist/bun/BunBundle.d.ts +0 -11
- package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
- package/dist/bun/BunHttpServer.d.ts +0 -44
- package/dist/bun/BunHttpServer.js +0 -186
- package/dist/bun/BunHttpServer_web.d.ts +0 -60
- package/dist/bun/BunHttpServer_web.js +0 -252
- package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
- package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
- package/dist/bun/BunPlatformHttpServer.js +0 -53
- package/dist/bun/BunRoute.d.ts +0 -48
- package/dist/bun/BunRuntime.d.ts +0 -2
- package/dist/bun/BunServer.d.ts +0 -40
- package/dist/bun/BunServerRequest.d.ts +0 -60
- package/dist/bun/BunServerRequest.js +0 -252
- package/dist/bun/BunSql.d.ts +0 -4
- package/dist/bun/BunSql.js +0 -81
- package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
- package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
- package/dist/bun/index.d.ts +0 -5
- package/dist/bundler/Bundle.d.ts +0 -61
- package/dist/bundler/BundleFiles.d.ts +0 -13
- package/dist/bundler/BundleHttp.d.ts +0 -45
- package/dist/bundler/BundleHttp.js +0 -176
- package/dist/bundler/BundleRoute.d.ts +0 -27
- package/dist/client/Overlay.d.ts +0 -2
- package/dist/client/ScrollState.d.ts +0 -6
- package/dist/client/index.d.ts +0 -6
- package/dist/console/Console.d.ts +0 -6
- package/dist/console/ConsoleErrors.d.ts +0 -3
- package/dist/console/ConsoleLogger.d.ts +0 -3
- package/dist/console/ConsoleMetrics.d.ts +0 -3
- package/dist/console/ConsoleProcess.d.ts +0 -3
- package/dist/console/ConsoleStore.d.ts +0 -144
- package/dist/console/ConsoleTracer.d.ts +0 -3
- package/dist/console/Simulation.d.ts +0 -2
- package/dist/console/index.d.ts +0 -3
- package/dist/console/routes/errors/route.d.ts +0 -10
- package/dist/console/routes/errors/route.js +0 -47
- package/dist/console/routes/fiberDetail.d.ts +0 -16
- package/dist/console/routes/fiberDetail.js +0 -38
- package/dist/console/routes/fibers/route.d.ts +0 -10
- package/dist/console/routes/fibers/route.js +0 -19
- package/dist/console/routes/git/route.d.ts +0 -11
- package/dist/console/routes/git/route.js +0 -33
- package/dist/console/routes/layout.d.ts +0 -9
- package/dist/console/routes/layout.js +0 -3
- package/dist/console/routes/logs/route.d.ts +0 -10
- package/dist/console/routes/logs/route.js +0 -32
- package/dist/console/routes/metrics/route.d.ts +0 -10
- package/dist/console/routes/metrics/route.js +0 -17
- package/dist/console/routes/route.d.ts +0 -6
- package/dist/console/routes/route.js +0 -5
- package/dist/console/routes/routes/route.d.ts +0 -6
- package/dist/console/routes/routes/route.js +0 -20
- package/dist/console/routes/services/route.d.ts +0 -6
- package/dist/console/routes/services/route.js +0 -12
- package/dist/console/routes/system/route.d.ts +0 -10
- package/dist/console/routes/system/route.js +0 -18
- package/dist/console/routes/traceDetail.d.ts +0 -16
- package/dist/console/routes/traceDetail.js +0 -14
- package/dist/console/routes/traces/route.d.ts +0 -10
- package/dist/console/routes/traces/route.js +0 -39
- package/dist/console/routes/tree.d.ts +0 -153
- package/dist/console/ui/Errors.d.ts +0 -4
- package/dist/console/ui/Errors.js +0 -15
- package/dist/console/ui/Fibers.d.ts +0 -24
- package/dist/console/ui/Fibers.js +0 -121
- package/dist/console/ui/Git.d.ts +0 -20
- package/dist/console/ui/Git.js +0 -95
- package/dist/console/ui/Logs.d.ts +0 -4
- package/dist/console/ui/Logs.js +0 -25
- package/dist/console/ui/Metrics.d.ts +0 -4
- package/dist/console/ui/Metrics.js +0 -26
- package/dist/console/ui/Routes.d.ts +0 -8
- package/dist/console/ui/Routes.js +0 -70
- package/dist/console/ui/Services.d.ts +0 -10
- package/dist/console/ui/Services.js +0 -246
- package/dist/console/ui/Shell.d.ts +0 -10
- package/dist/console/ui/Shell.js +0 -7
- package/dist/console/ui/System.d.ts +0 -4
- package/dist/console/ui/System.js +0 -35
- package/dist/console/ui/Traces.d.ts +0 -12
- package/dist/console/ui/Traces.js +0 -179
- package/dist/datastar/actions/fetch.d.ts +0 -30
- package/dist/datastar/actions/peek.d.ts +0 -1
- package/dist/datastar/actions/setAll.d.ts +0 -1
- package/dist/datastar/actions/toggleAll.d.ts +0 -1
- package/dist/datastar/attributes/attr.d.ts +0 -1
- package/dist/datastar/attributes/bind.d.ts +0 -1
- package/dist/datastar/attributes/class.d.ts +0 -1
- package/dist/datastar/attributes/computed.d.ts +0 -1
- package/dist/datastar/attributes/effect.d.ts +0 -1
- package/dist/datastar/attributes/indicator.d.ts +0 -1
- package/dist/datastar/attributes/init.d.ts +0 -1
- package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
- package/dist/datastar/attributes/on.d.ts +0 -1
- package/dist/datastar/attributes/onIntersect.d.ts +0 -1
- package/dist/datastar/attributes/onInterval.d.ts +0 -1
- package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
- package/dist/datastar/attributes/ref.d.ts +0 -1
- package/dist/datastar/attributes/show.d.ts +0 -1
- package/dist/datastar/attributes/signals.d.ts +0 -1
- package/dist/datastar/attributes/style.d.ts +0 -1
- package/dist/datastar/attributes/text.d.ts +0 -1
- package/dist/datastar/engine.d.ts +0 -162
- package/dist/datastar/happydom.d.ts +0 -1
- package/dist/datastar/happydom.js +0 -8
- package/dist/datastar/index.d.ts +0 -24
- package/dist/datastar/load.d.ts +0 -24
- package/dist/datastar/load.js +0 -24
- package/dist/datastar/utils.d.ts +0 -51
- package/dist/datastar/watchers/patchElements.d.ts +0 -1
- package/dist/datastar/watchers/patchSignals.d.ts +0 -1
- package/dist/experimental/EncryptedCookies.d.ts +0 -48
- package/dist/experimental/SseHttpResponse.d.ts +0 -7
- package/dist/experimental/SseHttpResponse.js +0 -28
- package/dist/experimental/index.d.ts +0 -1
- package/dist/hyper/Hyper.d.ts +0 -25
- package/dist/hyper/HyperHtml.d.ts +0 -23
- package/dist/hyper/HyperHtml.test.d.ts +0 -1
- package/dist/hyper/HyperHtml.test.js +0 -197
- package/dist/hyper/HyperNode.d.ts +0 -14
- package/dist/hyper/HyperRoute.d.ts +0 -8
- package/dist/hyper/HyperRoute.test.d.ts +0 -1
- package/dist/hyper/HyperRoute.test.js +0 -83
- package/dist/hyper/html.d.ts +0 -11
- package/dist/hyper/index.d.ts +0 -6
- package/dist/hyper/jsx-runtime.d.ts +0 -7
- package/dist/index.d.ts +0 -8
- package/dist/inference_check.d.ts +0 -1
- package/dist/inference_check.js +0 -15
- package/dist/lint/plugin.d.ts +0 -86
- package/dist/lint/plugin.js +0 -341
- package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
- package/dist/middlewares/BasicAuthMiddleware.js +0 -22
- package/dist/middlewares/index.d.ts +0 -1
- package/dist/middlewares/index.js +0 -1
- package/dist/node/Effectify.d.ts +0 -209
- package/dist/node/Effectify.js +0 -19
- package/dist/node/FileSystem.d.ts +0 -7
- package/dist/node/FileSystem.js +0 -420
- package/dist/node/NodeFileSystem.d.ts +0 -7
- package/dist/node/NodeUtils.d.ts +0 -2
- package/dist/node/PlatformError.d.ts +0 -46
- package/dist/node/PlatformError.js +0 -43
- package/dist/node/Utils.d.ts +0 -1
- package/dist/node/Utils.js +0 -19
- package/dist/repro_fail.d.ts +0 -1
- package/dist/repro_fail.js +0 -14
- package/dist/sql/bun/index.d.ts +0 -3
- package/dist/sql/mssql/docker.d.ts +0 -2
- package/dist/sql/mssql/index.d.ts +0 -21
- package/dist/testing/TestHttpClient.d.ts +0 -13
- package/dist/testing/TestHttpClient.js +0 -68
- package/dist/testing/TestLogger.d.ts +0 -13
- package/dist/testing/index.d.ts +0 -2
- package/dist/testing/utils.d.ts +0 -9
- package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
- package/dist/x/cloudflare/index.d.ts +0 -1
- package/dist/x/datastar/Datastar.d.ts +0 -6
- package/dist/x/datastar/Datastar.js +0 -47
- package/dist/x/datastar/index.d.ts +0 -1
- package/dist/x/datastar/index.js +0 -1
- package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
- package/dist/x/tailscale/index.d.ts +0 -1
- package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
- package/dist/x/tailwind/compile.d.ts +0 -19
- package/dist/x/tailwind/plugin.d.ts +0 -2
- /package/src/{Sql.ts → sql/Sql.ts} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { mergePatch, watcher } from "../engine.js"
|
|
2
|
-
import { jsStrToObject } from "../utils.js"
|
|
1
|
+
import { mergePatch, watcher } from "../engine.js"
|
|
2
|
+
import { jsStrToObject } from "../utils.js"
|
|
3
|
+
|
|
3
4
|
watcher({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
});
|
|
5
|
+
name: "datastar-patch-signals",
|
|
6
|
+
apply({ error }, { signals, onlyIfMissing }) {
|
|
7
|
+
if (signals) {
|
|
8
|
+
const ifMissing = onlyIfMissing?.trim() === "true"
|
|
9
|
+
mergePatch(jsStrToObject(signals), { ifMissing })
|
|
10
|
+
} else {
|
|
11
|
+
throw error("PatchSignalsExpectedSignals")
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
})
|
|
@@ -1,212 +1,328 @@
|
|
|
1
|
-
import * as Cookies from "../Cookies.js"
|
|
2
|
-
import * as Config from "effect/Config"
|
|
3
|
-
import * as Context from "effect/Context"
|
|
4
|
-
import * as Data from "effect/Data"
|
|
5
|
-
import * as Effect from "effect/Effect"
|
|
6
|
-
import * as Layer from "effect/Layer"
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
}
|
|
1
|
+
import * as Cookies from "../Cookies.js"
|
|
2
|
+
import * as Config from "effect/Config"
|
|
3
|
+
import * as Context from "effect/Context"
|
|
4
|
+
import * as Data from "effect/Data"
|
|
5
|
+
import * as Effect from "effect/Effect"
|
|
6
|
+
import * as Layer from "effect/Layer"
|
|
7
|
+
|
|
8
|
+
export class EncryptedCookiesError extends Data.TaggedError("EncryptedCookiesError") {}
|
|
9
|
+
|
|
10
|
+
export class EncryptedCookies extends Context.Tag("EncryptedCookies")() {}
|
|
11
|
+
|
|
11
12
|
export function layer(options) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
return Layer.effect(
|
|
14
|
+
EncryptedCookies,
|
|
15
|
+
Effect.gen(function* () {
|
|
16
|
+
const keyMaterial = yield* deriveKeyMaterial(options.secret)
|
|
17
|
+
|
|
18
|
+
// Pre-derive both keys once
|
|
19
|
+
const encryptKey = yield* deriveKey(keyMaterial, ["encrypt"])
|
|
20
|
+
const decryptKey = yield* deriveKey(keyMaterial, ["decrypt"])
|
|
21
|
+
|
|
22
|
+
return EncryptedCookies.of({
|
|
23
|
+
encrypt: (value) => encryptWithDerivedKey(value, encryptKey),
|
|
24
|
+
decrypt: (encryptedValue) => decryptWithDerivedKey(encryptedValue, decryptKey),
|
|
25
|
+
encryptCookie: (cookie) => encryptCookieWithDerivedKey(cookie, encryptKey),
|
|
26
|
+
decryptCookie: (cookie) => decryptCookieWithDerivedKey(cookie, decryptKey),
|
|
27
|
+
})
|
|
28
|
+
}),
|
|
29
|
+
)
|
|
24
30
|
}
|
|
31
|
+
|
|
25
32
|
export function layerConfig(name = "SECRET_KEY_BASE") {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return
|
|
33
|
+
return Effect.gen(function* () {
|
|
34
|
+
const secret = yield* Config.nonEmptyString(name).pipe(
|
|
35
|
+
Effect.flatMap((value) => {
|
|
36
|
+
return value.length < 40 ? Effect.fail(new Error("ba")) : Effect.succeed(value)
|
|
37
|
+
}),
|
|
38
|
+
Effect.catchAll((err) => {
|
|
39
|
+
return Effect.dieMessage("SECRET_KEY_BASE must be at least 40 characters")
|
|
40
|
+
}),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return layer({ secret })
|
|
44
|
+
}).pipe(Layer.unwrapEffect)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function encodeToBase64Segments(
|
|
48
|
+
ciphertext,
|
|
49
|
+
iv,
|
|
50
|
+
authTag,
|
|
51
|
+
) {
|
|
52
|
+
return [base64urlEncode(ciphertext), base64urlEncode(iv), base64urlEncode(authTag)].join(".")
|
|
37
53
|
}
|
|
54
|
+
|
|
38
55
|
function base64urlEncode(data) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
function decodeFromBase64Segments(segments) {
|
|
43
|
-
return Effect.gen(function* () {
|
|
44
|
-
const [ciphertextB64, ivB64, authTagB64] = segments;
|
|
45
|
-
const ciphertext = yield* Effect.try({
|
|
46
|
-
try: () => base64urlDecode(ciphertextB64),
|
|
47
|
-
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
48
|
-
});
|
|
49
|
-
const iv = yield* Effect.try({
|
|
50
|
-
try: () => base64urlDecode(ivB64),
|
|
51
|
-
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
52
|
-
});
|
|
53
|
-
const authTag = yield* Effect.try({
|
|
54
|
-
try: () => base64urlDecode(authTagB64),
|
|
55
|
-
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
56
|
-
});
|
|
57
|
-
return { ciphertext, iv, authTag };
|
|
58
|
-
});
|
|
56
|
+
const base64 = btoa(String.fromCharCode(...data))
|
|
57
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "")
|
|
59
58
|
}
|
|
59
|
+
|
|
60
|
+
function decodeFromBase64Segments(
|
|
61
|
+
segments,
|
|
62
|
+
) {
|
|
63
|
+
return Effect.gen(function* () {
|
|
64
|
+
const [ciphertextB64, ivB64, authTagB64] = segments
|
|
65
|
+
|
|
66
|
+
const ciphertext = yield* Effect.try({
|
|
67
|
+
try: () => base64urlDecode(ciphertextB64),
|
|
68
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const iv = yield* Effect.try({
|
|
72
|
+
try: () => base64urlDecode(ivB64),
|
|
73
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const authTag = yield* Effect.try({
|
|
77
|
+
try: () => base64urlDecode(authTagB64),
|
|
78
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
return { ciphertext, iv, authTag }
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
60
85
|
function base64urlDecode(data) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
86
|
+
// Convert base64url back to standard base64
|
|
87
|
+
let base64 = data.replace(/-/g, "+").replace(/_/g, "/")
|
|
88
|
+
|
|
89
|
+
// Add padding if needed
|
|
90
|
+
while (base64.length % 4) {
|
|
91
|
+
base64 += "="
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0))
|
|
68
95
|
}
|
|
96
|
+
|
|
69
97
|
/**
|
|
70
98
|
* Encrypts cookie value using the SECRET_KEY_BASE.
|
|
71
99
|
*/
|
|
72
|
-
function encryptWithDerivedKey(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
function
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
100
|
+
function encryptWithDerivedKey(
|
|
101
|
+
value,
|
|
102
|
+
derivedKey,
|
|
103
|
+
) {
|
|
104
|
+
return Effect.gen(function* () {
|
|
105
|
+
if (value === null || value === undefined) {
|
|
106
|
+
return yield* Effect.fail(
|
|
107
|
+
new EncryptedCookiesError({
|
|
108
|
+
cause: "Cannot encrypt empty value",
|
|
109
|
+
}),
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const iv = crypto.getRandomValues(new Uint8Array(12))
|
|
114
|
+
const data = new TextEncoder().encode(JSON.stringify(value))
|
|
115
|
+
|
|
116
|
+
const encrypted = yield* Effect.tryPromise({
|
|
117
|
+
try: () => crypto.subtle.encrypt({ name: "AES-GCM", iv }, derivedKey, data),
|
|
118
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
const encryptedArray = new Uint8Array(encrypted)
|
|
122
|
+
const authTagLength = 16
|
|
123
|
+
const ciphertext = encryptedArray.slice(0, -authTagLength)
|
|
124
|
+
const authTag = encryptedArray.slice(-authTagLength)
|
|
125
|
+
|
|
126
|
+
return encodeToBase64Segments(ciphertext, iv, authTag)
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function encrypt(
|
|
131
|
+
value,
|
|
132
|
+
options,
|
|
133
|
+
) {
|
|
134
|
+
return Effect.gen(function* () {
|
|
135
|
+
if ("key" in options) {
|
|
136
|
+
return yield* encryptWithDerivedKey(value, options.key)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const keyMaterial = yield* deriveKeyMaterial(options.secret)
|
|
140
|
+
const derivedKey = yield* deriveKey(keyMaterial, ["encrypt"])
|
|
141
|
+
return yield* encryptWithDerivedKey(value, derivedKey)
|
|
142
|
+
})
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function decryptWithDerivedKey(
|
|
146
|
+
encryptedValue,
|
|
147
|
+
derivedKey,
|
|
148
|
+
) {
|
|
149
|
+
return Effect.gen(function* () {
|
|
150
|
+
if (!encryptedValue || encryptedValue === null || encryptedValue === undefined) {
|
|
151
|
+
return yield* Effect.fail(
|
|
152
|
+
new EncryptedCookiesError({
|
|
153
|
+
cause: "Cannot decrypt null, undefined, or empty value",
|
|
154
|
+
}),
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const segments = encryptedValue.split(".")
|
|
159
|
+
if (segments.length !== 3) {
|
|
160
|
+
return yield* Effect.fail(
|
|
161
|
+
new EncryptedCookiesError({
|
|
162
|
+
cause: "Invalid encrypted cookie format",
|
|
163
|
+
}),
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const { ciphertext, iv, authTag } = yield* decodeFromBase64Segments(segments)
|
|
168
|
+
|
|
169
|
+
const encryptedData = new Uint8Array(ciphertext.length + authTag.length)
|
|
170
|
+
encryptedData.set(ciphertext)
|
|
171
|
+
encryptedData.set(authTag, ciphertext.length)
|
|
172
|
+
|
|
173
|
+
const decrypted = yield* Effect.tryPromise({
|
|
174
|
+
try: () =>
|
|
175
|
+
crypto.subtle.decrypt({ name: "AES-GCM", iv: iv.slice(0) }, derivedKey, encryptedData),
|
|
176
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
const jsonString = new TextDecoder().decode(decrypted)
|
|
180
|
+
|
|
181
|
+
return yield* Effect.try({
|
|
182
|
+
try: () => JSON.parse(jsonString),
|
|
183
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
184
|
+
})
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function encryptCookieWithDerivedKey(
|
|
189
|
+
cookie,
|
|
190
|
+
derivedKey,
|
|
191
|
+
) {
|
|
192
|
+
return Effect.gen(function* () {
|
|
193
|
+
const encryptedValue = yield* encryptWithDerivedKey(cookie.value, derivedKey).pipe(
|
|
194
|
+
Effect.mapError(
|
|
195
|
+
(error) =>
|
|
196
|
+
new EncryptedCookiesError({
|
|
133
197
|
cause: error.cause,
|
|
134
198
|
cookie,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
199
|
+
}),
|
|
200
|
+
),
|
|
201
|
+
)
|
|
202
|
+
return Cookies.unsafeMakeCookie(cookie.name, encryptedValue, cookie.options)
|
|
203
|
+
})
|
|
138
204
|
}
|
|
139
|
-
function decryptCookieWithDerivedKey(
|
|
140
|
-
|
|
141
|
-
|
|
205
|
+
function decryptCookieWithDerivedKey(
|
|
206
|
+
cookie,
|
|
207
|
+
derivedKey,
|
|
208
|
+
) {
|
|
209
|
+
return Effect.gen(function* () {
|
|
210
|
+
const decryptedValue = yield* decryptWithDerivedKey(cookie.value, derivedKey).pipe(
|
|
211
|
+
Effect.mapError(
|
|
212
|
+
(error) =>
|
|
213
|
+
new EncryptedCookiesError({
|
|
142
214
|
cause: error.cause,
|
|
143
215
|
cookie,
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
216
|
+
}),
|
|
217
|
+
),
|
|
218
|
+
)
|
|
219
|
+
return Cookies.unsafeMakeCookie(cookie.name, JSON.stringify(decryptedValue), cookie.options)
|
|
220
|
+
})
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function encryptCookie(
|
|
224
|
+
cookie,
|
|
225
|
+
options,
|
|
226
|
+
) {
|
|
227
|
+
return Effect.gen(function* () {
|
|
228
|
+
if ("key" in options) {
|
|
229
|
+
return yield* encryptCookieWithDerivedKey(cookie, options.key)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const encryptedValue = yield* encrypt(cookie.value, {
|
|
233
|
+
secret: options.secret,
|
|
234
|
+
}).pipe(
|
|
235
|
+
Effect.mapError(
|
|
236
|
+
(error) =>
|
|
237
|
+
new EncryptedCookiesError({
|
|
156
238
|
cause: error.cause,
|
|
157
239
|
cookie,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
240
|
+
}),
|
|
241
|
+
),
|
|
242
|
+
)
|
|
243
|
+
return Cookies.unsafeMakeCookie(cookie.name, encryptedValue, cookie.options)
|
|
244
|
+
})
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function decryptCookie(
|
|
248
|
+
cookie,
|
|
249
|
+
options,
|
|
250
|
+
) {
|
|
251
|
+
return Effect.gen(function* () {
|
|
252
|
+
if ("key" in options) {
|
|
253
|
+
return yield* decryptCookieWithDerivedKey(cookie, options.key)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const decryptedValue = yield* decrypt(cookie.value, {
|
|
257
|
+
secret: options.secret,
|
|
258
|
+
}).pipe(
|
|
259
|
+
Effect.mapError(
|
|
260
|
+
(error) =>
|
|
261
|
+
new EncryptedCookiesError({
|
|
170
262
|
cause: error.cause,
|
|
171
263
|
cookie,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
264
|
+
}),
|
|
265
|
+
),
|
|
266
|
+
)
|
|
267
|
+
return Cookies.unsafeMakeCookie(cookie.name, JSON.stringify(decryptedValue), cookie.options)
|
|
268
|
+
})
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function decrypt(
|
|
272
|
+
encryptedValue,
|
|
273
|
+
options,
|
|
274
|
+
) {
|
|
275
|
+
return Effect.gen(function* () {
|
|
276
|
+
if ("key" in options) {
|
|
277
|
+
return yield* decryptWithDerivedKey(encryptedValue, options.key)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const keyMaterial = yield* deriveKeyMaterial(options.secret)
|
|
281
|
+
const derivedKey = yield* deriveKey(keyMaterial, ["decrypt"])
|
|
282
|
+
return yield* decryptWithDerivedKey(encryptedValue, derivedKey)
|
|
283
|
+
})
|
|
185
284
|
}
|
|
285
|
+
|
|
186
286
|
function deriveKeyMaterial(secret) {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
287
|
+
return Effect.gen(function* () {
|
|
288
|
+
const encoder = new TextEncoder()
|
|
289
|
+
|
|
290
|
+
const keyMaterial = yield* Effect.tryPromise({
|
|
291
|
+
try: () =>
|
|
292
|
+
crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HKDF" }, false, [
|
|
293
|
+
"deriveKey",
|
|
294
|
+
]),
|
|
295
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
return keyMaterial
|
|
299
|
+
})
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function deriveKey(
|
|
303
|
+
keyMaterial,
|
|
304
|
+
usage,
|
|
305
|
+
) {
|
|
306
|
+
return Effect.gen(function* () {
|
|
307
|
+
const encoder = new TextEncoder()
|
|
308
|
+
|
|
309
|
+
const key = yield* Effect.tryPromise({
|
|
310
|
+
try: () =>
|
|
311
|
+
crypto.subtle.deriveKey(
|
|
312
|
+
{
|
|
313
|
+
name: "HKDF",
|
|
314
|
+
salt: encoder.encode("cookie-encryption"),
|
|
315
|
+
info: encoder.encode("aes-256-gcm"),
|
|
316
|
+
hash: "SHA-256",
|
|
317
|
+
},
|
|
318
|
+
keyMaterial,
|
|
319
|
+
{ name: "AES-GCM", length: 256 },
|
|
320
|
+
false,
|
|
321
|
+
usage,
|
|
322
|
+
),
|
|
323
|
+
catch: (error) => new EncryptedCookiesError({ cause: error }),
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
return key
|
|
327
|
+
})
|
|
212
328
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * as EncryptedCookies from "./EncryptedCookies.js"
|
|
1
|
+
export * as EncryptedCookies from "./EncryptedCookies.js"
|
package/dist/hyper/Hyper.js
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
import * as Context from "effect/Context"
|
|
2
|
-
import * as Fiber from "effect/Fiber"
|
|
3
|
-
import * as Option from "effect/Option"
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
1
|
+
import * as Context from "effect/Context"
|
|
2
|
+
import * as Fiber from "effect/Fiber"
|
|
3
|
+
import * as Option from "effect/Option"
|
|
4
|
+
|
|
5
|
+
export class Hyper extends Context.Tag("Hyper")() {}
|
|
6
|
+
|
|
7
|
+
const NoChildren = Object.freeze([])
|
|
8
|
+
|
|
7
9
|
export function h(type, props) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
return {
|
|
11
|
+
type,
|
|
12
|
+
props: {
|
|
13
|
+
...props,
|
|
14
|
+
children: props.children ?? NoChildren,
|
|
15
|
+
},
|
|
16
|
+
}
|
|
15
17
|
}
|
|
18
|
+
|
|
16
19
|
export function unsafeUse(tag) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
const currentFiber = Option.getOrThrow(Fiber.getCurrentFiber())
|
|
21
|
+
const context = currentFiber.currentContext
|
|
22
|
+
|
|
23
|
+
return Context.unsafeGet(context, tag)
|
|
20
24
|
}
|
|
25
|
+
|
|
21
26
|
export function isGenericJsxObject(value) {
|
|
22
|
-
|
|
27
|
+
return typeof value === "object" && value !== null && "type" in value && "props" in value
|
|
23
28
|
}
|