···11import {useSignal} from '@preact/signals'
22import {useCallback} from 'preact/hooks'
3344-import {useRealmIdentity} from '#client/realm/context-identity'
54import {useDatabase} from '#client/root/context-database'
65import {useSkypod} from '#client/skypod/context'
66+import {useRealmIdentity} from '#realm/client/context-identity'
7788export const Messenger: preact.FunctionComponent = () => {
99 const {useDbSignal} = useDatabase()
+3-3
src/client/components/peer-list.tsx
···11import {useSignal, useSignalEffect} from '@preact/signals'
2233-import {useRealmConnection} from '#client/realm/context-connection'
44-import {PeerState} from '#client/realm/types'
55-import {IdentID} from '#common/protocol'
33+import {useRealmConnection} from '#realm/client/context-connection'
44+import {PeerState} from '#realm/client/types'
55+import {IdentID} from '#realm/protocol/index'
6677export const PeerList: preact.FunctionComponent = () => {
88 const connection = useRealmConnection()
+5-5
src/client/page-app.tsx
···11-import {RealmConnectionManager} from '#client/realm/cmpnt-connection-manager'
11+import {DatabaseProvider} from '#client/root/context-database'
22+import {SkypodProvider} from '#client/skypod/context'
33+import {RealmConnectionManager} from '#realm/client/cmpnt-connection-manager'
24import {
35 RealmConnectionFallbackProps,
46 RealmConnectionProvider,
55-} from '#client/realm/context-connection'
66-import {RealmIdentityFallbackProps, RealmIdentityProvider} from '#client/realm/context-identity'
77-import {DatabaseProvider} from '#client/root/context-database'
88-import {SkypodProvider} from '#client/skypod/context'
77+} from '#realm/client/context-connection'
88+import {RealmIdentityFallbackProps, RealmIdentityProvider} from '#realm/client/context-identity'
991010import {DebugNuke} from './components/debug-nuke'
1111import {Messenger} from './components/messenger'
···4455import {generateSignableJwt} from '#common/crypto/jwks'
66import {jwtSchema} from '#common/crypto/jwts'
77-import {RealmBrand} from '#common/protocol'
77+import {RealmBrand} from '#realm/protocol/index'
8899import {useRealmConnection} from './context-connection'
1010import {useRealmIdentity} from './context-identity'
···55import {useDatabase} from '#client/root/context-database'
66import {generateSigningJwkPair} from '#common/crypto/jwks'
77import {normalizeProtocolError, ProtocolError} from '#common/errors'
88-import {IdentBrand, IdentID} from '#common/protocol'
99-import {ClockState, ClockStorage, LogicalClock} from '#common/protocol/logical-clock'
88+import {IdentBrand, IdentID} from '#realm/protocol/index'
99+import {ClockState, ClockStorage, LogicalClock} from '#realm/protocol/logical-clock'
10101111import {RealmIdentity} from './service-identity'
1212
···3344import {BlockingQueue} from '#common/async/blocking-queue'
55import {sleep} from '#common/async/sleep'
66-import * as protocol from '#common/protocol'
77-import {IdentID} from '#common/protocol'
88-import {DeviceCaps, DeviceInfo} from '#common/protocol/device'
66+import {DeviceCaps, DeviceInfo} from '#realm/protocol/device'
77+import * as protocol from '#realm/protocol/index'
88+import {IdentID} from '#realm/protocol/index'
991010import {RealmSyncManager} from './service-connection-sync'
1111
···11import {Database, StoredAction} from '#client/root/service-database'
22-import {IdentID} from '#common/protocol'
33-import {LCTimestamp, LogicalClock} from '#common/protocol/logical-clock'
22+import {IdentID} from '#realm/protocol/index'
33+import {LCTimestamp, LogicalClock} from '#realm/protocol/logical-clock'
44import {DeviceScanner} from './service-device'
5566export class RealmSyncManager {
···77import {generateSignableJwt, jwkImport} from '#common/crypto/jwks'
88import {jwtPayload, verifyJwtToken} from '#common/crypto/jwts'
99import {normalizeError, normalizeProtocolError, ProtocolError} from '#common/errors'
1010-import * as protocol from '#common/protocol'
1111-import {IdentID, RealmID} from '#common/protocol'
1212-import {LogicalClock} from '#common/protocol/logical-clock'
1310import {streamSocketJson, takeSocketJson} from '#common/socket'
1111+1212+import {IdentID, RealmID} from '#realm/protocol/brands'
1313+import * as protocol from '#realm/protocol/index'
1414+import {LogicalClock} from '#realm/protocol/logical-clock'
14151516import {Database} from '#client/root/service-database'
1617
···11import {JWK, jwkExport} from '#common/crypto/jwks'
22-import {IdentID} from '#common/protocol'
22+import {IdentID} from '#realm/protocol/index'
3344import {Signable} from './types'
55
···11-import {IdentID, RealmID} from '#common/protocol'
11+import {IdentID, RealmID} from '#realm/protocol/index'
2233/** identity info for connecting to a realm */
44export interface ConnectionIdentity {
+2-2
src/client/root/service-database.ts
···11import Dexie, {Collection, IndexableType, type Table} from 'dexie'
2233import {JWK} from '#common/crypto/jwks'
44-import {IdentID, RealmID} from '#common/protocol'
55-import {LCTimestamp, LogicalClock} from '#common/protocol/logical-clock'
44+import {IdentID, RealmID} from '#realm/protocol/index'
55+import {LCTimestamp, LogicalClock} from '#realm/protocol/logical-clock'
66import {Feed, FeedEntry, Lock} from '#skypod/schema'
7788export interface LocalIdentity {
+4-4
src/client/skypod/context.tsx
···22import {useContext, useEffect, useRef} from 'preact/hooks'
33import {z} from 'zod/v4'
4455-import {IdentID} from '#common/protocol'
55+import {IdentID} from '#realm/protocol/index'
66import {Action, ActionMap, ActionOpts, actionSchema} from '#skypod/actions'
77import {feedSchema} from '#skypod/schema'
8899-import {useRealmConnection} from '#client/realm/context-connection'
1010-import {useRealmIdentity} from '#client/realm/context-identity'
119import {useDatabase} from '#client/root/context-database'
1010+import {useRealmConnection} from '#realm/client/context-connection'
1111+import {useRealmIdentity} from '#realm/client/context-identity'
12121313-import {LogicalClock} from '#common/protocol/logical-clock'
1313+import {LogicalClock} from '#realm/protocol/logical-clock'
1414import FeedFetchWorker from './feed-fetch.worker?worker'
15151616export type MiddlewareFn = (
+2-2
src/client/skypod/feed-fetch.worker.ts
···3344import {Database} from '#client/root/service-database'
55import {normalizeProtocolError} from '#common/errors'
66-import {IdentBrand, IdentID} from '#common/protocol'
77-import {LCTimestamp, LogicalClock} from '#common/protocol/logical-clock'
66+import {IdentBrand, IdentID} from '#realm/protocol/index'
77+import {LCTimestamp, LogicalClock} from '#realm/protocol/logical-clock'
8899const msgStartSchema = z.object({
1010 msg: z.literal('start'),
+1-1
src/cmd/register-ident.ts
···11#!/usr/bin/env node
2233import {generateSignableJwt, generateSigningJwkPair, jwkExport} from '#common/crypto/jwks'
44-import {IdentBrand, RealmBrand} from '#common/protocol'
44+import {IdentBrand, RealmBrand} from '#realm/protocol/index'
5566async function generateRegistrationJWT(realm?: string) {
77 const keypair = await generateSigningJwkPair()
+1-1
src/cmd/server.ts
···22import {fileURLToPath} from 'url'
33import {parseArgs} from 'util'
4455+import {ensureRealmMap} from '#realm/server/state'
56import {buildServer} from '#server/index'
66-import {ensureRealmMap} from '#server/routes-socket/state'
7788const __filename = fileURLToPath(import.meta.url)
99const __dirname = dirname(__filename)
···11+import {z} from 'zod/v4'
22+33+import {ProtocolError} from '#common/errors'
44+55+import {errorMessageSchema} from './schema'
66+77+export * from './brands'
88+export * from './messages'
99+1010+export function makeError(
1111+ error: ProtocolError,
1212+ detail: string,
1313+ seq?: number,
1414+): z.infer<typeof errorMessageSchema> {
1515+ return {
1616+ typ: 'err',
1717+ msg: error.message,
1818+ seq,
1919+ dat: {
2020+ code: error.status,
2121+ detail,
2222+ },
2323+ }
2424+}
+1-1
src/server/index.ts
···3344import {WebSocketServer} from 'ws'
5566+import {socketHandler} from '#realm/server/handler'
67import {apiRouter} from './routes-api/middleware'
78import {notFoundHandler} from './routes-error'
88-import {socketHandler} from './routes-socket/handler'
99import {makeSpaMiddleware, makeStaticMiddleware} from './routes-static'
10101111/**
···44import {z} from 'zod/v4'
5566import {jwkExport, jwkImport, type JWK} from '#common/crypto/jwks'
77-import {IdentBrand, IdentID, RealmBrand, RealmID} from '#common/protocol'
88-import {LCTimestamp, LogicalClock} from '#common/protocol/logical-clock'
99-import {actionMessageSchema} from '#common/protocol/schema'
107import {StrictMap} from '#common/strict-map'
88+import {IdentBrand, IdentID, RealmBrand, RealmID} from '#realm/protocol/index'
99+import {LCTimestamp, LogicalClock} from '#realm/protocol/logical-clock'
1010+import {actionMessageSchema} from '#realm/protocol/schema'
11111212export type IncomingAction = z.infer<typeof actionMessageSchema>
1313export type StoredAction = z.infer<typeof storedActionSchema>
···3344import {jwkExport} from '#common/crypto/jwks'
55import {normalizeProtocolError, ProtocolError} from '#common/errors'
66-import * as protocol from '#common/protocol'
77-import {actionMessageSchema} from '#common/protocol/schema'
66+import {parseJson} from '#common/protocol'
87import {streamSocket} from '#common/socket'
981010-import * as realm from '#server/routes-socket/state'
99+import * as protocol from '#realm/protocol/index'
1010+import {actionMessageSchema} from '#realm/protocol/schema'
1111+1212+import * as realm from '#realm/server/state'
11131214// what can the server handle?
1315const incomingMessageSchema = z.union([
···3032 realmBroadcast(auth, await buildRtcPeerJoined(auth))
31333234 try {
3333- const incomingParser = protocol.parseJson.pipe(incomingMessageSchema)
3535+ const incomingParser = parseJson.pipe(incomingMessageSchema)
3436 for await (const msg of streamSocket(ws, {signal})) {
3537 try {
3638 const data = await incomingParser.parseAsync(msg)
···11import WebSocket from 'isomorphic-ws'
2233-import {IdentID, RealmID} from '#common/protocol'
44-import {DeviceCaps, DeviceInfo} from '#common/protocol/device'
53import {StrictMap} from '#common/strict-map'
44+import {DeviceCaps, DeviceInfo} from '#realm/protocol/device'
55+import {IdentID, RealmID} from '#realm/protocol/index'
6677-import {RealmStorage} from '#server/realm-storage'
77+import {RealmStorage} from '#realm/realm-storage'
8899/** An authenticated identity; only handed out in response to successful authentication. */
1010export interface AuthenticatedIdentity {
+1-1
src/skypod/actions-feed.ts
···11-import {makeActionSchema} from '#common/protocol/schema'
11+import {makeActionSchema} from '#realm/protocol/schema'
22import {z} from 'zod/v4'
3344import {feedSchema, lockSchema} from './schema'
+1-1
src/skypod/actions-feedentry.ts
···11-import {makeActionSchema} from '#common/protocol/schema'
11+import {makeActionSchema} from '#realm/protocol/schema'
22import {z} from 'zod/v4'
3344export const patchActionSchema = makeActionSchema(
+2-2
src/skypod/actions.ts
···11-import {LCTimestamp} from '#common/protocol/logical-clock'
22-import {actionOptionsSchema} from '#common/protocol/schema'
11+import {LCTimestamp} from '#realm/protocol/logical-clock'
22+import {actionOptionsSchema} from '#realm/protocol/schema'
33import {z} from 'zod/v4'
4455import {feedActionSchemas} from './actions-feed'
+2-2
src/skypod/schema.ts
···11-import {IdentBrand} from '#common/protocol/brands'
22-import {LogicalClock} from '#common/protocol/logical-clock'
11+import {IdentBrand} from '#realm/protocol/brands'
22+import {LogicalClock} from '#realm/protocol/logical-clock'
33import {z} from 'zod/v4'
4455// lock schema for distributed work coordination