effective-rsc 0.1.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/LICENSE +21 -0
- package/LLMS.md +382 -0
- package/README.md +235 -0
- package/bin/ersc.js +3 -0
- package/dist/application/component.d.ts +15 -0
- package/dist/application/component.js +20 -0
- package/dist/application/component.js.map +1 -0
- package/dist/application/definition.d.ts +31 -0
- package/dist/application/definition.js +57 -0
- package/dist/application/definition.js.map +1 -0
- package/dist/application/ersc-identity.d.ts +25 -0
- package/dist/application/ersc-identity.js +23 -0
- package/dist/application/ersc-identity.js.map +1 -0
- package/dist/application/ersc.d.ts +28 -0
- package/dist/application/ersc.js +72 -0
- package/dist/application/ersc.js.map +1 -0
- package/dist/application/layout.d.ts +18 -0
- package/dist/application/layout.js +17 -0
- package/dist/application/layout.js.map +1 -0
- package/dist/application/loading.d.ts +17 -0
- package/dist/application/loading.js +14 -0
- package/dist/application/loading.js.map +1 -0
- package/dist/application/middleware.d.ts +36 -0
- package/dist/application/middleware.js +46 -0
- package/dist/application/middleware.js.map +1 -0
- package/dist/application/page.d.ts +58 -0
- package/dist/application/page.js +50 -0
- package/dist/application/page.js.map +1 -0
- package/dist/application/render-runtime.d.ts +9 -0
- package/dist/application/render-runtime.js +28 -0
- package/dist/application/render-runtime.js.map +1 -0
- package/dist/application/route-graph.d.ts +22 -0
- package/dist/application/route-graph.js +68 -0
- package/dist/application/route-graph.js.map +1 -0
- package/dist/application/route-path.d.ts +31 -0
- package/dist/application/route-path.js +67 -0
- package/dist/application/route-path.js.map +1 -0
- package/dist/application/routes.d.ts +66 -0
- package/dist/application/routes.js +159 -0
- package/dist/application/routes.js.map +1 -0
- package/dist/application/server-fn.d.ts +30 -0
- package/dist/application/server-fn.js +58 -0
- package/dist/application/server-fn.js.map +1 -0
- package/dist/build/build.d.ts +26 -0
- package/dist/build/build.js +59 -0
- package/dist/build/build.js.map +1 -0
- package/dist/build/compiled-server.d.ts +53 -0
- package/dist/build/compiled-server.js +77 -0
- package/dist/build/compiled-server.js.map +1 -0
- package/dist/build/contract.d.ts +23 -0
- package/dist/build/contract.js +41 -0
- package/dist/build/contract.js.map +1 -0
- package/dist/build/dev-channel.d.ts +20 -0
- package/dist/build/dev-channel.js +71 -0
- package/dist/build/dev-channel.js.map +1 -0
- package/dist/build/dev.d.ts +41 -0
- package/dist/build/dev.js +186 -0
- package/dist/build/dev.js.map +1 -0
- package/dist/build/rsc-entry.d.ts +4 -0
- package/dist/build/rsc-entry.js +17 -0
- package/dist/build/rsc-entry.js.map +1 -0
- package/dist/build/rspack-config.d.ts +17 -0
- package/dist/build/rspack-config.js +259 -0
- package/dist/build/rspack-config.js.map +1 -0
- package/dist/build/rspack.d.ts +45 -0
- package/dist/build/rspack.js +231 -0
- package/dist/build/rspack.js.map +1 -0
- package/dist/build/terminal.d.ts +9 -0
- package/dist/build/terminal.js +17 -0
- package/dist/build/terminal.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/application.d.ts +2 -0
- package/dist/client/application.js +73 -0
- package/dist/client/application.js.map +1 -0
- package/dist/client/browser-capabilities.d.ts +9 -0
- package/dist/client/browser-capabilities.js +20 -0
- package/dist/client/browser-capabilities.js.map +1 -0
- package/dist/client/browser-effect-runner.d.ts +13 -0
- package/dist/client/browser-effect-runner.js +13 -0
- package/dist/client/browser-effect-runner.js.map +1 -0
- package/dist/client/browser-renderer.d.ts +70 -0
- package/dist/client/browser-renderer.js +159 -0
- package/dist/client/browser-renderer.js.map +1 -0
- package/dist/client/browser-screen.d.ts +2 -0
- package/dist/client/browser-screen.js +215 -0
- package/dist/client/browser-screen.js.map +1 -0
- package/dist/client/call-server.d.ts +8 -0
- package/dist/client/call-server.js +151 -0
- package/dist/client/call-server.js.map +1 -0
- package/dist/client/client-router.d.ts +6 -0
- package/dist/client/client-router.js +588 -0
- package/dist/client/client-router.js.map +1 -0
- package/dist/client/entry.d.ts +1 -0
- package/dist/client/entry.js +12 -0
- package/dist/client/entry.js.map +1 -0
- package/dist/client/flight-client.d.ts +83 -0
- package/dist/client/flight-client.js +146 -0
- package/dist/client/flight-client.js.map +1 -0
- package/dist/client/initial-flight-stream.d.ts +18 -0
- package/dist/client/initial-flight-stream.js +60 -0
- package/dist/client/initial-flight-stream.js.map +1 -0
- package/dist/client/navigation-api.d.ts +34 -0
- package/dist/client/navigation-api.js +25 -0
- package/dist/client/navigation-api.js.map +1 -0
- package/dist/client/navigation-routing.d.ts +3 -0
- package/dist/client/navigation-routing.js +8 -0
- package/dist/client/navigation-routing.js.map +1 -0
- package/dist/client/react-dom-renderer.d.ts +20 -0
- package/dist/client/react-dom-renderer.js +101 -0
- package/dist/client/react-dom-renderer.js.map +1 -0
- package/dist/client/route-loader.d.ts +81 -0
- package/dist/client/route-loader.js +128 -0
- package/dist/client/route-loader.js.map +1 -0
- package/dist/client/route-refresh.d.ts +31 -0
- package/dist/client/route-refresh.js +132 -0
- package/dist/client/route-refresh.js.map +1 -0
- package/dist/client/route-tree.d.ts +7 -0
- package/dist/client/route-tree.js +34 -0
- package/dist/client/route-tree.js.map +1 -0
- package/dist/dev/channel.d.ts +18 -0
- package/dist/dev/channel.js +30 -0
- package/dist/dev/channel.js.map +1 -0
- package/dist/dev/client.d.ts +3 -0
- package/dist/dev/client.js +132 -0
- package/dist/dev/client.js.map +1 -0
- package/dist/dev/hmr-update.d.ts +20 -0
- package/dist/dev/hmr-update.js +28 -0
- package/dist/dev/hmr-update.js.map +1 -0
- package/dist/dev/panel.d.ts +41 -0
- package/dist/dev/panel.js +9946 -0
- package/dist/dev/panel.js.map +1 -0
- package/dist/dev/runtime-failure.d.ts +11 -0
- package/dist/dev/runtime-failure.js +32 -0
- package/dist/dev/runtime-failure.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/rsc/flight.d.ts +16 -0
- package/dist/rsc/flight.js +6 -0
- package/dist/rsc/flight.js.map +1 -0
- package/dist/rsc/render-route-tree.d.ts +11 -0
- package/dist/rsc/render-route-tree.js +52 -0
- package/dist/rsc/render-route-tree.js.map +1 -0
- package/dist/rsc/route-tree.d.ts +6 -0
- package/dist/rsc/route-tree.js +5 -0
- package/dist/rsc/route-tree.js.map +1 -0
- package/dist/server/application.d.ts +17 -0
- package/dist/server/application.js +178 -0
- package/dist/server/application.js.map +1 -0
- package/dist/server/flight-html-stream.d.ts +19 -0
- package/dist/server/flight-html-stream.js +193 -0
- package/dist/server/flight-html-stream.js.map +1 -0
- package/dist/server/flight-renderer.d.ts +31 -0
- package/dist/server/flight-renderer.js +47 -0
- package/dist/server/flight-renderer.js.map +1 -0
- package/dist/server/html-renderer.d.ts +28 -0
- package/dist/server/html-renderer.js +82 -0
- package/dist/server/html-renderer.js.map +1 -0
- package/dist/server/request-outcome.d.ts +8 -0
- package/dist/server/request-outcome.js +5 -0
- package/dist/server/request-outcome.js.map +1 -0
- package/dist/server/server-config.d.ts +17 -0
- package/dist/server/server-config.js +18 -0
- package/dist/server/server-config.js.map +1 -0
- package/dist/server/server-fn-outcome.d.ts +13 -0
- package/dist/server/server-fn-outcome.js +24 -0
- package/dist/server/server-fn-outcome.js.map +1 -0
- package/dist/server/server-fn-request.d.ts +24 -0
- package/dist/server/server-fn-request.js +160 -0
- package/dist/server/server-fn-request.js.map +1 -0
- package/dist/unsupported.d.ts +0 -0
- package/dist/unsupported.js +5 -0
- package/dist/unsupported.js.map +1 -0
- package/docs/01-getting-started/01_first-application.tsx +26 -0
- package/docs/01-getting-started/20_styling.tsx +6 -0
- package/docs/01-getting-started/index.md +27 -0
- package/docs/01-getting-started/styles.css +1 -0
- package/docs/02-guides/01-server-functions/10_ersc.ts +6 -0
- package/docs/02-guides/01-server-functions/20_follow-author.ts +15 -0
- package/docs/02-guides/01-server-functions/30_follow-author-button.tsx +19 -0
- package/docs/02-guides/01-server-functions/40_application.tsx +30 -0
- package/docs/02-guides/01-server-functions/index.md +19 -0
- package/docs/02-guides/02-services/10_catalog.ts +22 -0
- package/docs/02-guides/02-services/20_application.tsx +44 -0
- package/docs/02-guides/02-services/index.md +17 -0
- package/docs/02-guides/03-routing/10_ersc.ts +6 -0
- package/docs/02-guides/03-routing/10_layouts.tsx +36 -0
- package/docs/02-guides/03-routing/20_pages.tsx +23 -0
- package/docs/02-guides/03-routing/30_routes.tsx +17 -0
- package/docs/02-guides/03-routing/40_application.ts +7 -0
- package/docs/02-guides/03-routing/index.md +22 -0
- package/docs/02-guides/04-middleware/10_auth.ts +27 -0
- package/docs/02-guides/04-middleware/20_account-page.tsx +13 -0
- package/docs/02-guides/04-middleware/30_update-profile.ts +16 -0
- package/docs/02-guides/04-middleware/40_application.tsx +20 -0
- package/docs/02-guides/04-middleware/index.md +25 -0
- package/docs/02-guides/05-http/10_application-layer.tsx +60 -0
- package/docs/02-guides/05-http/index.md +23 -0
- package/docs/02-guides/index.md +11 -0
- package/docs/03-advanced/01-request-runtime-and-lifetimes/index.md +13 -0
- package/docs/03-advanced/02-client-navigation/index.md +61 -0
- package/docs/03-advanced/03-server-function-execution-and-refresh/index.md +17 -0
- package/docs/03-advanced/index.md +11 -0
- package/docs/04-api-reference/01-application/index.md +8 -0
- package/docs/04-api-reference/02-page/index.md +12 -0
- package/docs/04-api-reference/03-layout/index.md +4 -0
- package/docs/04-api-reference/04-loading/index.md +4 -0
- package/docs/04-api-reference/05-component/10_component.tsx +18 -0
- package/docs/04-api-reference/05-component/index.md +10 -0
- package/docs/04-api-reference/06-middleware/index.md +33 -0
- package/docs/04-api-reference/07-routes/index.md +20 -0
- package/docs/04-api-reference/08-server-fn/index.md +43 -0
- package/docs/04-api-reference/index.md +17 -0
- package/docs/environment.d.ts +1 -0
- package/docs/index.md +15 -0
- package/logo-dark.svg +6 -0
- package/logo.svg +6 -0
- package/package.json +87 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Effect, Layer, Ref, Semaphore, Stream } from "effect";
|
|
2
|
+
import { RpcClient, RpcSerialization } from "effect/unstable/rpc";
|
|
3
|
+
import { RouteRefresher } from "../client/route-refresh.js";
|
|
4
|
+
import { DevChannelPath, DevRpcs } from "./channel.js";
|
|
5
|
+
import { decideHotUpdate } from "./hmr-update.js";
|
|
6
|
+
import { makeDevPanel } from "./panel.js";
|
|
7
|
+
import { reportBrowserFailures } from "./runtime-failure.js";
|
|
8
|
+
|
|
9
|
+
import * as __rspack_external__effect_platform_browser_BrowserSocket_31178d5b from "@effect/platform-browser/BrowserSocket";
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
const socketProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
27
|
+
const socketUrl = `${socketProtocol}//${location.host}${DevChannelPath}`;
|
|
28
|
+
const DevRpcProtocolLayer = RpcClient.layerProtocolSocket({
|
|
29
|
+
retryTransientErrors: true
|
|
30
|
+
}).pipe(Layer.provide(__rspack_external__effect_platform_browser_BrowserSocket_31178d5b.layerWebSocket(socketUrl)), Layer.provide(RpcSerialization.layerJson));
|
|
31
|
+
const recordUpdate = (pending, message)=>({
|
|
32
|
+
acknowledgedClientHash: pending.acknowledgedClientHash,
|
|
33
|
+
clientHash: message.clientHash,
|
|
34
|
+
rscRefresh: pending.rscRefresh === 'Pending' || message._tag === 'RscUpdate' ? 'Pending' : 'Current'
|
|
35
|
+
});
|
|
36
|
+
const settlePendingUpdate = Effect.fnUntraced(function*(pendingUpdate) {
|
|
37
|
+
const reconcile = Effect.gen(function*() {
|
|
38
|
+
const pending = yield* Ref.get(pendingUpdate);
|
|
39
|
+
if (pending.acknowledgedClientHash !== pending.clientHash) {
|
|
40
|
+
const previousHash = import.meta.rspackHash;
|
|
41
|
+
const check = yield* Effect.tryPromise(()=>import.meta.webpackHot.check(true)).pipe(Effect.match({
|
|
42
|
+
onFailure: ()=>({
|
|
43
|
+
_tag: 'Failed'
|
|
44
|
+
}),
|
|
45
|
+
onSuccess: (updatedModules)=>({
|
|
46
|
+
_tag: 'Completed',
|
|
47
|
+
currentHash: import.meta.rspackHash,
|
|
48
|
+
previousHash,
|
|
49
|
+
updatedModules
|
|
50
|
+
})
|
|
51
|
+
}));
|
|
52
|
+
const decision = decideHotUpdate(pending, check);
|
|
53
|
+
if (decision._tag === 'Reload') {
|
|
54
|
+
yield* Effect.sync(()=>location.reload());
|
|
55
|
+
return 'Reloading';
|
|
56
|
+
}
|
|
57
|
+
yield* Ref.update(pendingUpdate, (current)=>({
|
|
58
|
+
...current,
|
|
59
|
+
acknowledgedClientHash: decision.acknowledgedClientHash
|
|
60
|
+
}));
|
|
61
|
+
return 'Retry';
|
|
62
|
+
}
|
|
63
|
+
return yield* Ref.modify(pendingUpdate, (current)=>{
|
|
64
|
+
if (current.acknowledgedClientHash !== current.clientHash) {
|
|
65
|
+
return [
|
|
66
|
+
'Retry',
|
|
67
|
+
current
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
if (current.rscRefresh === 'Current') {
|
|
71
|
+
return [
|
|
72
|
+
'Current',
|
|
73
|
+
current
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
return [
|
|
77
|
+
'Refresh',
|
|
78
|
+
{
|
|
79
|
+
...current,
|
|
80
|
+
rscRefresh: 'Current'
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
return yield* reconcile.pipe(Effect.repeat({
|
|
86
|
+
while: (action)=>action === 'Retry'
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
const startDevClient = Effect.gen(function*() {
|
|
90
|
+
const routeRefresher = yield* RouteRefresher;
|
|
91
|
+
const panel = yield* makeDevPanel;
|
|
92
|
+
const pendingUpdate = yield* Ref.make({
|
|
93
|
+
acknowledgedClientHash: import.meta.rspackHash,
|
|
94
|
+
clientHash: import.meta.rspackHash,
|
|
95
|
+
rscRefresh: 'Current'
|
|
96
|
+
});
|
|
97
|
+
const updateLock = yield* Semaphore.make(1);
|
|
98
|
+
const handleHotUpdate = Effect.fnUntraced(function*(message) {
|
|
99
|
+
yield* Ref.update(pendingUpdate, (pending)=>recordUpdate(pending, message));
|
|
100
|
+
const action = yield* updateLock.withPermit(settlePendingUpdate(pendingUpdate));
|
|
101
|
+
if (action === 'Reloading') {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (action === 'Refresh') {
|
|
105
|
+
yield* routeRefresher.refreshCurrentRoute('hmr-refresh');
|
|
106
|
+
}
|
|
107
|
+
yield* panel.dispatch({
|
|
108
|
+
_tag: 'Reconciled'
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
yield* reportBrowserFailures((failure)=>panel.dispatch({
|
|
112
|
+
_tag: 'RuntimeFailed',
|
|
113
|
+
failure
|
|
114
|
+
})).pipe(Effect.forkScoped);
|
|
115
|
+
const observeUpdates = Effect.gen(function*() {
|
|
116
|
+
const client = yield* RpcClient.make(DevRpcs);
|
|
117
|
+
const handleUpdate = Effect.fnUntraced(function*(phase, message) {
|
|
118
|
+
if (message._tag === 'BuildFailed') {
|
|
119
|
+
yield* panel.dispatch(message);
|
|
120
|
+
} else if (phase === 'Live') {
|
|
121
|
+
yield* handleHotUpdate(message);
|
|
122
|
+
}
|
|
123
|
+
return 'Live';
|
|
124
|
+
});
|
|
125
|
+
yield* client.ObserveDevUpdates().pipe(Stream.runFoldEffect(()=>'Snapshot', handleUpdate), Effect.asVoid);
|
|
126
|
+
});
|
|
127
|
+
yield* observeUpdates.pipe(Effect.provide(DevRpcProtocolLayer));
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
export { startDevClient };
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev/client.js","sources":["../../src/dev/client.ts"],"sourcesContent":["import * as BrowserSocket from '@effect/platform-browser/BrowserSocket';\nimport { Effect, Layer, Ref, Semaphore, Stream } from 'effect';\nimport { RpcClient, RpcSerialization } from 'effect/unstable/rpc';\n\nimport { RouteRefresher } from '../client/route-refresh';\nimport { DevChannelPath, DevRpcs, type DevUpdate } from './channel';\nimport { decideHotUpdate, type HotUpdateCheck, type PendingDevUpdate } from './hmr-update';\nimport { makeDevPanel } from './panel';\nimport { reportBrowserFailures } from './runtime-failure';\n\nconst socketProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\nconst socketUrl = `${socketProtocol}//${location.host}${DevChannelPath}`;\n\nconst DevRpcProtocolLayer = RpcClient.layerProtocolSocket({ retryTransientErrors: true }).pipe(\n Layer.provide(BrowserSocket.layerWebSocket(socketUrl)),\n Layer.provide(RpcSerialization.layerJson),\n);\n\ntype DevHotUpdate = Exclude<DevUpdate, { readonly _tag: 'BuildFailed' }>;\ntype DevUpdatePhase = 'Snapshot' | 'Live';\n\nconst recordUpdate = (pending: PendingDevUpdate, message: DevHotUpdate): PendingDevUpdate => ({\n acknowledgedClientHash: pending.acknowledgedClientHash,\n clientHash: message.clientHash,\n rscRefresh:\n pending.rscRefresh === 'Pending' || message._tag === 'RscUpdate' ? 'Pending' : 'Current',\n});\n\nconst settlePendingUpdate = Effect.fnUntraced(function* (pendingUpdate: Ref.Ref<PendingDevUpdate>) {\n const reconcile = Effect.gen(function* () {\n const pending = yield* Ref.get(pendingUpdate);\n if (pending.acknowledgedClientHash !== pending.clientHash) {\n const previousHash = import.meta.rspackHash;\n const check = yield* Effect.tryPromise(() => import.meta.webpackHot!.check(true)).pipe(\n Effect.match({\n onFailure: (): HotUpdateCheck => ({ _tag: 'Failed' }),\n onSuccess: (updatedModules): HotUpdateCheck => ({\n _tag: 'Completed',\n currentHash: import.meta.rspackHash,\n previousHash,\n updatedModules,\n }),\n }),\n );\n const decision = decideHotUpdate(pending, check);\n if (decision._tag === 'Reload') {\n yield* Effect.sync(() => location.reload());\n return 'Reloading' as const;\n }\n\n yield* Ref.update(pendingUpdate, (current) => ({\n ...current,\n acknowledgedClientHash: decision.acknowledgedClientHash,\n }));\n return 'Retry' as const;\n }\n\n return yield* Ref.modify(pendingUpdate, (current) => {\n if (current.acknowledgedClientHash !== current.clientHash) {\n return ['Retry', current] as const;\n }\n if (current.rscRefresh === 'Current') {\n return ['Current', current] as const;\n }\n return ['Refresh', { ...current, rscRefresh: 'Current' }] as const;\n });\n });\n\n return yield* reconcile.pipe(Effect.repeat({ while: (action) => action === 'Retry' }));\n});\n\nexport const startDevClient = Effect.gen(function* () {\n const routeRefresher = yield* RouteRefresher;\n const panel = yield* makeDevPanel;\n const pendingUpdate = yield* Ref.make<PendingDevUpdate>({\n acknowledgedClientHash: import.meta.rspackHash,\n clientHash: import.meta.rspackHash,\n rscRefresh: 'Current',\n });\n const updateLock = yield* Semaphore.make(1);\n const handleHotUpdate = Effect.fnUntraced(function* (message: DevHotUpdate) {\n yield* Ref.update(pendingUpdate, (pending) => recordUpdate(pending, message));\n const action = yield* updateLock.withPermit(settlePendingUpdate(pendingUpdate));\n if (action === 'Reloading') {\n return;\n }\n if (action === 'Refresh') {\n yield* routeRefresher.refreshCurrentRoute('hmr-refresh');\n }\n yield* panel.dispatch({ _tag: 'Reconciled' });\n });\n yield* reportBrowserFailures((failure) =>\n panel.dispatch({ _tag: 'RuntimeFailed', failure }),\n ).pipe(Effect.forkScoped);\n\n const observeUpdates = Effect.gen(function* () {\n const client = yield* RpcClient.make(DevRpcs);\n const handleUpdate = Effect.fnUntraced(function* (phase: DevUpdatePhase, message: DevUpdate) {\n if (message._tag === 'BuildFailed') {\n yield* panel.dispatch(message);\n } else if (phase === 'Live') {\n yield* handleHotUpdate(message);\n }\n\n return 'Live' as const;\n });\n\n yield* client.ObserveDevUpdates().pipe(\n Stream.runFoldEffect((): DevUpdatePhase => 'Snapshot', handleUpdate),\n Effect.asVoid,\n );\n });\n\n yield* observeUpdates.pipe(Effect.provide(DevRpcProtocolLayer));\n});\n"],"names":["BrowserSocket","Effect","Layer","Ref","Semaphore","Stream","RpcClient","RpcSerialization","RouteRefresher","DevChannelPath","DevRpcs","decideHotUpdate","makeDevPanel","reportBrowserFailures","socketProtocol","location","socketUrl","DevRpcProtocolLayer","recordUpdate","pending","message","settlePendingUpdate","pendingUpdate","reconcile","previousHash","check","updatedModules","decision","current","action","startDevClient","routeRefresher","panel","updateLock","handleHotUpdate","failure","observeUpdates","client","handleUpdate","phase"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type PendingDevUpdate = {
|
|
2
|
+
readonly acknowledgedClientHash: string;
|
|
3
|
+
readonly clientHash: string;
|
|
4
|
+
readonly rscRefresh: 'Current' | 'Pending';
|
|
5
|
+
};
|
|
6
|
+
export type HotUpdateCheck = {
|
|
7
|
+
readonly _tag: 'Failed';
|
|
8
|
+
} | {
|
|
9
|
+
readonly _tag: 'Completed';
|
|
10
|
+
readonly currentHash: string;
|
|
11
|
+
readonly previousHash: string;
|
|
12
|
+
readonly updatedModules: ReadonlyArray<string | number> | null;
|
|
13
|
+
};
|
|
14
|
+
export type HotUpdateDecision = {
|
|
15
|
+
readonly _tag: 'Reload';
|
|
16
|
+
} | {
|
|
17
|
+
readonly _tag: 'Retry';
|
|
18
|
+
readonly acknowledgedClientHash: string;
|
|
19
|
+
};
|
|
20
|
+
export declare const decideHotUpdate: (pending: PendingDevUpdate, check: HotUpdateCheck) => HotUpdateDecision;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const decideHotUpdate = (pending, check)=>{
|
|
2
|
+
if (check._tag === 'Failed') {
|
|
3
|
+
return {
|
|
4
|
+
_tag: 'Reload'
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
if (check.currentHash !== check.previousHash) {
|
|
8
|
+
return {
|
|
9
|
+
_tag: 'Retry',
|
|
10
|
+
acknowledgedClientHash: check.currentHash
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (check.updatedModules !== null && check.updatedModules.length > 0) {
|
|
14
|
+
return {
|
|
15
|
+
_tag: 'Reload'
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return pending.rscRefresh === 'Pending' ? {
|
|
19
|
+
_tag: 'Retry',
|
|
20
|
+
acknowledgedClientHash: pending.clientHash
|
|
21
|
+
} : {
|
|
22
|
+
_tag: 'Reload'
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { decideHotUpdate };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=hmr-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev/hmr-update.js","sources":["../../src/dev/hmr-update.ts"],"sourcesContent":["export type PendingDevUpdate = {\n readonly acknowledgedClientHash: string;\n readonly clientHash: string;\n readonly rscRefresh: 'Current' | 'Pending';\n};\n\nexport type HotUpdateCheck =\n | { readonly _tag: 'Failed' }\n | {\n readonly _tag: 'Completed';\n readonly currentHash: string;\n readonly previousHash: string;\n readonly updatedModules: ReadonlyArray<string | number> | null;\n };\n\nexport type HotUpdateDecision =\n | { readonly _tag: 'Reload' }\n | { readonly _tag: 'Retry'; readonly acknowledgedClientHash: string };\n\nexport const decideHotUpdate = (\n pending: PendingDevUpdate,\n check: HotUpdateCheck,\n): HotUpdateDecision => {\n if (check._tag === 'Failed') {\n return { _tag: 'Reload' };\n }\n if (check.currentHash !== check.previousHash) {\n return { _tag: 'Retry', acknowledgedClientHash: check.currentHash };\n }\n if (check.updatedModules !== null && check.updatedModules.length > 0) {\n return { _tag: 'Reload' };\n }\n return pending.rscRefresh === 'Pending'\n ? { _tag: 'Retry', acknowledgedClientHash: pending.clientHash }\n : { _tag: 'Reload' };\n};\n"],"names":["decideHotUpdate","pending","check"],"mappings":"AAmBO,MAAMA,eAAeA,GAAG,CAC7BC,SACAC;IAEA,IAAIA,MAAM,IAAI,KAAK,UAAU;QAC3B,OAAO;YAAE,MAAM;QAAS;IAC1B;IACA,IAAIA,MAAM,WAAW,KAAKA,MAAM,YAAY,EAAE;QAC5C,OAAO;YAAE,MAAM;YAAS,wBAAwBA,MAAM,WAAW;QAAC;IACpE;IACA,IAAIA,MAAM,cAAc,KAAK,QAAQA,MAAM,cAAc,CAAC,MAAM,GAAG,GAAG;QACpE,OAAO;YAAE,MAAM;QAAS;IAC1B;IACA,OAAOD,QAAQ,UAAU,KAAK,YAC1B;QAAE,MAAM;QAAS,wBAAwBA,QAAQ,UAAU;IAAC,IAC5D;QAAE,MAAM;IAAS;AACvB,EAAE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import type { DevRuntimeFailure } from './runtime-failure.js';
|
|
3
|
+
export type { DevRuntimeFailure } from './runtime-failure.js';
|
|
4
|
+
export declare const DevPanelElementName = "ersc-dev-panel";
|
|
5
|
+
type DevPanelContent = {
|
|
6
|
+
readonly _tag: 'BuildFailed';
|
|
7
|
+
readonly diagnostics: string;
|
|
8
|
+
} | {
|
|
9
|
+
readonly _tag: 'RuntimeFailed';
|
|
10
|
+
readonly failures: ReadonlyArray<DevRuntimeFailure>;
|
|
11
|
+
};
|
|
12
|
+
export type DevPanelState = {
|
|
13
|
+
readonly _tag: 'Inactive';
|
|
14
|
+
} | {
|
|
15
|
+
readonly _tag: 'Visible';
|
|
16
|
+
readonly content: DevPanelContent;
|
|
17
|
+
} | {
|
|
18
|
+
readonly _tag: 'Dismissed';
|
|
19
|
+
readonly content: DevPanelContent;
|
|
20
|
+
};
|
|
21
|
+
export type DevPanelEvent = {
|
|
22
|
+
readonly _tag: 'BuildFailed';
|
|
23
|
+
readonly diagnostics: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly _tag: 'RuntimeFailed';
|
|
26
|
+
readonly failure: DevRuntimeFailure;
|
|
27
|
+
} | {
|
|
28
|
+
readonly _tag: 'Reconciled';
|
|
29
|
+
} | {
|
|
30
|
+
readonly _tag: 'Opened';
|
|
31
|
+
} | {
|
|
32
|
+
readonly _tag: 'Dismissed';
|
|
33
|
+
};
|
|
34
|
+
export declare const InitialDevPanelState: DevPanelState;
|
|
35
|
+
export declare const applyDevPanelEvent: (state: DevPanelState, event: DevPanelEvent) => DevPanelState;
|
|
36
|
+
declare function DevPanelContent({ state }: {
|
|
37
|
+
readonly state: DevPanelState;
|
|
38
|
+
}): import("react").JSX.Element | null;
|
|
39
|
+
export declare const makeDevPanel: Effect.Effect<{
|
|
40
|
+
dispatch: (event: DevPanelEvent) => Effect.Effect<void, never, never>;
|
|
41
|
+
}, never, import("effect/Scope").Scope>;
|