alchemy 2.0.0-beta.43 → 2.0.0-beta.44
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/bin/cli.js +18 -5
- package/bin/exec.js +315 -233
- package/bin/exec.js.map +1 -1
- package/lib/Auth/Lock.js +2 -2
- package/lib/Auth/Lock.js.map +1 -1
- package/lib/Bundle/Bundle.d.ts +11 -0
- package/lib/Bundle/Bundle.d.ts.map +1 -1
- package/lib/Bundle/Bundle.js +19 -12
- package/lib/Bundle/Bundle.js.map +1 -1
- package/lib/Bundle/BundleAnalyzerPlugin.d.ts +25 -0
- package/lib/Bundle/BundleAnalyzerPlugin.d.ts.map +1 -0
- package/lib/Bundle/BundleAnalyzerPlugin.js +16 -0
- package/lib/Bundle/BundleAnalyzerPlugin.js.map +1 -0
- package/lib/Bundle/RawPlugin.d.ts +36 -0
- package/lib/Bundle/RawPlugin.d.ts.map +1 -0
- package/lib/Bundle/RawPlugin.js +80 -0
- package/lib/Bundle/RawPlugin.js.map +1 -0
- package/lib/Bundle/index.d.ts +2 -0
- package/lib/Bundle/index.d.ts.map +1 -1
- package/lib/Bundle/index.js +2 -0
- package/lib/Bundle/index.js.map +1 -1
- package/lib/Cli/commands/dev.d.ts +3 -2
- package/lib/Cli/commands/dev.d.ts.map +1 -1
- package/lib/Cli/commands/dev.js +9 -1
- package/lib/Cli/commands/dev.js.map +1 -1
- package/lib/Cli/exec.d.ts.map +1 -1
- package/lib/Cli/exec.js +2 -1
- package/lib/Cli/exec.js.map +1 -1
- package/lib/Cloudflare/Local.d.ts +2 -0
- package/lib/Cloudflare/Local.d.ts.map +1 -0
- package/lib/Cloudflare/Local.js +9 -0
- package/lib/Cloudflare/Local.js.map +1 -0
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +3 -1
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.js +0 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +22 -3
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +413 -21
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +6 -19
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +3 -4
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.js +3 -5
- package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts +1 -2
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.js +3 -6
- package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts +184 -0
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts.map +1 -0
- package/lib/Cloudflare/Zaraz/ZarazConfig.js +216 -0
- package/lib/Cloudflare/Zaraz/ZarazConfig.js.map +1 -0
- package/lib/Cloudflare/Zaraz/ZarazEventTypes.d.ts +188 -0
- package/lib/Cloudflare/Zaraz/ZarazEventTypes.d.ts.map +1 -0
- package/lib/Cloudflare/Zaraz/ZarazEventTypes.js +4 -0
- package/lib/Cloudflare/Zaraz/ZarazEventTypes.js.map +1 -0
- package/lib/Cloudflare/Zaraz/index.d.ts +3 -0
- package/lib/Cloudflare/Zaraz/index.d.ts.map +1 -0
- package/lib/Cloudflare/Zaraz/index.js +2 -0
- package/lib/Cloudflare/Zaraz/index.js.map +1 -0
- package/lib/Cloudflare/index.d.ts +1 -0
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +1 -0
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Local/RpcProvider.d.ts +54 -0
- package/lib/Local/RpcProvider.d.ts.map +1 -0
- package/lib/Local/RpcProvider.js +57 -0
- package/lib/Local/RpcProvider.js.map +1 -0
- package/lib/Local/RpcProviderProxy.d.ts +19 -0
- package/lib/Local/RpcProviderProxy.d.ts.map +1 -0
- package/lib/Local/RpcProviderProxy.js +48 -0
- package/lib/Local/RpcProviderProxy.js.map +1 -0
- package/lib/Local/RpcSerialization.d.ts +34 -0
- package/lib/Local/RpcSerialization.d.ts.map +1 -0
- package/lib/Local/RpcSerialization.js +120 -0
- package/lib/Local/RpcSerialization.js.map +1 -0
- package/lib/Local/RpcServer.d.ts +63 -0
- package/lib/Local/RpcServer.d.ts.map +1 -0
- package/lib/Local/RpcServer.js +72 -0
- package/lib/Local/RpcServer.js.map +1 -0
- package/lib/Local/RpcServerBun.d.ts +3 -0
- package/lib/Local/RpcServerBun.d.ts.map +1 -0
- package/lib/Local/RpcServerBun.js +47 -0
- package/lib/Local/RpcServerBun.js.map +1 -0
- package/lib/Local/RpcServerEnvironment.d.ts +20 -0
- package/lib/Local/RpcServerEnvironment.d.ts.map +1 -0
- package/lib/Local/RpcServerEnvironment.js +22 -0
- package/lib/Local/RpcServerEnvironment.js.map +1 -0
- package/lib/Local/RpcServerNode.d.ts +3 -0
- package/lib/Local/RpcServerNode.d.ts.map +1 -0
- package/lib/Local/RpcServerNode.js +43 -0
- package/lib/Local/RpcServerNode.js.map +1 -0
- package/lib/Local/RpcServerSession.d.ts +27 -0
- package/lib/Local/RpcServerSession.d.ts.map +1 -0
- package/lib/Local/RpcServerSession.js +68 -0
- package/lib/Local/RpcServerSession.js.map +1 -0
- package/lib/Local/RpcSpawner.d.ts +21 -0
- package/lib/Local/RpcSpawner.d.ts.map +1 -0
- package/lib/Local/RpcSpawner.js +132 -0
- package/lib/Local/RpcSpawner.js.map +1 -0
- package/lib/Util/PlatformServices.d.ts +7 -0
- package/lib/Util/PlatformServices.d.ts.map +1 -1
- package/lib/Util/PlatformServices.js +22 -11
- package/lib/Util/PlatformServices.js.map +1 -1
- package/lib/Util/camel.d.ts.map +1 -1
- package/lib/Util/camel.js +2 -3
- package/lib/Util/camel.js.map +1 -1
- package/lib/Util/data.d.ts +5 -0
- package/lib/Util/data.d.ts.map +1 -1
- package/lib/Util/data.js +29 -0
- package/lib/Util/data.js.map +1 -1
- package/lib/Util/stable.d.ts.map +1 -1
- package/lib/Util/stable.js +3 -6
- package/lib/Util/stable.js.map +1 -1
- package/lib/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +12 -14
- package/src/Auth/Lock.ts +2 -2
- package/src/Bundle/Bundle.ts +35 -13
- package/src/Bundle/BundleAnalyzerPlugin.ts +33 -0
- package/src/Bundle/RawPlugin.ts +82 -0
- package/src/Bundle/index.ts +2 -0
- package/src/Cli/commands/dev.ts +51 -37
- package/src/Cli/exec.ts +12 -7
- package/src/Cloudflare/Local.ts +23 -0
- package/src/Cloudflare/Providers.ts +3 -0
- package/src/Cloudflare/Workers/DurableObjectBridge.ts +0 -1
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +547 -21
- package/src/Cloudflare/Workers/Worker.ts +11 -22
- package/src/Cloudflare/Workers/WorkerBridge.ts +3 -5
- package/src/Cloudflare/Workers/WorkerBundle.ts +4 -8
- package/src/Cloudflare/Zaraz/ZarazConfig.ts +403 -0
- package/src/Cloudflare/Zaraz/ZarazEventTypes.ts +257 -0
- package/src/Cloudflare/Zaraz/index.ts +25 -0
- package/src/Cloudflare/index.ts +1 -0
- package/src/Local/RpcProvider.ts +102 -0
- package/src/Local/RpcProviderProxy.ts +86 -0
- package/src/Local/RpcSerialization.ts +225 -0
- package/src/Local/RpcServer.ts +138 -0
- package/src/Local/RpcServerBun.ts +59 -0
- package/src/Local/RpcServerEnvironment.ts +55 -0
- package/src/Local/RpcServerNode.ts +58 -0
- package/src/Local/RpcServerSession.ts +87 -0
- package/src/Local/RpcSpawner.ts +196 -0
- package/src/Util/PlatformServices.ts +41 -27
- package/src/Util/camel.ts +3 -5
- package/src/Util/data.ts +38 -0
- package/src/Util/stable.ts +4 -10
- package/lib/Cloudflare/Local/Sidecar.d.ts +0 -63
- package/lib/Cloudflare/Local/Sidecar.d.ts.map +0 -1
- package/lib/Cloudflare/Local/Sidecar.js +0 -50
- package/lib/Cloudflare/Local/Sidecar.js.map +0 -1
- package/lib/Cloudflare/Local/SidecarHandlers.d.ts +0 -8
- package/lib/Cloudflare/Local/SidecarHandlers.d.ts.map +0 -1
- package/lib/Cloudflare/Local/SidecarHandlers.js +0 -381
- package/lib/Cloudflare/Local/SidecarHandlers.js.map +0 -1
- package/lib/Cloudflare/Local/SidecarServer.d.ts +0 -2
- package/lib/Cloudflare/Local/SidecarServer.d.ts.map +0 -1
- package/lib/Cloudflare/Local/SidecarServer.js +0 -34
- package/lib/Cloudflare/Local/SidecarServer.js.map +0 -1
- package/lib/Sidecar/Lock.d.ts +0 -23
- package/lib/Sidecar/Lock.d.ts.map +0 -1
- package/lib/Sidecar/Lock.js +0 -39
- package/lib/Sidecar/Lock.js.map +0 -1
- package/lib/Sidecar/RpcClient.d.ts +0 -15
- package/lib/Sidecar/RpcClient.d.ts.map +0 -1
- package/lib/Sidecar/RpcClient.js +0 -78
- package/lib/Sidecar/RpcClient.js.map +0 -1
- package/lib/Sidecar/RpcHandler.d.ts +0 -51
- package/lib/Sidecar/RpcHandler.d.ts.map +0 -1
- package/lib/Sidecar/RpcHandler.js +0 -87
- package/lib/Sidecar/RpcHandler.js.map +0 -1
- package/lib/Sidecar/RpcPaths.d.ts +0 -19
- package/lib/Sidecar/RpcPaths.d.ts.map +0 -1
- package/lib/Sidecar/RpcPaths.js +0 -31
- package/lib/Sidecar/RpcPaths.js.map +0 -1
- package/lib/Sidecar/RpcServer.d.ts +0 -30
- package/lib/Sidecar/RpcServer.d.ts.map +0 -1
- package/lib/Sidecar/RpcServer.js +0 -105
- package/lib/Sidecar/RpcServer.js.map +0 -1
- package/lib/Sidecar/RpcServerBun.d.ts +0 -4
- package/lib/Sidecar/RpcServerBun.d.ts.map +0 -1
- package/lib/Sidecar/RpcServerBun.js +0 -28
- package/lib/Sidecar/RpcServerBun.js.map +0 -1
- package/lib/Sidecar/RpcServerNode.d.ts +0 -4
- package/lib/Sidecar/RpcServerNode.d.ts.map +0 -1
- package/lib/Sidecar/RpcServerNode.js +0 -39
- package/lib/Sidecar/RpcServerNode.js.map +0 -1
- package/lib/Sidecar/RpcServices.d.ts +0 -6
- package/lib/Sidecar/RpcServices.d.ts.map +0 -1
- package/lib/Sidecar/RpcServices.js +0 -29
- package/lib/Sidecar/RpcServices.js.map +0 -1
- package/src/Cloudflare/Local/Sidecar.ts +0 -81
- package/src/Cloudflare/Local/SidecarHandlers.ts +0 -491
- package/src/Cloudflare/Local/SidecarServer.ts +0 -70
- package/src/Sidecar/Lock.ts +0 -66
- package/src/Sidecar/RpcClient.ts +0 -142
- package/src/Sidecar/RpcHandler.ts +0 -205
- package/src/Sidecar/RpcPaths.ts +0 -39
- package/src/Sidecar/RpcServer.ts +0 -153
- package/src/Sidecar/RpcServerBun.ts +0 -41
- package/src/Sidecar/RpcServerNode.ts +0 -51
- package/src/Sidecar/RpcServices.ts +0 -48
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { newWebSocketRpcSession } from "capnweb";
|
|
2
|
+
import * as Cache from "effect/Cache";
|
|
3
|
+
import * as Config from "effect/Config";
|
|
4
|
+
import * as Context from "effect/Context";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import * as HttpBody from "effect/unstable/http/HttpBody";
|
|
8
|
+
import * as HttpClient from "effect/unstable/http/HttpClient";
|
|
9
|
+
import { AlchemyContext } from "../AlchemyContext.js";
|
|
10
|
+
import { Stack } from "../Stack.js";
|
|
11
|
+
import { unwrapRpcHandlers } from "./RpcSerialization.js";
|
|
12
|
+
export class RpcProviderProxy extends Context.Service()("alchemy/Local/RpcProviderProxy") {
|
|
13
|
+
}
|
|
14
|
+
export const SPAWNER_URL_ENV_KEY = "ALCHEMY_RPC_SPAWNER_URL";
|
|
15
|
+
const make = Effect.fnUntraced(function* (spawnerUrl) {
|
|
16
|
+
const client = yield* HttpClient.HttpClient;
|
|
17
|
+
const getSession = Effect.fnUntraced(function* (serverEntryUrl) {
|
|
18
|
+
const alchemyContext = yield* AlchemyContext;
|
|
19
|
+
const stack = yield* Stack;
|
|
20
|
+
const payload = {
|
|
21
|
+
serverEntryUrl,
|
|
22
|
+
alchemyContext,
|
|
23
|
+
stack: { name: stack.name, stage: stack.stage },
|
|
24
|
+
};
|
|
25
|
+
const response = yield* client.post(spawnerUrl, {
|
|
26
|
+
body: yield* HttpBody.json(payload),
|
|
27
|
+
});
|
|
28
|
+
const websocketUrl = yield* response.text;
|
|
29
|
+
return newWebSocketRpcSession(websocketUrl);
|
|
30
|
+
}, (effect, serverEntryUrl) => Effect.catch(effect, (error) => Effect.die(new Error(`Failed to create provider RPC session for "${serverEntryUrl}"`, {
|
|
31
|
+
cause: error,
|
|
32
|
+
}))));
|
|
33
|
+
const cache = yield* Cache.make({
|
|
34
|
+
lookup: getSession,
|
|
35
|
+
capacity: Infinity,
|
|
36
|
+
requireServicesAt: "lookup",
|
|
37
|
+
});
|
|
38
|
+
return RpcProviderProxy.of({
|
|
39
|
+
get: Effect.fnUntraced(function* (mainUrl, providerName) {
|
|
40
|
+
const session = yield* cache.lookup(mainUrl);
|
|
41
|
+
const provider = yield* Effect.promise(() => session.getProvider(providerName));
|
|
42
|
+
return unwrapRpcHandlers(provider, ["tail"]);
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
export const layer = (url) => Layer.effect(RpcProviderProxy, make(url));
|
|
47
|
+
export const fromEnv = () => Layer.effect(RpcProviderProxy, Config.string(SPAWNER_URL_ENV_KEY).pipe(Effect.flatMap(make)));
|
|
48
|
+
//# sourceMappingURL=RpcProviderProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcProviderProxy.js","sourceRoot":"","sources":["../../src/Local/RpcProviderProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Stream from "effect/Stream";
|
|
3
|
+
type RpcEffectHandler<Args extends Array<any>, Success, Error> = (...args: Args) => Effect.Effect<Success, Error>;
|
|
4
|
+
type RpcWrappedEffectHandler<Args extends Array<any>, Success, Error> = (args: Args) => Promise<RpcSerializedExit<Success, Error>>;
|
|
5
|
+
type RpcStreamHandler<Args extends Array<any>, Success, Error> = (...args: Args) => Stream.Stream<Success, Error>;
|
|
6
|
+
type RpcWrappedStreamHandler<Args extends Array<any>, Success, Error> = (args: Args) => RpcSerializedStream<Success, Error>;
|
|
7
|
+
type RpcSerializedStream<Success, _Error> = ReadableStream<Success>;
|
|
8
|
+
type RpcSerializedExit<Success, Error> = {
|
|
9
|
+
_tag: "Success";
|
|
10
|
+
value: Success;
|
|
11
|
+
} | {
|
|
12
|
+
_tag: "Failure";
|
|
13
|
+
cause: Array<RpcSerializedCause<Error>>;
|
|
14
|
+
};
|
|
15
|
+
type RpcSerializedCause<Error> = {
|
|
16
|
+
_tag: "Fail";
|
|
17
|
+
error: Error;
|
|
18
|
+
} | {
|
|
19
|
+
_tag: "Die";
|
|
20
|
+
defect: unknown;
|
|
21
|
+
} | {
|
|
22
|
+
_tag: "Interrupt";
|
|
23
|
+
fiberId: number | undefined;
|
|
24
|
+
};
|
|
25
|
+
export type RpcWrapped<T> = T extends RpcEffectHandler<infer Args, infer Success, infer Error> ? RpcWrappedEffectHandler<Args, Success, Error> : T extends RpcStreamHandler<infer Args, infer Success, infer Error> ? RpcWrappedStreamHandler<Args, Success, Error> : T extends Record<string, any> ? {
|
|
26
|
+
[K in keyof T]: RpcWrapped<T[K]>;
|
|
27
|
+
} : T;
|
|
28
|
+
export type RpcUnwrapped<T> = T extends RpcWrappedEffectHandler<infer Args, infer Success, infer Error> ? RpcEffectHandler<Args, Success, Error> : T extends RpcWrappedStreamHandler<infer Args, infer Success, infer Error> ? RpcStreamHandler<Args, Success, Error> : T extends Record<string, any> ? {
|
|
29
|
+
[K in keyof T]: RpcUnwrapped<T[K]>;
|
|
30
|
+
} : T;
|
|
31
|
+
export declare const wrapRpcHandlers: <T extends Record<string, any>>(handlers: T, streamKeys?: Array<keyof T>) => RpcWrapped<T>;
|
|
32
|
+
export declare const unwrapRpcHandlers: <T extends Record<string, any>>(handlers: RpcWrapped<T>, streamKeys?: Array<keyof T>) => RpcUnwrapped<T>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=RpcSerialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcSerialization.d.ts","sourceRoot":"","sources":["../../src/Local/RpcSerialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as Cause from "effect/Cause";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Exit from "effect/Exit";
|
|
4
|
+
import { flow } from "effect/Function";
|
|
5
|
+
import * as Redacted from "effect/Redacted";
|
|
6
|
+
import * as Schema from "effect/Schema";
|
|
7
|
+
import * as Stream from "effect/Stream";
|
|
8
|
+
import * as NodeUtil from "node:util";
|
|
9
|
+
import * as Output from "../Output.js";
|
|
10
|
+
export const wrapRpcHandlers = (handlers, streamKeys) => {
|
|
11
|
+
return Object.fromEntries(Object.entries(handlers).map(([key, value]) => [
|
|
12
|
+
key,
|
|
13
|
+
typeof value === "function"
|
|
14
|
+
? streamKeys?.includes(key)
|
|
15
|
+
? wrapRpcStreamHandler(value)
|
|
16
|
+
: wrapRpcEffectHandler(value)
|
|
17
|
+
: typeof value === "object" && value !== null
|
|
18
|
+
? wrapRpcHandlers(value)
|
|
19
|
+
: value,
|
|
20
|
+
]));
|
|
21
|
+
};
|
|
22
|
+
export const unwrapRpcHandlers = (handlers, streamKeys) => {
|
|
23
|
+
return Object.fromEntries(Object.entries(handlers).map(([key, value]) => [
|
|
24
|
+
key,
|
|
25
|
+
typeof value === "function"
|
|
26
|
+
? streamKeys?.includes(key)
|
|
27
|
+
? unwrapRpcStreamHandler(value)
|
|
28
|
+
: unwrapRpcEffectHandler(value)
|
|
29
|
+
: typeof value === "object" && value !== null
|
|
30
|
+
? unwrapRpcHandlers(value)
|
|
31
|
+
: value,
|
|
32
|
+
]));
|
|
33
|
+
};
|
|
34
|
+
const serializeError = Schema.encodeSync(Schema.Defect);
|
|
35
|
+
const wrapRpcEffectHandler = (handler) => flow((args) => deserializeRpcArgs(args), (args) => handler(...args), Effect.exit, Effect.map((exit) => {
|
|
36
|
+
if (exit._tag === "Success") {
|
|
37
|
+
return { _tag: "Success", value: exit.value };
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
_tag: "Failure",
|
|
41
|
+
cause: exit.cause.reasons.map((reason) => {
|
|
42
|
+
switch (reason._tag) {
|
|
43
|
+
case "Fail":
|
|
44
|
+
return { _tag: "Fail", error: serializeError(reason.error) };
|
|
45
|
+
case "Die":
|
|
46
|
+
return { _tag: "Die", defect: serializeError(reason.defect) };
|
|
47
|
+
case "Interrupt":
|
|
48
|
+
return { _tag: "Interrupt", fiberId: reason.fiberId };
|
|
49
|
+
}
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
}), Effect.runPromise);
|
|
53
|
+
const wrapRpcStreamHandler = (handler) => flow((args) => deserializeRpcArgs(args), (args) => handler(...args), (stream) => Stream.toReadableStream(stream));
|
|
54
|
+
const unwrapRpcEffectHandler = (handler) => flow((...args) => serializeRpcArgs(args), (args) => Effect.promise(() => handler(args)), Effect.flatMap((exit) => {
|
|
55
|
+
if (exit._tag === "Success") {
|
|
56
|
+
return Exit.succeed(exit.value);
|
|
57
|
+
}
|
|
58
|
+
return Exit.failCause(Cause.fromReasons(exit.cause.map((reason) => {
|
|
59
|
+
switch (reason._tag) {
|
|
60
|
+
case "Fail":
|
|
61
|
+
return Cause.makeFailReason(reason.error);
|
|
62
|
+
case "Die":
|
|
63
|
+
return Cause.makeDieReason(reason.defect);
|
|
64
|
+
case "Interrupt":
|
|
65
|
+
return Cause.makeInterruptReason(reason.fiberId);
|
|
66
|
+
}
|
|
67
|
+
})));
|
|
68
|
+
}));
|
|
69
|
+
const unwrapRpcStreamHandler = (handler) => flow((...args) => serializeRpcArgs(args), (args) => handler(args), (stream) => Stream.fromReadableStream({
|
|
70
|
+
evaluate: () => stream,
|
|
71
|
+
onError: (error) => error,
|
|
72
|
+
}));
|
|
73
|
+
const serializeRpcArgs = (value) => {
|
|
74
|
+
if (Redacted.isRedacted(value)) {
|
|
75
|
+
return { _tag: "Redacted", value: Redacted.value(value) };
|
|
76
|
+
}
|
|
77
|
+
if (Output.isOutput(value)) {
|
|
78
|
+
return {
|
|
79
|
+
_tag: "Output",
|
|
80
|
+
description: NodeUtil.inspect(value),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (typeof value === "function") {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(value)) {
|
|
87
|
+
return value.map(serializeRpcArgs);
|
|
88
|
+
}
|
|
89
|
+
if (value && typeof value === "object" && !("toJSON" in value)) {
|
|
90
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [
|
|
91
|
+
key,
|
|
92
|
+
serializeRpcArgs(child),
|
|
93
|
+
]));
|
|
94
|
+
}
|
|
95
|
+
return value;
|
|
96
|
+
};
|
|
97
|
+
const deserializeRpcArgs = (value) => {
|
|
98
|
+
if (Array.isArray(value)) {
|
|
99
|
+
return value.map(deserializeRpcArgs);
|
|
100
|
+
}
|
|
101
|
+
else if (typeof value === "object" && value !== null) {
|
|
102
|
+
// These values are serialized as `{_tag: "Redacted", value: ...}` and `{_tag: "Output", description: ...}`,
|
|
103
|
+
// so we need to detect them manually - Redacted.isRedacted and Output.isOutput do not work.
|
|
104
|
+
if ("_tag" in value && value._tag === "Redacted" && "value" in value) {
|
|
105
|
+
return Redacted.make(value.value);
|
|
106
|
+
}
|
|
107
|
+
else if ("_tag" in value &&
|
|
108
|
+
value._tag === "Output" &&
|
|
109
|
+
"description" in value &&
|
|
110
|
+
typeof value.description === "string") {
|
|
111
|
+
return new Output.NamedExpr(new Output.EffectExpr(Output.VoidExpr, () => Effect.never), value.description);
|
|
112
|
+
}
|
|
113
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [
|
|
114
|
+
key,
|
|
115
|
+
deserializeRpcArgs(child),
|
|
116
|
+
]));
|
|
117
|
+
}
|
|
118
|
+
return value;
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=RpcSerialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcSerialization.js","sourceRoot":"","sources":["../../src/Local/RpcSerialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import type * as Scope from "effect/Scope";
|
|
5
|
+
import type { HttpClient } from "effect/unstable/http/HttpClient";
|
|
6
|
+
import type { ProviderService } from "../Provider.ts";
|
|
7
|
+
import type { ResourceLike } from "../Resource.ts";
|
|
8
|
+
import { PlatformServices } from "../Util/PlatformServices.ts";
|
|
9
|
+
import * as RpcSerialization from "./RpcSerialization.ts";
|
|
10
|
+
import * as RpcServerEnvironment from "./RpcServerEnvironment.ts";
|
|
11
|
+
import { type ServerRpcSession, type ServerWebSocketLike } from "./RpcServerSession.ts";
|
|
12
|
+
declare const RpcServer_base: Context.ServiceClass<RpcServer, "alchemy/Local/RpcServer", never>;
|
|
13
|
+
/**
|
|
14
|
+
* A service that exposes one or more resource providers over RPC.
|
|
15
|
+
* This returns `never` because it is meant to be used with `Layer.launch` (see {@link launch}).
|
|
16
|
+
*/
|
|
17
|
+
export declare class RpcServer extends RpcServer_base {
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The RPC API that is implemented by the server and consumed by {@link RpcProviderProxy}.
|
|
21
|
+
*/
|
|
22
|
+
export interface RpcProxyApi {
|
|
23
|
+
/**
|
|
24
|
+
* Retrieves a provider from the RPC server context.
|
|
25
|
+
* The consumer must unwrap the provider using {@link RpcSerialization.unwrapRpcHandlers} before using it.
|
|
26
|
+
*/
|
|
27
|
+
readonly getProvider: <R extends ResourceLike>(type: R["Type"]) => Promise<RpcSerialization.RpcWrapped<ProviderService<R>>>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Launches an RPC server that serves the given providers.
|
|
31
|
+
* Alchemy globals such as `AlchemyContext`, `Profile`, and `Stack` are inherited from the parent via {@link RpcServerEnvironment.fromEnv} and should not be provided manually.
|
|
32
|
+
* `PlatformServices` and `HttpClient` are also included.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* RpcServer.launch(
|
|
37
|
+
* Layer.merge(
|
|
38
|
+
* FunctionProvider,
|
|
39
|
+
* QueueProvider,
|
|
40
|
+
* ),
|
|
41
|
+
* );
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @param providers - A layer containing the providers to serve.
|
|
45
|
+
*/
|
|
46
|
+
export declare const launch: <ROut, E>(providers: Layer.Layer<ROut, E, Scope.Scope | RpcServerEnvironment.RpcEnvironmentServices | PlatformServices | HttpClient>) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Constructs an `RpcServer` layer using the given server implementation.
|
|
49
|
+
* @param serve - A function that spawns a websocket server and returns its URL.
|
|
50
|
+
* @returns An `RpcServer` layer.
|
|
51
|
+
*/
|
|
52
|
+
export declare const layerServer: (serve: (handlers: {
|
|
53
|
+
/** Creates a new RPC session over the given websocket. */
|
|
54
|
+
createRpcSession: (ws: ServerWebSocketLike) => ServerRpcSession<RpcProxyApi>;
|
|
55
|
+
/** Called when the parent connection, indicated by the `/parent` path, is established. */
|
|
56
|
+
parentConnected: () => void;
|
|
57
|
+
/** Called when the parent disconnects. The server will shut down when this is called. */
|
|
58
|
+
parentDisconnected: () => void;
|
|
59
|
+
}) => Effect.Effect<{
|
|
60
|
+
readonly url: string;
|
|
61
|
+
}, never, Scope.Scope>) => Layer.Layer<RpcServer, import("effect/Cause").TimeoutError, never>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=RpcServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServer.d.ts","sourceRoot":"","sources":["../../src/Local/RpcServer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAEL,gBAAgB,EAEjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;;AAE/B;;;GAGG;AACH,qBAAa,SAAU,SAAQ,cAE9B;CAAG;AAEJ;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,YAAY,EAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KACZ,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,EAAE,CAAC,EAC5B,WAAW,KAAK,CAAC,KAAK,CACpB,IAAI,EACJ,CAAC,EACC,KAAK,CAAC,KAAK,GACX,oBAAoB,CAAC,sBAAsB,GAC3C,gBAAgB,GAChB,UAAU,CACb,SASA,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,CAAC,QAAQ,EAAE;IAChB,0DAA0D;IAC1D,gBAAgB,EAAE,CAChB,EAAE,EAAE,mBAAmB,KACpB,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnC,0FAA0F;IAC1F,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,yFAAyF;IACzF,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,KAAK,MAAM,CAAC,MAAM,CAAC;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,uEA+BhE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as Console from "effect/Console";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Deferred from "effect/Deferred";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
|
|
7
|
+
import { platformLayer, PlatformServices, runMain, } from "../Util/PlatformServices.js";
|
|
8
|
+
import * as RpcSerialization from "./RpcSerialization.js";
|
|
9
|
+
import * as RpcServerEnvironment from "./RpcServerEnvironment.js";
|
|
10
|
+
import { makeServerRpcSession, } from "./RpcServerSession.js";
|
|
11
|
+
/**
|
|
12
|
+
* A service that exposes one or more resource providers over RPC.
|
|
13
|
+
* This returns `never` because it is meant to be used with `Layer.launch` (see {@link launch}).
|
|
14
|
+
*/
|
|
15
|
+
export class RpcServer extends Context.Service()("alchemy/Local/RpcServer") {
|
|
16
|
+
}
|
|
17
|
+
const serverPlatformLayer = platformLayer({
|
|
18
|
+
bun: async () => {
|
|
19
|
+
const { RpcServerBun } = await import("./RpcServerBun.js");
|
|
20
|
+
return RpcServerBun;
|
|
21
|
+
},
|
|
22
|
+
node: async () => {
|
|
23
|
+
const { RpcServerNode } = await import("./RpcServerNode.js");
|
|
24
|
+
return RpcServerNode;
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Launches an RPC server that serves the given providers.
|
|
29
|
+
* Alchemy globals such as `AlchemyContext`, `Profile`, and `Stack` are inherited from the parent via {@link RpcServerEnvironment.fromEnv} and should not be provided manually.
|
|
30
|
+
* `PlatformServices` and `HttpClient` are also included.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* RpcServer.launch(
|
|
35
|
+
* Layer.merge(
|
|
36
|
+
* FunctionProvider,
|
|
37
|
+
* QueueProvider,
|
|
38
|
+
* ),
|
|
39
|
+
* );
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @param providers - A layer containing the providers to serve.
|
|
43
|
+
*/
|
|
44
|
+
export const launch = (providers) => serverPlatformLayer.pipe(Layer.provide(providers), Layer.provide(RpcServerEnvironment.fromEnv()), Layer.provide(Layer.merge(PlatformServices, FetchHttpClient.layer)), Layer.launch, Effect.scoped, runMain);
|
|
45
|
+
/**
|
|
46
|
+
* Constructs an `RpcServer` layer using the given server implementation.
|
|
47
|
+
* @param serve - A function that spawns a websocket server and returns its URL.
|
|
48
|
+
* @returns An `RpcServer` layer.
|
|
49
|
+
*/
|
|
50
|
+
export const layerServer = (serve) => Layer.effect(RpcServer, Effect.gen(function* () {
|
|
51
|
+
const context = yield* Effect.context();
|
|
52
|
+
const connected = yield* Deferred.make();
|
|
53
|
+
const disconnected = yield* Deferred.make();
|
|
54
|
+
const { url } = yield* serve({
|
|
55
|
+
createRpcSession: (ws) => makeServerRpcSession(ws, {
|
|
56
|
+
getProvider: async (type) => {
|
|
57
|
+
const provider = context.mapUnsafe.get(type);
|
|
58
|
+
if (!provider) {
|
|
59
|
+
throw new Error(`Provider "${type}" not found`);
|
|
60
|
+
}
|
|
61
|
+
return RpcSerialization.wrapRpcHandlers(provider, ["tail"]);
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
parentConnected: () => Deferred.doneUnsafe(connected, Effect.void),
|
|
65
|
+
parentDisconnected: () => Deferred.doneUnsafe(disconnected, Effect.void),
|
|
66
|
+
});
|
|
67
|
+
yield* Console.log(`<ALCHEMY_RPC_ADDRESS>${url}</ALCHEMY_RPC_ADDRESS>`);
|
|
68
|
+
yield* Deferred.await(connected).pipe(Effect.timeout("10 seconds")); // TODO(john): should the timeout be shorter?
|
|
69
|
+
yield* Deferred.await(disconnected);
|
|
70
|
+
return yield* Effect.interrupt;
|
|
71
|
+
}));
|
|
72
|
+
//# sourceMappingURL=RpcServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServer.js","sourceRoot":"","sources":["../../src/Local/RpcServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerBun.d.ts","sourceRoot":"","sources":["../../src/Local/RpcServerBun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAG5C,eAAO,MAAM,YAAY,+FAsDxB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as RpcServer from "./RpcServer.js";
|
|
3
|
+
export const RpcServerBun = RpcServer.layerServer(Effect.fnUntraced(function* ({ parentConnected, parentDisconnected, createRpcSession, }) {
|
|
4
|
+
const server = yield* Effect.sync(() => Bun.serve({
|
|
5
|
+
port: 0,
|
|
6
|
+
fetch: (request, server) => {
|
|
7
|
+
const url = new URL(request.url);
|
|
8
|
+
if (server.upgrade(request, {
|
|
9
|
+
data: url.pathname === "/parent" ? { type: "parent" } : undefined,
|
|
10
|
+
})) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
return new Response("Upgrade failed", { status: 400 });
|
|
14
|
+
},
|
|
15
|
+
websocket: {
|
|
16
|
+
open: (ws) => {
|
|
17
|
+
if (ws.data && ws.data.type === "parent") {
|
|
18
|
+
parentConnected();
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
ws.data = {
|
|
22
|
+
type: "session",
|
|
23
|
+
session: createRpcSession(ws),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
message: (ws, message) => {
|
|
28
|
+
if (ws.data.type === "session") {
|
|
29
|
+
ws.data.session.dispatch.message(message);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
close: (ws, code, reason) => {
|
|
33
|
+
if (ws.data.type === "session") {
|
|
34
|
+
ws.data.session.dispatch.close(code, reason);
|
|
35
|
+
}
|
|
36
|
+
else if (ws.data.type === "parent") {
|
|
37
|
+
parentDisconnected();
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}));
|
|
42
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => server.stop(true)));
|
|
43
|
+
return {
|
|
44
|
+
url: `ws://${server.hostname}:${server.port}`,
|
|
45
|
+
};
|
|
46
|
+
}));
|
|
47
|
+
//# sourceMappingURL=RpcServerBun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerBun.js","sourceRoot":"","sources":["../../src/Local/RpcServerBun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAG5C,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAC/C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAC3B,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACrC,GAAG,CAAC,KAAK,CAEP;QACA,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IACE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;gBACtB,IAAI,EACF,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAU;aAC/D,CAAC,EACF,CAAC;gBACD,OAAO;YACT,CAAC;YACD,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACzC,eAAe,EAAE,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,IAAI,GAAG;wBACR,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;qBAC9B,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;gBACvB,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC/B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;gBAC1B,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC/B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/C,CAAC;qBAAM,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,kBAAkB,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;SACF;KACF,CAAC,CACH,CAAC;IACF,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO;QACL,GAAG,EAAE,QAAQ,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;KAC9C,CAAC;AACJ,CAAC,CAAC,CACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as Config from "effect/Config";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import { AlchemyContext } from "../AlchemyContext.ts";
|
|
4
|
+
import { AuthProviders } from "../Auth/AuthProvider.ts";
|
|
5
|
+
import { Stack } from "../Stack.ts";
|
|
6
|
+
import { Stage } from "../Stage.ts";
|
|
7
|
+
export interface RpcServerEnvironment {
|
|
8
|
+
alchemyContext: AlchemyContext["Service"];
|
|
9
|
+
profile: string | undefined;
|
|
10
|
+
envFile: string | undefined;
|
|
11
|
+
stack: {
|
|
12
|
+
name: string;
|
|
13
|
+
stage: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export type RpcEnvironmentServices = Layer.Success<ReturnType<typeof layer>>;
|
|
17
|
+
export declare const layer: (environment: RpcServerEnvironment) => Layer.Layer<AlchemyContext | import("../Auth/Profile.ts").Profile | AuthProviders | import("../Auth/Credentials.ts").CredentialsStore | Stage | Stack, import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem>;
|
|
18
|
+
export declare const RPC_SERVER_ENVIRONMENT_KEY: "ALCHEMY_RPC_SERVER_ENVIRONMENT";
|
|
19
|
+
export declare const fromEnv: () => Layer.Layer<AlchemyContext | import("../Auth/Profile.ts").Profile | AuthProviders | import("../Auth/Credentials.ts").CredentialsStore | Stage | Stack, Config.ConfigError | import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem>;
|
|
20
|
+
//# sourceMappingURL=RpcServerEnvironment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerEnvironment.d.ts","sourceRoot":"","sources":["../../src/Local/RpcServerEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;AAE7E,eAAO,MAAM,KAAK,GAAI,aAAa,oBAAoB,iPAmBpD,CAAC;AAEJ,eAAO,MAAM,0BAA0B,EACrC,gCAAyC,CAAC;AAE5C,eAAO,MAAM,OAAO,yQAKjB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as Config from "effect/Config";
|
|
2
|
+
import * as ConfigProvider from "effect/ConfigProvider";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import * as Option from "effect/Option";
|
|
6
|
+
import { AlchemyContext } from "../AlchemyContext.js";
|
|
7
|
+
import { AuthProviders } from "../Auth/AuthProvider.js";
|
|
8
|
+
import { CredentialsStoreLive } from "../Auth/Credentials.js";
|
|
9
|
+
import { ProfileLive, withProfileOverride } from "../Auth/Profile.js";
|
|
10
|
+
import { Stack } from "../Stack.js";
|
|
11
|
+
import { Stage } from "../Stage.js";
|
|
12
|
+
import { loadConfigProvider } from "../Util/ConfigProvider.js";
|
|
13
|
+
export const layer = (environment) => Layer.mergeAll(ProfileLive, CredentialsStoreLive, Layer.succeed(AuthProviders, {}), ConfigProvider.layer(loadConfigProvider(Option.fromUndefinedOr(environment.envFile)).pipe(Effect.map((base) => withProfileOverride(base, environment.profile)))), Layer.succeed(AlchemyContext, environment.alchemyContext), Layer.succeed(Stack, {
|
|
14
|
+
name: environment.stack.name,
|
|
15
|
+
stage: environment.stack.stage,
|
|
16
|
+
resources: {},
|
|
17
|
+
bindings: {},
|
|
18
|
+
actions: {},
|
|
19
|
+
}), Layer.succeed(Stage, environment.stack.stage));
|
|
20
|
+
export const RPC_SERVER_ENVIRONMENT_KEY = "ALCHEMY_RPC_SERVER_ENVIRONMENT";
|
|
21
|
+
export const fromEnv = () => Config.string(RPC_SERVER_ENVIRONMENT_KEY).pipe(Config.map(JSON.parse), Effect.map((environment) => layer(environment)), Layer.unwrap);
|
|
22
|
+
//# sourceMappingURL=RpcServerEnvironment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerEnvironment.js","sourceRoot":"","sources":["../../src/Local/RpcServerEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAc/D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,WAAiC,EAAE,EAAE,CACzD,KAAK,CAAC,QAAQ,CACZ,WAAW,EACX,oBAAoB,EACpB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAChC,cAAc,CAAC,KAAK,CAClB,kBAAkB,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAClE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CACrE,CACF,EACD,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,EACzD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;IACnB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI;IAC5B,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK;IAC9B,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;CACZ,CAAC,EACF,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAC9C,CAAC;AAEJ,MAAM,CAAC,MAAM,0BAA0B,GACrC,gCAAyC,CAAC;AAE5C,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAC1B,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EACtB,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAC/C,KAAK,CAAC,MAAM,CACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerNode.d.ts","sourceRoot":"","sources":["../../src/Local/RpcServerNode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAE5C,eAAO,MAAM,aAAa,+FAkCzB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { WebSocketServer } from "ws";
|
|
3
|
+
import * as RpcServer from "./RpcServer.js";
|
|
4
|
+
export const RpcServerNode = RpcServer.layerServer(Effect.fnUntraced(function* ({ parentConnected, parentDisconnected, createRpcSession, }) {
|
|
5
|
+
const server = new WebSocketServer({ host: "127.0.0.1", port: 0 });
|
|
6
|
+
const url = yield* Effect.callback((resume) => {
|
|
7
|
+
server.on("connection", (ws, req) => {
|
|
8
|
+
if (req.url?.startsWith("/parent")) {
|
|
9
|
+
parentConnected();
|
|
10
|
+
ws.on("close", () => {
|
|
11
|
+
parentDisconnected();
|
|
12
|
+
});
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const session = createRpcSession(ws);
|
|
16
|
+
ws.on("message", (data) => {
|
|
17
|
+
session.dispatch.message(data.toString());
|
|
18
|
+
});
|
|
19
|
+
ws.on("close", (code, reason) => {
|
|
20
|
+
session.dispatch.close(code, reason.toString());
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
server.on("error", (error) => {
|
|
24
|
+
resume(Effect.die(error));
|
|
25
|
+
});
|
|
26
|
+
server.on("listening", () => {
|
|
27
|
+
resume(getServerAddress(server));
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => server.close()));
|
|
31
|
+
return { url };
|
|
32
|
+
}));
|
|
33
|
+
function getServerAddress(server) {
|
|
34
|
+
const address = server.address();
|
|
35
|
+
if (typeof address === "object" &&
|
|
36
|
+
address !== null &&
|
|
37
|
+
"address" in address &&
|
|
38
|
+
"port" in address) {
|
|
39
|
+
return Effect.succeed(`ws://${address.address === "::" ? "localhost" : address.address}:${address.port}`);
|
|
40
|
+
}
|
|
41
|
+
return Effect.die(new Error(`Server address is not an object with address and port properties: ${JSON.stringify(address)}`));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=RpcServerNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerNode.js","sourceRoot":"","sources":["../../src/Local/RpcServerNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAe,MAAM,IAAI,CAAC;AAClD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC,WAAW,CAChD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAC3B,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB;IACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAS,CAAC,MAAM,EAAE,EAAE;QACpD,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;YAClC,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,eAAe,EAAE,CAAC;gBAClB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBAClB,kBAAkB,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CAAC,CACH,CAAC;AAEF,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,KAAK,IAAI;QAChB,SAAS,IAAI,OAAO;QACpB,MAAM,IAAI,OAAO,EACjB,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CACnB,QAAQ,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CACnF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,KAAK,CACP,qEAAqE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAC/F,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RpcSession, type RpcCompatible } from "capnweb";
|
|
2
|
+
/**
|
|
3
|
+
* A platform-agnostic interface for a server-side WebSocket.
|
|
4
|
+
*/
|
|
5
|
+
export interface ServerWebSocketLike {
|
|
6
|
+
send: (message: string) => any | Promise<any>;
|
|
7
|
+
close: (code?: number, reason?: string) => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Represents a websocket RPC session with capnweb.
|
|
11
|
+
* Use the `dispatch` object to handle messages that are received from the client.
|
|
12
|
+
*/
|
|
13
|
+
export type ServerRpcSession<T extends RpcCompatible<T>> = ReturnType<typeof makeServerRpcSession<T>>;
|
|
14
|
+
/**
|
|
15
|
+
* Constructs a ServerRpcSession using capnweb.
|
|
16
|
+
* @param ws - The WebSocket to use for the session.
|
|
17
|
+
* @param main - The main object to use for the session.
|
|
18
|
+
* @returns A ServerRpcSession.
|
|
19
|
+
*/
|
|
20
|
+
export declare function makeServerRpcSession<T extends RpcCompatible<T>>(ws: ServerWebSocketLike, main: T): {
|
|
21
|
+
session: RpcSession<undefined>;
|
|
22
|
+
dispatch: {
|
|
23
|
+
message: (data: string | Buffer<ArrayBuffer>) => void;
|
|
24
|
+
close: (code: number, reason: string) => void;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=RpcServerSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServerSession.d.ts","sourceRoot":"","sources":["../../src/Local/RpcServerSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAqB,MAAM,SAAS,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,IAAI,UAAU,CACnE,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAC/B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,EAC7D,EAAE,EAAE,mBAAmB,EACvB,IAAI,EAAE,CAAC;;;wBAmCa,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;sBAa9B,MAAM,UAAU,MAAM;;EA3CzC"}
|