| 20 | ]) |
| 21 | |
| 22 | export const createDirSyncContext = ( |
| 23 | directory: string, |
| 24 | serverSync: ReturnType<typeof createServerSyncContextInner>, |
| 25 | serverSDK: ReturnType<typeof createServerSdkContext>, |
| 26 | ) => { |
| 27 | const client = serverSDK.createClient({ directory, throwOnError: true }) |
| 28 | const current = createMemo(() => serverSync.child(directory, { mcp: true })) |
| 29 | const absolute = (path: string) => (current()[0].path.directory + "/" + path).replace("//", "/") |
| 30 | const data = new Proxy({} as State, { |
| 31 | get(_, property: keyof State) { |
| 32 | if (property === "session_working") return serverSync.session.data.session_working.bind(serverSync.session.data) |
| 33 | if (sessionFields.has(property)) return serverSync.session.data[property as keyof typeof serverSync.session.data] |
| 34 | return current()[0][property] |
| 35 | }, |
| 36 | }) |
| 37 | const set = ((...input: unknown[]) => { |
| 38 | if (typeof input[0] === "string" && sessionFields.has(input[0])) { |
| 39 | return (serverSync.session.set as (...args: unknown[]) => unknown)(...input) |
| 40 | } |
| 41 | const result = (current()[1] as (...args: unknown[]) => unknown)(...input) |
| 42 | if (input[0] === "session") current()[0].session.forEach(serverSync.session.remember) |
| 43 | return result |
| 44 | }) as SetStoreFunction<State> |
| 45 | |
| 46 | const index = (sessionID: string) => { |
| 47 | const session = serverSync.session.get(sessionID) |
| 48 | if (!session || session.directory !== directory) return |
| 49 | const [store, setStore] = current() |
| 50 | const result = Binary.search(store.session, session.id, (item) => item.id) |
| 51 | if (result.found) { |
| 52 | setStore("session", result.index, reconcile(session)) |
| 53 | return |
| 54 | } |
| 55 | setStore( |
| 56 | "session", |
| 57 | produce((draft) => void draft.splice(result.index, 0, session)), |
| 58 | ) |
| 59 | } |
| 60 | |
| 61 | return { |
| 62 | data, |
| 63 | set, |
| 64 | get status() { |
| 65 | return current()[0].status |
| 66 | }, |
| 67 | get ready() { |
| 68 | return current()[0].status !== "loading" |
| 69 | }, |
| 70 | get project() { |
| 71 | const store = current()[0] |
| 72 | const match = Binary.search(serverSync.data.project, store.project, (project) => project.id) |
| 73 | if (match.found) return serverSync.data.project[match.index] |
| 74 | }, |
| 75 | session: { |
| 76 | remember(session: Session) { |
| 77 | serverSync.session.remember(session) |
| 78 | index(session.id) |
| 79 | }, |