11import { WorkerRunner } from "@effect/platform" ;
22import { BrowserWorkerRunner } from "@effect/platform-browser" ;
33import { Effect , Layer } from "effect" ;
4- import { LoroDoc } from "loro-crdt" ;
5- import { ApiClient } from "../lib/api-client" ;
6- import { Dexie } from "../lib/dexie" ;
74import { RuntimeClient } from "../lib/runtime-client" ;
5+ import { Sync } from "../lib/services/sync" ;
86import { TempWorkspace } from "../lib/services/temp-workspace" ;
97import { WorkspaceManager } from "../lib/services/workspace-manager" ;
108import { WorkerMessage } from "./schema" ;
119
1210const WorkerLive = WorkerRunner . layerSerialized ( WorkerMessage , {
1311 Bootstrap : ( params ) =>
1412 Effect . gen ( function * ( ) {
15- const { client } = yield * ApiClient ;
16- const { initClient } = yield * Dexie ;
13+ const { push } = yield * Sync ;
1714
1815 const manager = yield * WorkspaceManager ;
1916 const temp = yield * TempWorkspace ;
@@ -22,77 +19,21 @@ const WorkerLive = WorkerRunner.layerSerialized(WorkerMessage, {
2219
2320 const workspace = yield * manager
2421 . getById ( { workspaceId : params . workspaceId } )
25- . pipe (
26- Effect . flatMap ( Effect . fromNullable ) ,
27- Effect . mapError ( ( ) => "Get workspace error" )
28- ) ;
22+ . pipe ( Effect . flatMap ( Effect . fromNullable ) ) ;
2923
30- const clientId = yield * initClient . pipe (
31- Effect . mapError ( ( ) => "Init client error" )
32- ) ;
33-
34- const tempUpdates = yield * temp
35- . getById ( { workspaceId : workspace . workspaceId } )
36- . pipe ( Effect . mapError ( ( ) => "Get temp workspace error" ) ) ;
24+ const tempUpdates = yield * temp . getById ( {
25+ workspaceId : workspace . workspaceId ,
26+ } ) ;
3727
3828 if ( tempUpdates !== undefined ) {
39- const response = yield * Effect . fromNullable ( workspace . token ) . pipe (
40- Effect . flatMap ( ( token ) =>
41- client . syncData
42- . push ( {
43- // headers: { Authorization: `Bearer ${token}` },
44- path : { workspaceId : workspace . workspaceId } ,
45- payload : { clientId, snapshot : tempUpdates . snapshot } ,
46- } )
47- . pipe (
48- Effect . map ( ( response ) => ( { ...response , token } ) ) ,
49- Effect . mapError ( ( ) => "Sync push error" )
50- )
51- ) ,
52- Effect . orElse ( ( ) =>
53- client . syncAuth
54- . generateToken ( {
55- payload : {
56- clientId,
57- snapshot : tempUpdates . snapshot ,
58- workspaceId : params . workspaceId ,
59- } ,
60- } )
61- . pipe (
62- Effect . tap ( ( { token } ) =>
63- manager . setToken ( {
64- workspaceId : workspace . workspaceId ,
65- token,
66- } )
67- ) ,
68- Effect . mapError ( ( ) => "Generate token error" )
69- )
70- )
71- ) ;
72-
73- const doc = new LoroDoc ( ) ;
74- doc . import ( response . snapshot ) ;
75-
76- yield * manager
77- . put ( {
78- workspaceId : response . workspaceId ,
79- snapshot : response . snapshot ,
80- token : response . token ,
81- version : doc . version ( ) . encode ( ) ,
82- } )
83- . pipe ( Effect . mapError ( ( ) => "Put workspace error" ) ) ;
84-
85- yield * temp
86- . clean ( { workspaceId : workspace . workspaceId } )
87- . pipe ( Effect . mapError ( ( ) => "Clean temp workspace error" ) ) ;
88-
29+ yield * push ( { snapshot : tempUpdates . snapshot , workspace } ) ;
8930 yield * Effect . log ( "Sync completed" ) ;
9031 } else {
9132 yield * Effect . log ( "No sync updates" ) ;
9233 }
9334
9435 return true ;
95- } ) ,
36+ } ) . pipe ( Effect . mapError ( ( ) => "Bootstrap error" ) ) ,
9637} ) . pipe ( Layer . provide ( BrowserWorkerRunner . layer ) ) ;
9738
9839RuntimeClient . runFork ( WorkerRunner . launch ( WorkerLive ) ) ;
0 commit comments