@nbt-dev/components 0.0.5 → 0.0.6
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/dist/{chunk-UPEOXMLZ.js → chunk-VDIHQ2NS.js} +2 -2
- package/dist/{chunk-3ZM6YOA4.js → chunk-WBZS7I6V.js} +25 -1
- package/dist/chunk-WBZS7I6V.js.map +7 -0
- package/dist/{chunk-7B2T5ZNG.js → chunk-ZOGIPYYM.js} +2 -2
- package/dist/core/auth.d.ts +2 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/graph/index.js +2 -2
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/table/index.js +2 -2
- package/package.json +1 -1
- package/src/core/auth.ts +34 -0
- package/src/core/index.ts +1 -0
- package/dist/chunk-3ZM6YOA4.js.map +0 -7
- /package/dist/{chunk-UPEOXMLZ.js.map → chunk-VDIHQ2NS.js.map} +0 -0
- /package/dist/{chunk-7B2T5ZNG.js.map → chunk-ZOGIPYYM.js.map} +0 -0
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
authHeaders,
|
|
4
4
|
useBulkRowCounts,
|
|
5
5
|
useDevToolsConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WBZS7I6V.js";
|
|
7
7
|
|
|
8
8
|
// src/graph/diagram.tsx
|
|
9
9
|
import React from "react";
|
|
@@ -622,4 +622,4 @@ export {
|
|
|
622
622
|
filterEntityGraphModel,
|
|
623
623
|
DiagramView
|
|
624
624
|
};
|
|
625
|
-
//# sourceMappingURL=chunk-
|
|
625
|
+
//# sourceMappingURL=chunk-VDIHQ2NS.js.map
|
|
@@ -72,6 +72,29 @@ async function devToolsSignIn(apiBaseUrl, email, password) {
|
|
|
72
72
|
if (!j.token) throw new Error("Sign-in returned no token");
|
|
73
73
|
setDevToolsToken(j.token);
|
|
74
74
|
}
|
|
75
|
+
async function devToolsSignUp(apiBaseUrl, name, email, password) {
|
|
76
|
+
const r = await fetch(`${apiBaseUrl}/api/auth/user/signup`, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
credentials: "include",
|
|
79
|
+
headers: { "content-type": "application/json" },
|
|
80
|
+
body: JSON.stringify({ name, email, password })
|
|
81
|
+
});
|
|
82
|
+
if (!r.ok) {
|
|
83
|
+
let detail = `HTTP ${r.status}`;
|
|
84
|
+
if (r.status === 409) detail = "That email is already registered";
|
|
85
|
+
else {
|
|
86
|
+
try {
|
|
87
|
+
const j2 = await r.json();
|
|
88
|
+
if (j2?.error) detail = j2.error;
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Sign-up failed: ${detail}`);
|
|
93
|
+
}
|
|
94
|
+
const j = await r.json();
|
|
95
|
+
if (!j.token) throw new Error("Sign-up returned no token");
|
|
96
|
+
setDevToolsToken(j.token);
|
|
97
|
+
}
|
|
75
98
|
function devToolsSignOut() {
|
|
76
99
|
clearDevToolsToken();
|
|
77
100
|
}
|
|
@@ -695,10 +718,11 @@ export {
|
|
|
695
718
|
authHeaders,
|
|
696
719
|
fetchWhoAmI,
|
|
697
720
|
devToolsSignIn,
|
|
721
|
+
devToolsSignUp,
|
|
698
722
|
devToolsSignOut,
|
|
699
723
|
wsAuthProtocols,
|
|
700
724
|
BulkStreamProvider,
|
|
701
725
|
useBulkRowCounts,
|
|
702
726
|
useBulkSubscription
|
|
703
727
|
};
|
|
704
|
-
//# sourceMappingURL=chunk-
|
|
728
|
+
//# sourceMappingURL=chunk-WBZS7I6V.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/config.tsx", "../src/core/auth.ts", "../src/core/use-bulk-stream.ts", "../src/generated/bulk-protocol.ts", "../src/core/data-store.ts", "../src/core/bulk-decoder.ts"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\n\n// Runtime config for the devtools, replacing the inspector's compile-time\n// `NIMBIT_API_ENDPOINT` define. Hosts pass the console's base URL once via\n// <NimbitDevTools apiBaseUrl=\"\u2026\" /> and every fetch/WebSocket derives from it.\n// Empty string => same-origin (the inspector default when served by the console).\nexport type DevToolsConfig = {\n apiBaseUrl: string;\n};\n\nconst DevToolsConfigContext = React.createContext<DevToolsConfig>({\n apiBaseUrl: \"\",\n});\n\nexport const DevToolsConfigProvider: React.FC<{\n apiBaseUrl?: string;\n children: React.ReactNode;\n}> = ({ apiBaseUrl = \"\", children }) => {\n const value = React.useMemo(() => ({ apiBaseUrl }), [apiBaseUrl]);\n return (\n <DevToolsConfigContext.Provider value={value}>\n {children}\n </DevToolsConfigContext.Provider>\n );\n};\n\nexport function useDevToolsConfig(): DevToolsConfig {\n return React.useContext(DevToolsConfigContext);\n}\n\n// Turn an http(s) base into a ws(s) base. Empty => derive from window.location.\nexport function wsBaseFrom(apiBaseUrl: string): string {\n if (!apiBaseUrl) {\n const loc = window.location;\n const proto = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return `${proto}//${loc.host}`;\n }\n return apiBaseUrl.replace(/^http(s?):/, \"ws$1:\");\n}\n", "// Devtools-managed auth. The panel can run embedded in a host page that has no\n// session of its own, so it owns its credential rather than riding the host's\n// `session_token` cookie: a token obtained via `signin` is stored in\n// localStorage and attached as a Bearer header (HTTP) or in the `auth-<b64url>`\n// WebSocket subprotocol. On an unconfigured/dev console the backend leaves\n// devtools open, so a missing token is fine there.\n\nconst TOKEN_KEY = \"nbt_devtools_token\";\n\nexport function getDevToolsToken(): string | null {\n try {\n return localStorage.getItem(TOKEN_KEY);\n } catch {\n return null;\n }\n}\n\nexport function setDevToolsToken(token: string): void {\n try {\n localStorage.setItem(TOKEN_KEY, token);\n } catch {\n /* storage unavailable (private mode / SSR) \u2014 token stays in-memory only */\n }\n}\n\nexport function clearDevToolsToken(): void {\n try {\n localStorage.removeItem(TOKEN_KEY);\n } catch {\n /* ignore */\n }\n}\n\n// Merge the stored Bearer token into a header bag (if present).\nexport function authHeaders(base?: Record<string, string>): Record<string, string> {\n const h: Record<string, string> = { ...(base ?? {}) };\n const t = getDevToolsToken();\n if (t) h[\"Authorization\"] = `Bearer ${t}`;\n return h;\n}\n\nexport type WhoAmI = {\n // node has real auth configured (else devtools is open / local dev)\n configured: boolean;\n // request carries a valid session\n authenticated: boolean;\n // caller may use devtools (open node, or a console operator)\n isAdmin: boolean;\n // at least one user exists; when false the panel offers a first-admin signup\n claimed: boolean;\n};\n\nexport async function fetchWhoAmI(apiBaseUrl: string, signal?: AbortSignal): Promise<WhoAmI> {\n const r = await fetch(`${apiBaseUrl}/_console/whoami`, {\n signal,\n credentials: \"include\",\n headers: authHeaders(),\n });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return (await r.json()) as WhoAmI;\n}\n\n// Sign in against the console's auth cartridge and stash the returned token.\n// Throws with a human-readable message on failure.\nexport async function devToolsSignIn(\n apiBaseUrl: string,\n email: string,\n password: string,\n): Promise<void> {\n const r = await fetch(`${apiBaseUrl}/api/auth/user/signin`, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ email, password }),\n });\n if (!r.ok) {\n throw new Error(r.status === 401 ? \"Invalid email or password\" : `Sign-in failed (HTTP ${r.status})`);\n }\n const j = (await r.json()) as { token?: string };\n if (!j.token) throw new Error(\"Sign-in returned no token\");\n setDevToolsToken(j.token);\n}\n\n// Bootstrap signup \u2014 only meaningful while the instance is unclaimed (the first\n// user becomes console admin). Stashes the returned token like signin.\nexport async function devToolsSignUp(\n apiBaseUrl: string,\n name: string,\n email: string,\n password: string,\n): Promise<void> {\n const r = await fetch(`${apiBaseUrl}/api/auth/user/signup`, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ name, email, password }),\n });\n if (!r.ok) {\n let detail = `HTTP ${r.status}`;\n if (r.status === 409) detail = \"That email is already registered\";\n else {\n try {\n const j = (await r.json()) as { error?: string };\n if (j?.error) detail = j.error;\n } catch {\n /* non-JSON body */\n }\n }\n throw new Error(`Sign-up failed: ${detail}`);\n }\n const j = (await r.json()) as { token?: string };\n if (!j.token) throw new Error(\"Sign-up returned no token\");\n setDevToolsToken(j.token);\n}\n\nexport function devToolsSignOut(): void {\n clearDevToolsToken();\n}\n\nfunction base64UrlEncode(value: string): string {\n if (typeof btoa === \"function\") {\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n }\n throw new Error(\"No base64 encoder available for WS auth\");\n}\n\n// WebSocket subprotocols for an authenticated devtools stream: a leading\n// (non-auth) protocol name the server echoes, plus the `auth-<b64url>` token\n// part it decodes. Without a stored token we offer only the name \u2014 fine on an\n// open/dev console, rejected on a configured one.\nexport function wsAuthProtocols(name: string): string[] {\n const t = getDevToolsToken();\n return t ? [name, `auth-${base64UrlEncode(t)}`] : [name];\n}\n", "import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { BulkDataStore } from \"./data-store\";\nimport {\n getFrameType,\n getFrameSid,\n parseSchema,\n parseDataChunk,\n parseDelta,\n parseError,\n encodeStreamCmd,\n} from \"./bulk-decoder\";\nimport {\n FRAME_SCHEMA,\n FRAME_DATA,\n FRAME_DATA_END,\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n FRAME_DELTA_DEL,\n FRAME_ERROR,\n type ColumnDef,\n} from \"../generated/bulk-protocol\";\nimport type { BulkRegistry } from \"./use-cartridge-info\";\nimport { useDevToolsConfig, wsBaseFrom } from \"./config\";\nimport { getDevToolsToken } from \"./auth\";\n\n// One per-entity table view, demultiplexed off the shared socket by sid. The\n// object is stable across renders and mutated in place; consumers re-render via\n// the listener set (and the cheap per-chunk onRender for virtualization).\ntype View = {\n sid: number;\n cart: string;\n entity: string;\n store: BulkDataStore;\n columns: ColumnDef[];\n totalRows: number;\n loadedRows: number;\n streaming: boolean;\n error: string | null;\n streamRequested: boolean; // sent a `sub` (full stream) at least once\n onRender: (() => void) | null;\n listeners: Set<() => void>;\n};\n\nexport type BulkSubscription = {\n store: BulkDataStore;\n connected: boolean;\n streaming: boolean;\n error: string | null;\n columns: ColumnDef[];\n totalRows: number;\n loadedRows: number;\n search: (q: string) => void;\n clearSearch: () => void;\n setOnRender: (fn: (() => void) | null) => void;\n};\n\ntype Ctx = {\n getView: (cart: string, entity: string) => View;\n ensureStreamed: (view: View) => void;\n search: (view: View, query: string) => void;\n clearSearch: (view: View) => void;\n subscribe: (view: View, cb: () => void) => () => void;\n connected: boolean;\n error: string | null;\n};\n\nconst BulkStreamContext = createContext<Ctx | null>(null);\n\nfunction base64UrlEncode(value: string): string {\n if (typeof btoa === \"function\") {\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n }\n throw new Error(\"No base64 encoder available for bulk WS auth\");\n}\n\nfunction bulkAuthProtocols(token: string): string[] {\n return [\"nimbit-bulk\", `auth-${base64UrlEncode(token)}`];\n}\n\nlet _wsTokenCache: { apiBaseUrl: string; token: string; at: number } | null = null;\nconst WS_TOKEN_TTL_MS = 60_000;\n\n// Resolve the session token to forward in the WS subprotocol. Prefer the\n// devtools-managed token (set by its own sign-in); otherwise fall back to the\n// host page's cookie session via auth.Session.current. Returns null when there\n// is neither \u2014 on an unconfigured/dev console the WS upgrade is open anyway, so\n// we still connect without an auth subprotocol.\nasync function fetchWsToken(\n signal: AbortSignal,\n apiBaseUrl: string,\n): Promise<string | null> {\n const own = getDevToolsToken();\n if (own) return own;\n const now = Date.now();\n if (_wsTokenCache?.apiBaseUrl === apiBaseUrl && now - _wsTokenCache.at < WS_TOKEN_TTL_MS) {\n return _wsTokenCache.token;\n }\n const r = await fetch(`${apiBaseUrl}/api/auth/session/current`, {\n method: \"POST\",\n signal,\n credentials: \"include\",\n headers: { \"content-type\": \"application/json\" },\n });\n if (!r.ok) return null;\n const j = (await r.json()) as { session?: { token?: string } };\n const token = j.session?.token;\n if (!token) return null;\n _wsTokenCache = { apiBaseUrl, token, at: now };\n return token;\n}\n\nfunction invalidateWsToken() {\n _wsTokenCache = null;\n}\n\nfunction notify(view: View) {\n view.listeners.forEach((cb) => cb());\n}\n\ntype Props = { registry: BulkRegistry; children: React.ReactNode };\n\nexport function BulkStreamProvider({ registry, children }: Props): React.ReactElement {\n const { apiBaseUrl } = useDevToolsConfig();\n const wsRef = useRef<WebSocket | null>(null);\n const sendQueueRef = useRef<string[]>([]);\n const sidCounterRef = useRef(1);\n const viewsBySidRef = useRef<Map<number, View>>(new Map());\n const viewsByKeyRef = useRef<Map<string, View>>(new Map());\n const preloadedRef = useRef(false);\n\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendCmd = (cmd: string) => {\n const ws = wsRef.current;\n if (ws && ws.readyState === WebSocket.OPEN) ws.send(cmd);\n else sendQueueRef.current.push(cmd);\n };\n\n const flushQueue = () => {\n const ws = wsRef.current;\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n const q = sendQueueRef.current;\n sendQueueRef.current = [];\n for (const cmd of q) ws.send(cmd);\n };\n\n const getView = (cart: string, entity: string): View => {\n // The server registers entity ops under \"<cart>/<entity-lower>\" (route\n // path casing), so normalize here \u2014 preload and subscription then share one\n // view per entity regardless of the caller's casing.\n const entLower = entity.toLowerCase();\n const key = `${cart}/${entLower}`;\n const existing = viewsByKeyRef.current.get(key);\n if (existing) return existing;\n const sid = sidCounterRef.current++;\n const view: View = {\n sid,\n cart,\n entity: entLower,\n store: new BulkDataStore(),\n columns: [],\n totalRows: 0,\n loadedRows: 0,\n streaming: false,\n error: null,\n streamRequested: false,\n onRender: null,\n listeners: new Set(),\n };\n viewsByKeyRef.current.set(key, view);\n viewsBySidRef.current.set(sid, view);\n return view;\n };\n\n const ensureStreamed = (view: View) => {\n if (view.streamRequested) return;\n view.streamRequested = true;\n sendCmd(encodeStreamCmd(view.sid, view.cart, view.entity));\n };\n\n const handleMessage = (ev: MessageEvent) => {\n const buf = ev.data as ArrayBuffer;\n const sid = getFrameSid(buf);\n const view = viewsBySidRef.current.get(sid);\n if (!view) return;\n const ft = getFrameType(buf);\n const store = view.store;\n switch (ft) {\n case FRAME_SCHEMA: {\n const schema = parseSchema(buf);\n store.applySchema(schema);\n view.columns = schema.columns;\n view.totalRows = schema.totalRows;\n view.loadedRows = 0;\n view.streaming = true;\n notify(view);\n break;\n }\n case FRAME_DATA:\n {\n const rows = parseDataChunk(buf, store.columns);\n store.appendChunk(rows);\n view.loadedRows = store.getRowCount();\n view.onRender?.();\n break;\n }\n case FRAME_DATA_END:\n view.streaming = false;\n notify(view);\n break;\n case FRAME_DELTA_INS:\n case FRAME_DELTA_UPD:\n case FRAME_DELTA_DEL: {\n const delta = parseDelta(buf, store.columns);\n store.applyDelta(delta);\n view.totalRows = store.totalRows;\n view.loadedRows = store.getRowCount();\n view.onRender?.();\n notify(view);\n break;\n }\n case FRAME_ERROR:\n view.error = parseError(buf);\n view.streaming = false;\n notify(view);\n break;\n }\n };\n\n // Open one shared socket for the provider's lifetime.\n useEffect(() => {\n const ac = new AbortController();\n let cancelled = false;\n let opened = false;\n let ws: WebSocket | null = null;\n sendQueueRef.current = [];\n sidCounterRef.current = 1;\n viewsBySidRef.current.clear();\n viewsByKeyRef.current.clear();\n preloadedRef.current = false;\n setConnected(false);\n setError(null);\n\n (async () => {\n let token: string | null = null;\n try {\n token = await fetchWsToken(ac.signal, apiBaseUrl);\n } catch {\n // Token lookup failed; still attempt the connection \u2014 an unconfigured\n // dev console accepts it, a configured one will close it (handled below).\n }\n if (cancelled) return;\n // With a token, authenticate via the subprotocol; without one, connect\n // bare (dev/unconfigured consoles synthesize auth on their side).\n ws = token\n ? new WebSocket(`${wsBaseFrom(apiBaseUrl)}/_ws/bulk`, bulkAuthProtocols(token))\n : new WebSocket(`${wsBaseFrom(apiBaseUrl)}/_ws/bulk`, [\"nimbit-bulk\"]);\n ws.binaryType = \"arraybuffer\";\n wsRef.current = ws;\n ws.onopen = () => {\n if (cancelled || wsRef.current !== ws) return;\n opened = true;\n setConnected(true);\n setError(null);\n flushQueue();\n };\n ws.onmessage = handleMessage;\n ws.onerror = () => {};\n ws.onclose = () => {\n if (cancelled || wsRef.current !== ws) return;\n setConnected(false);\n wsRef.current = null;\n if (!opened) {\n invalidateWsToken();\n setError(\"WebSocket connection closed\");\n }\n };\n })();\n\n return () => {\n cancelled = true;\n ac.abort();\n if (ws) {\n ws.onopen = ws.onmessage = ws.onerror = ws.onclose = null;\n try {\n ws.close();\n } catch {}\n if (wsRef.current === ws) wsRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [apiBaseUrl]);\n\n // The live protocol exposes only sub/unsub. Subscribe every known entity once\n // so schema, row counts, snapshots, and deltas stay available to all tabs.\n useEffect(() => {\n if (!connected) return;\n if (preloadedRef.current) return;\n const keys = Object.keys(registry);\n if (keys.length === 0) return;\n preloadedRef.current = true;\n for (const cart of keys) {\n for (const ent of registry[cart] ?? []) {\n const view = getView(cart, ent.name);\n ensureStreamed(view);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connected, registry]);\n\n const search = (view: View, query: string) => {\n view.store.search(query);\n view.totalRows = view.store.totalRows;\n view.loadedRows = view.store.getRowCount();\n notify(view);\n view.onRender?.();\n };\n\n const clearSearch = (view: View) => {\n view.store.exitSearch();\n view.totalRows = view.store.totalRows;\n view.loadedRows = view.store.getRowCount();\n notify(view);\n view.onRender?.();\n };\n\n const subscribe = (view: View, cb: () => void) => {\n view.listeners.add(cb);\n return () => {\n view.listeners.delete(cb);\n };\n };\n\n const ctx: Ctx = {\n getView,\n ensureStreamed,\n search,\n clearSearch,\n subscribe,\n connected,\n error,\n };\n\n return React.createElement(BulkStreamContext.Provider, { value: ctx }, children);\n}\n\n// Row counts for every entity in the registry, sourced from the SCHEMA preload\n// the provider already runs on connect (FRAME_SCHEMA carries totalRows). No row\n// streaming is triggered \u2014 we subscribe to each view but never ensureStreamed.\n// Keyed by the graph id `cart:Entity` (original casing) for the Diagram tab.\nexport function useBulkRowCounts(registry: BulkRegistry): Record<string, number> {\n const ctx = useContext(BulkStreamContext);\n if (!ctx) throw new Error(\"useBulkRowCounts must be used within BulkStreamProvider\");\n const [, force] = useState(0);\n\n const pairs: Array<{ id: string; view: View }> = [];\n for (const cart of Object.keys(registry)) {\n for (const ent of registry[cart] ?? []) {\n pairs.push({ id: `${cart}:${ent.name}`, view: ctx.getView(cart, ent.name) });\n }\n }\n\n const key = pairs.map((p) => p.id).join(\"|\");\n useEffect(() => {\n const unsubs = pairs.map((p) => ctx.subscribe(p.view, () => force((n) => n + 1)));\n return () => unsubs.forEach((u) => u());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n\n const counts: Record<string, number> = {};\n for (const p of pairs) counts[p.id] = p.view.totalRows;\n return counts;\n}\n\n// Keyed to a single entity. The view (schema + rows + deltas) is shared and\n// cached in the provider, so switching tabs is instant once visited.\nexport function useBulkSubscription(cart: string, entity: string): BulkSubscription {\n const ctx = useContext(BulkStreamContext);\n if (!ctx) throw new Error(\"useBulkSubscription must be used within BulkStreamProvider\");\n\n const view = ctx.getView(cart, entity);\n const [, force] = useState(0);\n\n useEffect(() => {\n const unsub = ctx.subscribe(view, () => force((n) => n + 1));\n ctx.ensureStreamed(view);\n return unsub;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view]);\n\n return {\n store: view.store,\n connected: ctx.connected,\n streaming: view.streaming,\n error: view.error ?? ctx.error,\n columns: view.columns,\n totalRows: view.totalRows,\n loadedRows: view.loadedRows,\n search: (q: string) => ctx.search(view, q),\n clearSearch: () => ctx.clearSearch(view),\n setOnRender: (fn) => {\n view.onRender = fn;\n },\n };\n}\n", "// Wire constants mirrored from modules/cart/ws.jai (CART_WS_* + cart_ws_type_byte).\n\n// Frame types (first byte of each WS binary message).\nexport const FRAME_SCHEMA = 0x01;\nexport const FRAME_DATA = 0x02;\nexport const FRAME_DATA_END = 0x03;\nexport const FRAME_DELTA_INS = 0x04;\nexport const FRAME_DELTA_UPD = 0x05;\nexport const FRAME_DELTA_DEL = 0x06;\nexport const FRAME_ERROR = 0xff;\n\n// Column type bytes (schema frame, per column).\nexport const TYPE_U8 = 0x01;\nexport const TYPE_U16 = 0x02;\nexport const TYPE_U32 = 0x03;\nexport const TYPE_U64 = 0x04;\nexport const TYPE_S8 = 0x05;\nexport const TYPE_S16 = 0x06;\nexport const TYPE_S32 = 0x07;\nexport const TYPE_S64 = 0x08;\nexport const TYPE_BOOL = 0x09;\nexport const TYPE_FLOAT32 = 0x0a;\nexport const TYPE_FLOAT64 = 0x0b;\nexport const TYPE_STRING = 0x0c;\nexport const TYPE_DATETIME = 0x0d;\nexport const TYPE_DOCUMENT = 0x0e;\n\nexport type ColumnDef = {\n name: string;\n type: number;\n fixedSize: number; // 0 for variable-width (string, document)\n};\n\nexport type SchemaFrame = {\n totalRows: number;\n columns: ColumnDef[];\n};\n\nexport type DeltaFrame = {\n op: number;\n rowData?: string[];\n id?: string; // DELETE carries the row id as a len-prefixed string\n};\n\nexport function fixedSizeForType(type: number): number {\n switch (type) {\n case TYPE_U8: return 1;\n case TYPE_U16: return 2;\n case TYPE_U32: return 4;\n case TYPE_U64: return 8;\n case TYPE_S8: return 1;\n case TYPE_S16: return 2;\n case TYPE_S32: return 4;\n case TYPE_S64: return 8;\n case TYPE_BOOL: return 1;\n case TYPE_FLOAT32: return 4;\n case TYPE_FLOAT64: return 8;\n case TYPE_STRING: return 0;\n case TYPE_DATETIME: return 8;\n case TYPE_DOCUMENT: return 0;\n default: return 0;\n }\n}\n", "import {\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n FRAME_DELTA_DEL,\n type ColumnDef,\n type SchemaFrame,\n type DeltaFrame,\n} from \"../generated/bulk-protocol\";\n\nexport class BulkDataStore {\n columns: ColumnDef[] = [];\n rows: string[][] = [];\n totalRows = 0;\n searchActive = false;\n\n private _fullRows: string[][] = [];\n private _fullTotalRows = 0;\n private _idColIndex = -1;\n private _query = \"\";\n\n applySchema(schema: SchemaFrame): void {\n this.columns = schema.columns;\n this.totalRows = schema.totalRows;\n this.rows = [];\n this._fullRows = [];\n this._fullTotalRows = schema.totalRows;\n this.searchActive = false;\n this._query = \"\";\n this._idColIndex = schema.columns.findIndex((c) => c.name === \"id\");\n }\n\n appendChunk(chunk: string[][]): void {\n for (let i = 0; i < chunk.length; i++) {\n const row = chunk[i]!;\n this._fullRows.push(row);\n if (!this.searchActive) this.rows.push(row);\n }\n }\n\n applyDelta(delta: DeltaFrame): void {\n const target = this._fullRows;\n if (delta.op === FRAME_DELTA_INS && delta.rowData) {\n target.push(delta.rowData);\n this._fullTotalRows++;\n this.totalRows++;\n if (!this.searchActive) this.rows = this._fullRows;\n else this._applySearch();\n return;\n }\n if (delta.op === FRAME_DELTA_UPD && delta.rowData) {\n const idx = this._findRowById(target, delta.rowData);\n if (idx >= 0) target[idx] = delta.rowData;\n if (this.searchActive) this._applySearch();\n return;\n }\n if (delta.op === FRAME_DELTA_DEL && delta.id !== undefined) {\n const idStr = String(delta.id);\n const idx = this._findRowByIdStr(target, idStr);\n if (idx >= 0) {\n target.splice(idx, 1);\n this._fullTotalRows--;\n this.totalRows--;\n if (!this.searchActive) this.rows = this._fullRows;\n else this._applySearch();\n }\n return;\n }\n }\n\n search(query: string): void {\n const q = query.trim().toLowerCase();\n if (!q) { this.exitSearch(); return; }\n this.searchActive = true;\n this._query = q;\n this._applySearch();\n }\n\n exitSearch(): void {\n if (!this.searchActive) return;\n this.rows = this._fullRows;\n this.totalRows = this._fullTotalRows;\n this.searchActive = false;\n this._query = \"\";\n }\n\n getRowCount(): number {\n return this.rows.length;\n }\n\n private _findRowById(rows: string[][], rowData: string[]): number {\n if (this._idColIndex < 0) return -1;\n const id = rowData[this._idColIndex];\n for (let i = 0; i < rows.length; i++) {\n if (rows[i]![this._idColIndex] === id) return i;\n }\n return -1;\n }\n\n private _findRowByIdStr(rows: string[][], idStr: string): number {\n if (this._idColIndex < 0) return -1;\n for (let i = 0; i < rows.length; i++) {\n if (rows[i]![this._idColIndex] === idStr) return i;\n }\n return -1;\n }\n\n private _applySearch(): void {\n this.rows = this._fullRows.filter((row) =>\n row.some((value) => value.toLowerCase().includes(this._query)),\n );\n this.totalRows = this.rows.length;\n }\n}\n", "// Wire-format decoders + client\u2192server command encoders for the multiplexed\n// bulk WS protocol. Frame opcodes and column-type bytes live in\n// @/generated/bulk-protocol (kept in sync with modules/cart/ws.jai).\n//\n// Every server\u2192client binary frame is [op:u8][sid:u16 LE][payload]. The sid is\n// the client-chosen subscription id; one socket multiplexes many entities, and\n// the provider routes each frame to the matching view by sid (getFrameSid).\n// Only the parse/encode bodies are hand-maintained here.\n\nimport {\n FRAME_SCHEMA,\n FRAME_DATA,\n FRAME_DELTA_DEL,\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n TYPE_U8,\n TYPE_S8,\n TYPE_BOOL,\n TYPE_U16,\n TYPE_S16,\n TYPE_U32,\n TYPE_S32,\n TYPE_FLOAT32,\n TYPE_U64,\n TYPE_S64,\n TYPE_FLOAT64,\n TYPE_DATETIME,\n TYPE_STRING,\n TYPE_DOCUMENT,\n fixedSizeForType,\n type ColumnDef,\n type SchemaFrame,\n type DeltaFrame,\n} from \"../generated/bulk-protocol\";\n\nconst textDecoder = new TextDecoder();\n\n// Bytes between the op byte and the frame payload: the u16 LE subscription id.\nconst SID_BYTES = 2;\n// Offset of the payload in every server\u2192client frame (op + sid).\nconst HEAD = 1 + SID_BYTES;\n\nfunction epochToDate(epoch: number): Date {\n const abs = Math.abs(epoch);\n if (abs < 10_000_000_000) return new Date(epoch * 1000);\n if (abs < 10_000_000_000_000) return new Date(epoch);\n if (abs < 10_000_000_000_000_000) return new Date(epoch / 1000);\n return new Date(epoch / 1_000_000);\n}\n\nfunction formatCellValue(view: DataView, offset: number, col: ColumnDef): [string, number] {\n switch (col.type) {\n case TYPE_U8: return [String(view.getUint8(offset)), 1];\n case TYPE_S8: return [String(view.getInt8(offset)), 1];\n case TYPE_BOOL: return [view.getUint8(offset) ? \"true\" : \"false\", 1];\n case TYPE_U16: return [String(view.getUint16(offset, true)), 2];\n case TYPE_S16: return [String(view.getInt16(offset, true)), 2];\n case TYPE_U32: return [String(view.getUint32(offset, true)), 4];\n case TYPE_S32: return [String(view.getInt32(offset, true)), 4];\n case TYPE_FLOAT32: return [String(view.getFloat32(offset, true)), 4];\n case TYPE_U64: return [String(view.getBigUint64(offset, true)), 8];\n case TYPE_S64: return [String(view.getBigInt64(offset, true)), 8];\n case TYPE_FLOAT64: return [String(view.getFloat64(offset, true)), 8];\n case TYPE_DATETIME: {\n const epoch = Number(view.getBigInt64(offset, true));\n if (epoch === 0) return [\"\", 8];\n return [epochToDate(epoch).toISOString(), 8];\n }\n case TYPE_STRING:\n case TYPE_DOCUMENT: {\n const len = view.getUint32(offset, true);\n const bytes = new Uint8Array(view.buffer, view.byteOffset + offset + 4, len);\n return [textDecoder.decode(bytes), 4 + len];\n }\n default:\n return [\"\", 0];\n }\n}\n\nexport function getFrameType(buf: ArrayBuffer): number {\n return new DataView(buf).getUint8(0);\n}\n\n// The subscription id this frame belongs to (u16 LE right after the op byte).\nexport function getFrameSid(buf: ArrayBuffer): number {\n return new DataView(buf).getUint16(1, true);\n}\n\nexport function parseSchema(buf: ArrayBuffer): SchemaFrame {\n const view = new DataView(buf);\n let offset = 0;\n const frameType = view.getUint8(offset); offset += 1;\n if (frameType !== FRAME_SCHEMA) {\n throw new Error(`Expected SCHEMA frame (0x01), got 0x${frameType.toString(16)}`);\n }\n offset += SID_BYTES;\n const totalRows = view.getUint32(offset, true); offset += 4;\n const columnCount = view.getUint16(offset, true); offset += 2;\n const columns: ColumnDef[] = [];\n for (let i = 0; i < columnCount; i++) {\n const type = view.getUint8(offset); offset += 1;\n const nameLen = view.getUint16(offset, true); offset += 2;\n const nameBytes = new Uint8Array(buf, offset, nameLen);\n const name = textDecoder.decode(nameBytes);\n offset += nameLen;\n columns.push({ name, type, fixedSize: fixedSizeForType(type) });\n }\n return { totalRows, columns };\n}\n\nexport function parseDataChunk(buf: ArrayBuffer, columns: ColumnDef[]): string[][] {\n const view = new DataView(buf);\n let offset = 0;\n const frameType = view.getUint8(offset); offset += 1;\n if (frameType !== FRAME_DATA) {\n throw new Error(`Expected DATA frame, got 0x${frameType.toString(16)}`);\n }\n offset += SID_BYTES;\n const rowCount = view.getUint16(offset, true); offset += 2;\n const rows: string[][] = [];\n for (let r = 0; r < rowCount; r++) {\n const row: string[] = [];\n for (let c = 0; c < columns.length; c++) {\n const [value, bytesRead] = formatCellValue(view, offset, columns[c]!);\n row.push(value);\n offset += bytesRead;\n }\n rows.push(row);\n }\n return rows;\n}\n\nexport function parseDelta(buf: ArrayBuffer, columns: ColumnDef[]): DeltaFrame {\n const view = new DataView(buf);\n let offset = 0;\n const op = view.getUint8(offset); offset += 1;\n offset += SID_BYTES;\n if (op === FRAME_DELTA_DEL) {\n // [id_len:u16 LE][id_bytes] \u2014 the row id is a string (ULID), not an int.\n const len = view.getUint16(offset, true); offset += 2;\n const bytes = new Uint8Array(buf, offset, len);\n return { op, id: textDecoder.decode(bytes) };\n }\n if (op === FRAME_DELTA_INS || op === FRAME_DELTA_UPD) {\n const rowData: string[] = [];\n for (let c = 0; c < columns.length; c++) {\n const [value, bytesRead] = formatCellValue(view, offset, columns[c]!);\n rowData.push(value);\n offset += bytesRead;\n }\n return { op, rowData };\n }\n throw new Error(`Unknown delta op 0x${op.toString(16)}`);\n}\n\nexport function parseError(buf: ArrayBuffer): string {\n const view = new DataView(buf);\n // [0xFF][sid:u16][msg_len:u16 LE][msg_bytes]\n const len = view.getUint16(HEAD, true);\n const bytes = new Uint8Array(buf, HEAD + 2, len);\n return textDecoder.decode(bytes);\n}\n\n// --- client \u2192 server command encoders ---\n// Each command carries the subscription id; sub/schema also name the target.\n\nexport function encodeStreamCmd(\n sid: number,\n cart: string,\n entity: string,\n opts?: { sort?: string; sort_desc?: boolean; filters?: Record<string, string> },\n): string {\n return JSON.stringify({ cmd: \"sub\", sid, cart, entity, ...opts });\n}\n\nexport function encodeUnsubCmd(sid: number): string {\n return JSON.stringify({ cmd: \"unsub\", sid });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["j", "React", "base64UrlEncode", "React"]
|
|
7
|
+
}
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
TYPE_U8,
|
|
16
16
|
useBulkSubscription,
|
|
17
17
|
useDevToolsConfig
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-WBZS7I6V.js";
|
|
19
19
|
|
|
20
20
|
// src/table/data-table.tsx
|
|
21
21
|
import React2 from "react";
|
|
@@ -464,4 +464,4 @@ export {
|
|
|
464
464
|
value_popover_default,
|
|
465
465
|
data_table_default
|
|
466
466
|
};
|
|
467
|
-
//# sourceMappingURL=chunk-
|
|
467
|
+
//# sourceMappingURL=chunk-ZOGIPYYM.js.map
|
package/dist/core/auth.d.ts
CHANGED
|
@@ -6,8 +6,10 @@ export type WhoAmI = {
|
|
|
6
6
|
configured: boolean;
|
|
7
7
|
authenticated: boolean;
|
|
8
8
|
isAdmin: boolean;
|
|
9
|
+
claimed: boolean;
|
|
9
10
|
};
|
|
10
11
|
export declare function fetchWhoAmI(apiBaseUrl: string, signal?: AbortSignal): Promise<WhoAmI>;
|
|
11
12
|
export declare function devToolsSignIn(apiBaseUrl: string, email: string, password: string): Promise<void>;
|
|
13
|
+
export declare function devToolsSignUp(apiBaseUrl: string, name: string, email: string, password: string): Promise<void>;
|
|
12
14
|
export declare function devToolsSignOut(): void;
|
|
13
15
|
export declare function wsAuthProtocols(name: string): string[];
|
package/dist/core/index.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export { BulkStreamProvider, useBulkSubscription, useBulkRowCounts, } from "./us
|
|
|
5
5
|
export type { BulkSubscription } from "./use-bulk-stream";
|
|
6
6
|
export { useLiveBulkRegistry } from "./use-cartridge-info";
|
|
7
7
|
export type { BulkEntity, BulkRegistry, LiveRegistryState, } from "./use-cartridge-info";
|
|
8
|
-
export { getDevToolsToken, setDevToolsToken, clearDevToolsToken, authHeaders, fetchWhoAmI, devToolsSignIn, devToolsSignOut, wsAuthProtocols, } from "./auth";
|
|
8
|
+
export { getDevToolsToken, setDevToolsToken, clearDevToolsToken, authHeaders, fetchWhoAmI, devToolsSignIn, devToolsSignUp, devToolsSignOut, wsAuthProtocols, } from "./auth";
|
|
9
9
|
export type { WhoAmI } from "./auth";
|
package/dist/graph/index.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
cartsFromContracts,
|
|
7
7
|
entityGraphId,
|
|
8
8
|
filterEntityGraphModel
|
|
9
|
-
} from "../chunk-
|
|
10
|
-
import "../chunk-
|
|
9
|
+
} from "../chunk-VDIHQ2NS.js";
|
|
10
|
+
import "../chunk-WBZS7I6V.js";
|
|
11
11
|
export {
|
|
12
12
|
DiagramView as EntityGraph,
|
|
13
13
|
EntityNode,
|
package/dist/index.js
CHANGED
|
@@ -13,12 +13,12 @@ import {
|
|
|
13
13
|
cartsFromContracts,
|
|
14
14
|
entityGraphId,
|
|
15
15
|
filterEntityGraphModel
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-VDIHQ2NS.js";
|
|
17
17
|
import {
|
|
18
18
|
cn,
|
|
19
19
|
data_table_default,
|
|
20
20
|
value_popover_default
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-ZOGIPYYM.js";
|
|
22
22
|
import {
|
|
23
23
|
BulkStreamProvider,
|
|
24
24
|
DevToolsConfigProvider,
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
clearDevToolsToken,
|
|
27
27
|
devToolsSignIn,
|
|
28
28
|
devToolsSignOut,
|
|
29
|
+
devToolsSignUp,
|
|
29
30
|
fetchWhoAmI,
|
|
30
31
|
getDevToolsToken,
|
|
31
32
|
setDevToolsToken,
|
|
@@ -34,7 +35,7 @@ import {
|
|
|
34
35
|
useDevToolsConfig,
|
|
35
36
|
wsAuthProtocols,
|
|
36
37
|
wsBaseFrom
|
|
37
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-WBZS7I6V.js";
|
|
38
39
|
|
|
39
40
|
// src/core/use-cartridge-info.ts
|
|
40
41
|
import { useEffect, useState } from "react";
|
|
@@ -116,6 +117,7 @@ export {
|
|
|
116
117
|
cn,
|
|
117
118
|
devToolsSignIn,
|
|
118
119
|
devToolsSignOut,
|
|
120
|
+
devToolsSignUp,
|
|
119
121
|
entityGraphId,
|
|
120
122
|
fetchWhoAmI,
|
|
121
123
|
filterEntityGraphModel,
|
package/dist/index.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/core/use-cartridge-info.ts"],
|
|
4
4
|
"sourcesContent": ["import { useEffect, useState } from \"react\";\nimport { useDevToolsConfig } from \"./config\";\nimport { authHeaders } from \"./auth\";\n\n// Live cartridge/entity registry for the Data tab. Instead of the build-time\n// `BULK_REGISTRY` (every cart in the repo, generated by `nbt generate`), we\n// read the daemon's `/_console/contracts` \u2014 which only lists *running*\n// cartridges and carries each entity's `searchFields`. Bulk WS routes are\n// derived live (`/_ws/bulk/<cart>/<entity-lower>`) and fed straight into\n// useBulkStream. So the tab reflects what is actually installed right now.\n\nexport type BulkEntity = {\n name: string;\n route: string;\n searchFields: readonly string[];\n};\nexport type BulkRegistry = Record<string, BulkEntity[]>;\n\ntype Contract = {\n cartridge?: string;\n core?: boolean;\n owns?: Record<string, { searchFields?: string[] }>;\n};\n\nfunction buildRegistry(contracts: Contract[]): { reg: BulkRegistry; core: Set<string> } {\n const reg: BulkRegistry = {};\n const core = new Set<string>();\n for (const c of contracts) {\n const cart = c.cartridge;\n if (!cart || !c.owns) continue;\n const entities: BulkEntity[] = [];\n for (const [name, ent] of Object.entries(c.owns)) {\n const sf = Array.isArray(ent?.searchFields) ? ent.searchFields : [];\n entities.push({\n name,\n route: `/_ws/bulk/${cart}/${name.toLowerCase()}`,\n searchFields: sf,\n });\n }\n if (entities.length > 0) {\n reg[cart] = entities;\n if (c.core) core.add(cart);\n }\n }\n return { reg, core };\n}\n\nexport type LiveRegistryState = {\n registry: BulkRegistry;\n carts: string[];\n // Cartridge slugs flagged `core` by the daemon. The Data tab keeps `auth`\n // visible but tucks the rest of these behind a \"more cartridges\" menu so\n // deployed (user) cartridges are what's shown by default.\n coreCarts: Set<string>;\n loading: boolean;\n error: string | null;\n};\n\nexport function useLiveBulkRegistry(): LiveRegistryState {\n const { apiBaseUrl } = useDevToolsConfig();\n const [registry, setRegistry] = useState<BulkRegistry>({});\n const [coreCarts, setCoreCarts] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const ac = new AbortController();\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const r = await fetch(`${apiBaseUrl}/_console/contracts`, {\n signal: ac.signal,\n credentials: \"include\",\n headers: authHeaders(),\n });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n const data = (await r.json()) as Contract[];\n if (!Array.isArray(data)) throw new Error(\"malformed contracts response\");\n if (cancelled) return;\n const { reg, core } = buildRegistry(data);\n setRegistry(reg);\n setCoreCarts(core);\n } catch (e) {\n if (cancelled || (e as { name?: string }).name === \"AbortError\") return;\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n ac.abort();\n };\n }, [apiBaseUrl]);\n\n const carts = Object.keys(registry).sort();\n return { registry, carts, coreCarts, loading, error };\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAW,gBAAgB;AAwBpC,SAAS,cAAc,WAAiE;AACtF,QAAM,MAAoB,CAAC;AAC3B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,KAAK,WAAW;AACzB,UAAM,OAAO,EAAE;AACf,QAAI,CAAC,QAAQ,CAAC,EAAE,KAAM;AACtB,UAAM,WAAyB,CAAC;AAChC,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,EAAE,IAAI,GAAG;AAChD,YAAM,KAAK,MAAM,QAAQ,KAAK,YAAY,IAAI,IAAI,eAAe,CAAC;AAClE,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,OAAO,aAAa,IAAI,IAAI,KAAK,YAAY,CAAC;AAAA,QAC9C,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,UAAI,IAAI,IAAI;AACZ,UAAI,EAAE,KAAM,MAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,EAAE,KAAK,KAAK;AACrB;AAaO,SAAS,sBAAyC;AACvD,QAAM,EAAE,WAAW,IAAI,kBAAkB;AACzC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAuB,CAAC,CAAC;AACzD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,oBAAI,IAAI,CAAC;AACjE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,YAAU,MAAM;AACd,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,YAAY;AAChB,eAAW,IAAI;AACf,aAAS,IAAI;AACb,KAAC,YAAY;AACX,UAAI;AACF,cAAM,IAAI,MAAM,MAAM,GAAG,UAAU,uBAAuB;AAAA,UACxD,QAAQ,GAAG;AAAA,UACX,aAAa;AAAA,UACb,SAAS,YAAY;AAAA,QACvB,CAAC;AACD,YAAI,CAAC,EAAE,GAAI,OAAM,IAAI,MAAM,QAAQ,EAAE,MAAM,EAAE;AAC7C,cAAM,OAAQ,MAAM,EAAE,KAAK;AAC3B,YAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,OAAM,IAAI,MAAM,8BAA8B;AACxE,YAAI,UAAW;AACf,cAAM,EAAE,KAAK,KAAK,IAAI,cAAc,IAAI;AACxC,oBAAY,GAAG;AACf,qBAAa,IAAI;AAAA,MACnB,SAAS,GAAG;AACV,YAAI,aAAc,EAAwB,SAAS,aAAc;AACjE,iBAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,MACrD,UAAE;AACA,YAAI,CAAC,UAAW,YAAW,KAAK;AAAA,MAClC;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,kBAAY;AACZ,SAAG,MAAM;AAAA,IACX;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,QAAQ,OAAO,KAAK,QAAQ,EAAE,KAAK;AACzC,SAAO,EAAE,UAAU,OAAO,WAAW,SAAS,MAAM;AACtD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/table/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import {
|
|
3
3
|
data_table_default,
|
|
4
4
|
value_popover_default
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-ZOGIPYYM.js";
|
|
6
|
+
import "../chunk-WBZS7I6V.js";
|
|
7
7
|
export {
|
|
8
8
|
data_table_default as DataTable,
|
|
9
9
|
value_popover_default as ValuePopover
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nbt-dev/components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "Reusable React building blocks for NBT-console apps: the CodeMirror NBT editor (+LSP), the entity graph, and the live data table.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/src/core/auth.ts
CHANGED
|
@@ -46,6 +46,8 @@ export type WhoAmI = {
|
|
|
46
46
|
authenticated: boolean;
|
|
47
47
|
// caller may use devtools (open node, or a console operator)
|
|
48
48
|
isAdmin: boolean;
|
|
49
|
+
// at least one user exists; when false the panel offers a first-admin signup
|
|
50
|
+
claimed: boolean;
|
|
49
51
|
};
|
|
50
52
|
|
|
51
53
|
export async function fetchWhoAmI(apiBaseUrl: string, signal?: AbortSignal): Promise<WhoAmI> {
|
|
@@ -79,6 +81,38 @@ export async function devToolsSignIn(
|
|
|
79
81
|
setDevToolsToken(j.token);
|
|
80
82
|
}
|
|
81
83
|
|
|
84
|
+
// Bootstrap signup — only meaningful while the instance is unclaimed (the first
|
|
85
|
+
// user becomes console admin). Stashes the returned token like signin.
|
|
86
|
+
export async function devToolsSignUp(
|
|
87
|
+
apiBaseUrl: string,
|
|
88
|
+
name: string,
|
|
89
|
+
email: string,
|
|
90
|
+
password: string,
|
|
91
|
+
): Promise<void> {
|
|
92
|
+
const r = await fetch(`${apiBaseUrl}/api/auth/user/signup`, {
|
|
93
|
+
method: "POST",
|
|
94
|
+
credentials: "include",
|
|
95
|
+
headers: { "content-type": "application/json" },
|
|
96
|
+
body: JSON.stringify({ name, email, password }),
|
|
97
|
+
});
|
|
98
|
+
if (!r.ok) {
|
|
99
|
+
let detail = `HTTP ${r.status}`;
|
|
100
|
+
if (r.status === 409) detail = "That email is already registered";
|
|
101
|
+
else {
|
|
102
|
+
try {
|
|
103
|
+
const j = (await r.json()) as { error?: string };
|
|
104
|
+
if (j?.error) detail = j.error;
|
|
105
|
+
} catch {
|
|
106
|
+
/* non-JSON body */
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw new Error(`Sign-up failed: ${detail}`);
|
|
110
|
+
}
|
|
111
|
+
const j = (await r.json()) as { token?: string };
|
|
112
|
+
if (!j.token) throw new Error("Sign-up returned no token");
|
|
113
|
+
setDevToolsToken(j.token);
|
|
114
|
+
}
|
|
115
|
+
|
|
82
116
|
export function devToolsSignOut(): void {
|
|
83
117
|
clearDevToolsToken();
|
|
84
118
|
}
|
package/src/core/index.ts
CHANGED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/core/config.tsx", "../src/core/auth.ts", "../src/core/use-bulk-stream.ts", "../src/generated/bulk-protocol.ts", "../src/core/data-store.ts", "../src/core/bulk-decoder.ts"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\n\n// Runtime config for the devtools, replacing the inspector's compile-time\n// `NIMBIT_API_ENDPOINT` define. Hosts pass the console's base URL once via\n// <NimbitDevTools apiBaseUrl=\"\u2026\" /> and every fetch/WebSocket derives from it.\n// Empty string => same-origin (the inspector default when served by the console).\nexport type DevToolsConfig = {\n apiBaseUrl: string;\n};\n\nconst DevToolsConfigContext = React.createContext<DevToolsConfig>({\n apiBaseUrl: \"\",\n});\n\nexport const DevToolsConfigProvider: React.FC<{\n apiBaseUrl?: string;\n children: React.ReactNode;\n}> = ({ apiBaseUrl = \"\", children }) => {\n const value = React.useMemo(() => ({ apiBaseUrl }), [apiBaseUrl]);\n return (\n <DevToolsConfigContext.Provider value={value}>\n {children}\n </DevToolsConfigContext.Provider>\n );\n};\n\nexport function useDevToolsConfig(): DevToolsConfig {\n return React.useContext(DevToolsConfigContext);\n}\n\n// Turn an http(s) base into a ws(s) base. Empty => derive from window.location.\nexport function wsBaseFrom(apiBaseUrl: string): string {\n if (!apiBaseUrl) {\n const loc = window.location;\n const proto = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return `${proto}//${loc.host}`;\n }\n return apiBaseUrl.replace(/^http(s?):/, \"ws$1:\");\n}\n", "// Devtools-managed auth. The panel can run embedded in a host page that has no\n// session of its own, so it owns its credential rather than riding the host's\n// `session_token` cookie: a token obtained via `signin` is stored in\n// localStorage and attached as a Bearer header (HTTP) or in the `auth-<b64url>`\n// WebSocket subprotocol. On an unconfigured/dev console the backend leaves\n// devtools open, so a missing token is fine there.\n\nconst TOKEN_KEY = \"nbt_devtools_token\";\n\nexport function getDevToolsToken(): string | null {\n try {\n return localStorage.getItem(TOKEN_KEY);\n } catch {\n return null;\n }\n}\n\nexport function setDevToolsToken(token: string): void {\n try {\n localStorage.setItem(TOKEN_KEY, token);\n } catch {\n /* storage unavailable (private mode / SSR) \u2014 token stays in-memory only */\n }\n}\n\nexport function clearDevToolsToken(): void {\n try {\n localStorage.removeItem(TOKEN_KEY);\n } catch {\n /* ignore */\n }\n}\n\n// Merge the stored Bearer token into a header bag (if present).\nexport function authHeaders(base?: Record<string, string>): Record<string, string> {\n const h: Record<string, string> = { ...(base ?? {}) };\n const t = getDevToolsToken();\n if (t) h[\"Authorization\"] = `Bearer ${t}`;\n return h;\n}\n\nexport type WhoAmI = {\n // node has real auth configured (else devtools is open / local dev)\n configured: boolean;\n // request carries a valid session\n authenticated: boolean;\n // caller may use devtools (open node, or a console operator)\n isAdmin: boolean;\n};\n\nexport async function fetchWhoAmI(apiBaseUrl: string, signal?: AbortSignal): Promise<WhoAmI> {\n const r = await fetch(`${apiBaseUrl}/_console/whoami`, {\n signal,\n credentials: \"include\",\n headers: authHeaders(),\n });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return (await r.json()) as WhoAmI;\n}\n\n// Sign in against the console's auth cartridge and stash the returned token.\n// Throws with a human-readable message on failure.\nexport async function devToolsSignIn(\n apiBaseUrl: string,\n email: string,\n password: string,\n): Promise<void> {\n const r = await fetch(`${apiBaseUrl}/api/auth/user/signin`, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ email, password }),\n });\n if (!r.ok) {\n throw new Error(r.status === 401 ? \"Invalid email or password\" : `Sign-in failed (HTTP ${r.status})`);\n }\n const j = (await r.json()) as { token?: string };\n if (!j.token) throw new Error(\"Sign-in returned no token\");\n setDevToolsToken(j.token);\n}\n\nexport function devToolsSignOut(): void {\n clearDevToolsToken();\n}\n\nfunction base64UrlEncode(value: string): string {\n if (typeof btoa === \"function\") {\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n }\n throw new Error(\"No base64 encoder available for WS auth\");\n}\n\n// WebSocket subprotocols for an authenticated devtools stream: a leading\n// (non-auth) protocol name the server echoes, plus the `auth-<b64url>` token\n// part it decodes. Without a stored token we offer only the name \u2014 fine on an\n// open/dev console, rejected on a configured one.\nexport function wsAuthProtocols(name: string): string[] {\n const t = getDevToolsToken();\n return t ? [name, `auth-${base64UrlEncode(t)}`] : [name];\n}\n", "import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { BulkDataStore } from \"./data-store\";\nimport {\n getFrameType,\n getFrameSid,\n parseSchema,\n parseDataChunk,\n parseDelta,\n parseError,\n encodeStreamCmd,\n} from \"./bulk-decoder\";\nimport {\n FRAME_SCHEMA,\n FRAME_DATA,\n FRAME_DATA_END,\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n FRAME_DELTA_DEL,\n FRAME_ERROR,\n type ColumnDef,\n} from \"../generated/bulk-protocol\";\nimport type { BulkRegistry } from \"./use-cartridge-info\";\nimport { useDevToolsConfig, wsBaseFrom } from \"./config\";\nimport { getDevToolsToken } from \"./auth\";\n\n// One per-entity table view, demultiplexed off the shared socket by sid. The\n// object is stable across renders and mutated in place; consumers re-render via\n// the listener set (and the cheap per-chunk onRender for virtualization).\ntype View = {\n sid: number;\n cart: string;\n entity: string;\n store: BulkDataStore;\n columns: ColumnDef[];\n totalRows: number;\n loadedRows: number;\n streaming: boolean;\n error: string | null;\n streamRequested: boolean; // sent a `sub` (full stream) at least once\n onRender: (() => void) | null;\n listeners: Set<() => void>;\n};\n\nexport type BulkSubscription = {\n store: BulkDataStore;\n connected: boolean;\n streaming: boolean;\n error: string | null;\n columns: ColumnDef[];\n totalRows: number;\n loadedRows: number;\n search: (q: string) => void;\n clearSearch: () => void;\n setOnRender: (fn: (() => void) | null) => void;\n};\n\ntype Ctx = {\n getView: (cart: string, entity: string) => View;\n ensureStreamed: (view: View) => void;\n search: (view: View, query: string) => void;\n clearSearch: (view: View) => void;\n subscribe: (view: View, cb: () => void) => () => void;\n connected: boolean;\n error: string | null;\n};\n\nconst BulkStreamContext = createContext<Ctx | null>(null);\n\nfunction base64UrlEncode(value: string): string {\n if (typeof btoa === \"function\") {\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n }\n throw new Error(\"No base64 encoder available for bulk WS auth\");\n}\n\nfunction bulkAuthProtocols(token: string): string[] {\n return [\"nimbit-bulk\", `auth-${base64UrlEncode(token)}`];\n}\n\nlet _wsTokenCache: { apiBaseUrl: string; token: string; at: number } | null = null;\nconst WS_TOKEN_TTL_MS = 60_000;\n\n// Resolve the session token to forward in the WS subprotocol. Prefer the\n// devtools-managed token (set by its own sign-in); otherwise fall back to the\n// host page's cookie session via auth.Session.current. Returns null when there\n// is neither \u2014 on an unconfigured/dev console the WS upgrade is open anyway, so\n// we still connect without an auth subprotocol.\nasync function fetchWsToken(\n signal: AbortSignal,\n apiBaseUrl: string,\n): Promise<string | null> {\n const own = getDevToolsToken();\n if (own) return own;\n const now = Date.now();\n if (_wsTokenCache?.apiBaseUrl === apiBaseUrl && now - _wsTokenCache.at < WS_TOKEN_TTL_MS) {\n return _wsTokenCache.token;\n }\n const r = await fetch(`${apiBaseUrl}/api/auth/session/current`, {\n method: \"POST\",\n signal,\n credentials: \"include\",\n headers: { \"content-type\": \"application/json\" },\n });\n if (!r.ok) return null;\n const j = (await r.json()) as { session?: { token?: string } };\n const token = j.session?.token;\n if (!token) return null;\n _wsTokenCache = { apiBaseUrl, token, at: now };\n return token;\n}\n\nfunction invalidateWsToken() {\n _wsTokenCache = null;\n}\n\nfunction notify(view: View) {\n view.listeners.forEach((cb) => cb());\n}\n\ntype Props = { registry: BulkRegistry; children: React.ReactNode };\n\nexport function BulkStreamProvider({ registry, children }: Props): React.ReactElement {\n const { apiBaseUrl } = useDevToolsConfig();\n const wsRef = useRef<WebSocket | null>(null);\n const sendQueueRef = useRef<string[]>([]);\n const sidCounterRef = useRef(1);\n const viewsBySidRef = useRef<Map<number, View>>(new Map());\n const viewsByKeyRef = useRef<Map<string, View>>(new Map());\n const preloadedRef = useRef(false);\n\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendCmd = (cmd: string) => {\n const ws = wsRef.current;\n if (ws && ws.readyState === WebSocket.OPEN) ws.send(cmd);\n else sendQueueRef.current.push(cmd);\n };\n\n const flushQueue = () => {\n const ws = wsRef.current;\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n const q = sendQueueRef.current;\n sendQueueRef.current = [];\n for (const cmd of q) ws.send(cmd);\n };\n\n const getView = (cart: string, entity: string): View => {\n // The server registers entity ops under \"<cart>/<entity-lower>\" (route\n // path casing), so normalize here \u2014 preload and subscription then share one\n // view per entity regardless of the caller's casing.\n const entLower = entity.toLowerCase();\n const key = `${cart}/${entLower}`;\n const existing = viewsByKeyRef.current.get(key);\n if (existing) return existing;\n const sid = sidCounterRef.current++;\n const view: View = {\n sid,\n cart,\n entity: entLower,\n store: new BulkDataStore(),\n columns: [],\n totalRows: 0,\n loadedRows: 0,\n streaming: false,\n error: null,\n streamRequested: false,\n onRender: null,\n listeners: new Set(),\n };\n viewsByKeyRef.current.set(key, view);\n viewsBySidRef.current.set(sid, view);\n return view;\n };\n\n const ensureStreamed = (view: View) => {\n if (view.streamRequested) return;\n view.streamRequested = true;\n sendCmd(encodeStreamCmd(view.sid, view.cart, view.entity));\n };\n\n const handleMessage = (ev: MessageEvent) => {\n const buf = ev.data as ArrayBuffer;\n const sid = getFrameSid(buf);\n const view = viewsBySidRef.current.get(sid);\n if (!view) return;\n const ft = getFrameType(buf);\n const store = view.store;\n switch (ft) {\n case FRAME_SCHEMA: {\n const schema = parseSchema(buf);\n store.applySchema(schema);\n view.columns = schema.columns;\n view.totalRows = schema.totalRows;\n view.loadedRows = 0;\n view.streaming = true;\n notify(view);\n break;\n }\n case FRAME_DATA:\n {\n const rows = parseDataChunk(buf, store.columns);\n store.appendChunk(rows);\n view.loadedRows = store.getRowCount();\n view.onRender?.();\n break;\n }\n case FRAME_DATA_END:\n view.streaming = false;\n notify(view);\n break;\n case FRAME_DELTA_INS:\n case FRAME_DELTA_UPD:\n case FRAME_DELTA_DEL: {\n const delta = parseDelta(buf, store.columns);\n store.applyDelta(delta);\n view.totalRows = store.totalRows;\n view.loadedRows = store.getRowCount();\n view.onRender?.();\n notify(view);\n break;\n }\n case FRAME_ERROR:\n view.error = parseError(buf);\n view.streaming = false;\n notify(view);\n break;\n }\n };\n\n // Open one shared socket for the provider's lifetime.\n useEffect(() => {\n const ac = new AbortController();\n let cancelled = false;\n let opened = false;\n let ws: WebSocket | null = null;\n sendQueueRef.current = [];\n sidCounterRef.current = 1;\n viewsBySidRef.current.clear();\n viewsByKeyRef.current.clear();\n preloadedRef.current = false;\n setConnected(false);\n setError(null);\n\n (async () => {\n let token: string | null = null;\n try {\n token = await fetchWsToken(ac.signal, apiBaseUrl);\n } catch {\n // Token lookup failed; still attempt the connection \u2014 an unconfigured\n // dev console accepts it, a configured one will close it (handled below).\n }\n if (cancelled) return;\n // With a token, authenticate via the subprotocol; without one, connect\n // bare (dev/unconfigured consoles synthesize auth on their side).\n ws = token\n ? new WebSocket(`${wsBaseFrom(apiBaseUrl)}/_ws/bulk`, bulkAuthProtocols(token))\n : new WebSocket(`${wsBaseFrom(apiBaseUrl)}/_ws/bulk`, [\"nimbit-bulk\"]);\n ws.binaryType = \"arraybuffer\";\n wsRef.current = ws;\n ws.onopen = () => {\n if (cancelled || wsRef.current !== ws) return;\n opened = true;\n setConnected(true);\n setError(null);\n flushQueue();\n };\n ws.onmessage = handleMessage;\n ws.onerror = () => {};\n ws.onclose = () => {\n if (cancelled || wsRef.current !== ws) return;\n setConnected(false);\n wsRef.current = null;\n if (!opened) {\n invalidateWsToken();\n setError(\"WebSocket connection closed\");\n }\n };\n })();\n\n return () => {\n cancelled = true;\n ac.abort();\n if (ws) {\n ws.onopen = ws.onmessage = ws.onerror = ws.onclose = null;\n try {\n ws.close();\n } catch {}\n if (wsRef.current === ws) wsRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [apiBaseUrl]);\n\n // The live protocol exposes only sub/unsub. Subscribe every known entity once\n // so schema, row counts, snapshots, and deltas stay available to all tabs.\n useEffect(() => {\n if (!connected) return;\n if (preloadedRef.current) return;\n const keys = Object.keys(registry);\n if (keys.length === 0) return;\n preloadedRef.current = true;\n for (const cart of keys) {\n for (const ent of registry[cart] ?? []) {\n const view = getView(cart, ent.name);\n ensureStreamed(view);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connected, registry]);\n\n const search = (view: View, query: string) => {\n view.store.search(query);\n view.totalRows = view.store.totalRows;\n view.loadedRows = view.store.getRowCount();\n notify(view);\n view.onRender?.();\n };\n\n const clearSearch = (view: View) => {\n view.store.exitSearch();\n view.totalRows = view.store.totalRows;\n view.loadedRows = view.store.getRowCount();\n notify(view);\n view.onRender?.();\n };\n\n const subscribe = (view: View, cb: () => void) => {\n view.listeners.add(cb);\n return () => {\n view.listeners.delete(cb);\n };\n };\n\n const ctx: Ctx = {\n getView,\n ensureStreamed,\n search,\n clearSearch,\n subscribe,\n connected,\n error,\n };\n\n return React.createElement(BulkStreamContext.Provider, { value: ctx }, children);\n}\n\n// Row counts for every entity in the registry, sourced from the SCHEMA preload\n// the provider already runs on connect (FRAME_SCHEMA carries totalRows). No row\n// streaming is triggered \u2014 we subscribe to each view but never ensureStreamed.\n// Keyed by the graph id `cart:Entity` (original casing) for the Diagram tab.\nexport function useBulkRowCounts(registry: BulkRegistry): Record<string, number> {\n const ctx = useContext(BulkStreamContext);\n if (!ctx) throw new Error(\"useBulkRowCounts must be used within BulkStreamProvider\");\n const [, force] = useState(0);\n\n const pairs: Array<{ id: string; view: View }> = [];\n for (const cart of Object.keys(registry)) {\n for (const ent of registry[cart] ?? []) {\n pairs.push({ id: `${cart}:${ent.name}`, view: ctx.getView(cart, ent.name) });\n }\n }\n\n const key = pairs.map((p) => p.id).join(\"|\");\n useEffect(() => {\n const unsubs = pairs.map((p) => ctx.subscribe(p.view, () => force((n) => n + 1)));\n return () => unsubs.forEach((u) => u());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n\n const counts: Record<string, number> = {};\n for (const p of pairs) counts[p.id] = p.view.totalRows;\n return counts;\n}\n\n// Keyed to a single entity. The view (schema + rows + deltas) is shared and\n// cached in the provider, so switching tabs is instant once visited.\nexport function useBulkSubscription(cart: string, entity: string): BulkSubscription {\n const ctx = useContext(BulkStreamContext);\n if (!ctx) throw new Error(\"useBulkSubscription must be used within BulkStreamProvider\");\n\n const view = ctx.getView(cart, entity);\n const [, force] = useState(0);\n\n useEffect(() => {\n const unsub = ctx.subscribe(view, () => force((n) => n + 1));\n ctx.ensureStreamed(view);\n return unsub;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view]);\n\n return {\n store: view.store,\n connected: ctx.connected,\n streaming: view.streaming,\n error: view.error ?? ctx.error,\n columns: view.columns,\n totalRows: view.totalRows,\n loadedRows: view.loadedRows,\n search: (q: string) => ctx.search(view, q),\n clearSearch: () => ctx.clearSearch(view),\n setOnRender: (fn) => {\n view.onRender = fn;\n },\n };\n}\n", "// Wire constants mirrored from modules/cart/ws.jai (CART_WS_* + cart_ws_type_byte).\n\n// Frame types (first byte of each WS binary message).\nexport const FRAME_SCHEMA = 0x01;\nexport const FRAME_DATA = 0x02;\nexport const FRAME_DATA_END = 0x03;\nexport const FRAME_DELTA_INS = 0x04;\nexport const FRAME_DELTA_UPD = 0x05;\nexport const FRAME_DELTA_DEL = 0x06;\nexport const FRAME_ERROR = 0xff;\n\n// Column type bytes (schema frame, per column).\nexport const TYPE_U8 = 0x01;\nexport const TYPE_U16 = 0x02;\nexport const TYPE_U32 = 0x03;\nexport const TYPE_U64 = 0x04;\nexport const TYPE_S8 = 0x05;\nexport const TYPE_S16 = 0x06;\nexport const TYPE_S32 = 0x07;\nexport const TYPE_S64 = 0x08;\nexport const TYPE_BOOL = 0x09;\nexport const TYPE_FLOAT32 = 0x0a;\nexport const TYPE_FLOAT64 = 0x0b;\nexport const TYPE_STRING = 0x0c;\nexport const TYPE_DATETIME = 0x0d;\nexport const TYPE_DOCUMENT = 0x0e;\n\nexport type ColumnDef = {\n name: string;\n type: number;\n fixedSize: number; // 0 for variable-width (string, document)\n};\n\nexport type SchemaFrame = {\n totalRows: number;\n columns: ColumnDef[];\n};\n\nexport type DeltaFrame = {\n op: number;\n rowData?: string[];\n id?: string; // DELETE carries the row id as a len-prefixed string\n};\n\nexport function fixedSizeForType(type: number): number {\n switch (type) {\n case TYPE_U8: return 1;\n case TYPE_U16: return 2;\n case TYPE_U32: return 4;\n case TYPE_U64: return 8;\n case TYPE_S8: return 1;\n case TYPE_S16: return 2;\n case TYPE_S32: return 4;\n case TYPE_S64: return 8;\n case TYPE_BOOL: return 1;\n case TYPE_FLOAT32: return 4;\n case TYPE_FLOAT64: return 8;\n case TYPE_STRING: return 0;\n case TYPE_DATETIME: return 8;\n case TYPE_DOCUMENT: return 0;\n default: return 0;\n }\n}\n", "import {\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n FRAME_DELTA_DEL,\n type ColumnDef,\n type SchemaFrame,\n type DeltaFrame,\n} from \"../generated/bulk-protocol\";\n\nexport class BulkDataStore {\n columns: ColumnDef[] = [];\n rows: string[][] = [];\n totalRows = 0;\n searchActive = false;\n\n private _fullRows: string[][] = [];\n private _fullTotalRows = 0;\n private _idColIndex = -1;\n private _query = \"\";\n\n applySchema(schema: SchemaFrame): void {\n this.columns = schema.columns;\n this.totalRows = schema.totalRows;\n this.rows = [];\n this._fullRows = [];\n this._fullTotalRows = schema.totalRows;\n this.searchActive = false;\n this._query = \"\";\n this._idColIndex = schema.columns.findIndex((c) => c.name === \"id\");\n }\n\n appendChunk(chunk: string[][]): void {\n for (let i = 0; i < chunk.length; i++) {\n const row = chunk[i]!;\n this._fullRows.push(row);\n if (!this.searchActive) this.rows.push(row);\n }\n }\n\n applyDelta(delta: DeltaFrame): void {\n const target = this._fullRows;\n if (delta.op === FRAME_DELTA_INS && delta.rowData) {\n target.push(delta.rowData);\n this._fullTotalRows++;\n this.totalRows++;\n if (!this.searchActive) this.rows = this._fullRows;\n else this._applySearch();\n return;\n }\n if (delta.op === FRAME_DELTA_UPD && delta.rowData) {\n const idx = this._findRowById(target, delta.rowData);\n if (idx >= 0) target[idx] = delta.rowData;\n if (this.searchActive) this._applySearch();\n return;\n }\n if (delta.op === FRAME_DELTA_DEL && delta.id !== undefined) {\n const idStr = String(delta.id);\n const idx = this._findRowByIdStr(target, idStr);\n if (idx >= 0) {\n target.splice(idx, 1);\n this._fullTotalRows--;\n this.totalRows--;\n if (!this.searchActive) this.rows = this._fullRows;\n else this._applySearch();\n }\n return;\n }\n }\n\n search(query: string): void {\n const q = query.trim().toLowerCase();\n if (!q) { this.exitSearch(); return; }\n this.searchActive = true;\n this._query = q;\n this._applySearch();\n }\n\n exitSearch(): void {\n if (!this.searchActive) return;\n this.rows = this._fullRows;\n this.totalRows = this._fullTotalRows;\n this.searchActive = false;\n this._query = \"\";\n }\n\n getRowCount(): number {\n return this.rows.length;\n }\n\n private _findRowById(rows: string[][], rowData: string[]): number {\n if (this._idColIndex < 0) return -1;\n const id = rowData[this._idColIndex];\n for (let i = 0; i < rows.length; i++) {\n if (rows[i]![this._idColIndex] === id) return i;\n }\n return -1;\n }\n\n private _findRowByIdStr(rows: string[][], idStr: string): number {\n if (this._idColIndex < 0) return -1;\n for (let i = 0; i < rows.length; i++) {\n if (rows[i]![this._idColIndex] === idStr) return i;\n }\n return -1;\n }\n\n private _applySearch(): void {\n this.rows = this._fullRows.filter((row) =>\n row.some((value) => value.toLowerCase().includes(this._query)),\n );\n this.totalRows = this.rows.length;\n }\n}\n", "// Wire-format decoders + client\u2192server command encoders for the multiplexed\n// bulk WS protocol. Frame opcodes and column-type bytes live in\n// @/generated/bulk-protocol (kept in sync with modules/cart/ws.jai).\n//\n// Every server\u2192client binary frame is [op:u8][sid:u16 LE][payload]. The sid is\n// the client-chosen subscription id; one socket multiplexes many entities, and\n// the provider routes each frame to the matching view by sid (getFrameSid).\n// Only the parse/encode bodies are hand-maintained here.\n\nimport {\n FRAME_SCHEMA,\n FRAME_DATA,\n FRAME_DELTA_DEL,\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n TYPE_U8,\n TYPE_S8,\n TYPE_BOOL,\n TYPE_U16,\n TYPE_S16,\n TYPE_U32,\n TYPE_S32,\n TYPE_FLOAT32,\n TYPE_U64,\n TYPE_S64,\n TYPE_FLOAT64,\n TYPE_DATETIME,\n TYPE_STRING,\n TYPE_DOCUMENT,\n fixedSizeForType,\n type ColumnDef,\n type SchemaFrame,\n type DeltaFrame,\n} from \"../generated/bulk-protocol\";\n\nconst textDecoder = new TextDecoder();\n\n// Bytes between the op byte and the frame payload: the u16 LE subscription id.\nconst SID_BYTES = 2;\n// Offset of the payload in every server\u2192client frame (op + sid).\nconst HEAD = 1 + SID_BYTES;\n\nfunction epochToDate(epoch: number): Date {\n const abs = Math.abs(epoch);\n if (abs < 10_000_000_000) return new Date(epoch * 1000);\n if (abs < 10_000_000_000_000) return new Date(epoch);\n if (abs < 10_000_000_000_000_000) return new Date(epoch / 1000);\n return new Date(epoch / 1_000_000);\n}\n\nfunction formatCellValue(view: DataView, offset: number, col: ColumnDef): [string, number] {\n switch (col.type) {\n case TYPE_U8: return [String(view.getUint8(offset)), 1];\n case TYPE_S8: return [String(view.getInt8(offset)), 1];\n case TYPE_BOOL: return [view.getUint8(offset) ? \"true\" : \"false\", 1];\n case TYPE_U16: return [String(view.getUint16(offset, true)), 2];\n case TYPE_S16: return [String(view.getInt16(offset, true)), 2];\n case TYPE_U32: return [String(view.getUint32(offset, true)), 4];\n case TYPE_S32: return [String(view.getInt32(offset, true)), 4];\n case TYPE_FLOAT32: return [String(view.getFloat32(offset, true)), 4];\n case TYPE_U64: return [String(view.getBigUint64(offset, true)), 8];\n case TYPE_S64: return [String(view.getBigInt64(offset, true)), 8];\n case TYPE_FLOAT64: return [String(view.getFloat64(offset, true)), 8];\n case TYPE_DATETIME: {\n const epoch = Number(view.getBigInt64(offset, true));\n if (epoch === 0) return [\"\", 8];\n return [epochToDate(epoch).toISOString(), 8];\n }\n case TYPE_STRING:\n case TYPE_DOCUMENT: {\n const len = view.getUint32(offset, true);\n const bytes = new Uint8Array(view.buffer, view.byteOffset + offset + 4, len);\n return [textDecoder.decode(bytes), 4 + len];\n }\n default:\n return [\"\", 0];\n }\n}\n\nexport function getFrameType(buf: ArrayBuffer): number {\n return new DataView(buf).getUint8(0);\n}\n\n// The subscription id this frame belongs to (u16 LE right after the op byte).\nexport function getFrameSid(buf: ArrayBuffer): number {\n return new DataView(buf).getUint16(1, true);\n}\n\nexport function parseSchema(buf: ArrayBuffer): SchemaFrame {\n const view = new DataView(buf);\n let offset = 0;\n const frameType = view.getUint8(offset); offset += 1;\n if (frameType !== FRAME_SCHEMA) {\n throw new Error(`Expected SCHEMA frame (0x01), got 0x${frameType.toString(16)}`);\n }\n offset += SID_BYTES;\n const totalRows = view.getUint32(offset, true); offset += 4;\n const columnCount = view.getUint16(offset, true); offset += 2;\n const columns: ColumnDef[] = [];\n for (let i = 0; i < columnCount; i++) {\n const type = view.getUint8(offset); offset += 1;\n const nameLen = view.getUint16(offset, true); offset += 2;\n const nameBytes = new Uint8Array(buf, offset, nameLen);\n const name = textDecoder.decode(nameBytes);\n offset += nameLen;\n columns.push({ name, type, fixedSize: fixedSizeForType(type) });\n }\n return { totalRows, columns };\n}\n\nexport function parseDataChunk(buf: ArrayBuffer, columns: ColumnDef[]): string[][] {\n const view = new DataView(buf);\n let offset = 0;\n const frameType = view.getUint8(offset); offset += 1;\n if (frameType !== FRAME_DATA) {\n throw new Error(`Expected DATA frame, got 0x${frameType.toString(16)}`);\n }\n offset += SID_BYTES;\n const rowCount = view.getUint16(offset, true); offset += 2;\n const rows: string[][] = [];\n for (let r = 0; r < rowCount; r++) {\n const row: string[] = [];\n for (let c = 0; c < columns.length; c++) {\n const [value, bytesRead] = formatCellValue(view, offset, columns[c]!);\n row.push(value);\n offset += bytesRead;\n }\n rows.push(row);\n }\n return rows;\n}\n\nexport function parseDelta(buf: ArrayBuffer, columns: ColumnDef[]): DeltaFrame {\n const view = new DataView(buf);\n let offset = 0;\n const op = view.getUint8(offset); offset += 1;\n offset += SID_BYTES;\n if (op === FRAME_DELTA_DEL) {\n // [id_len:u16 LE][id_bytes] \u2014 the row id is a string (ULID), not an int.\n const len = view.getUint16(offset, true); offset += 2;\n const bytes = new Uint8Array(buf, offset, len);\n return { op, id: textDecoder.decode(bytes) };\n }\n if (op === FRAME_DELTA_INS || op === FRAME_DELTA_UPD) {\n const rowData: string[] = [];\n for (let c = 0; c < columns.length; c++) {\n const [value, bytesRead] = formatCellValue(view, offset, columns[c]!);\n rowData.push(value);\n offset += bytesRead;\n }\n return { op, rowData };\n }\n throw new Error(`Unknown delta op 0x${op.toString(16)}`);\n}\n\nexport function parseError(buf: ArrayBuffer): string {\n const view = new DataView(buf);\n // [0xFF][sid:u16][msg_len:u16 LE][msg_bytes]\n const len = view.getUint16(HEAD, true);\n const bytes = new Uint8Array(buf, HEAD + 2, len);\n return textDecoder.decode(bytes);\n}\n\n// --- client \u2192 server command encoders ---\n// Each command carries the subscription id; sub/schema also name the target.\n\nexport function encodeStreamCmd(\n sid: number,\n cart: string,\n entity: string,\n opts?: { sort?: string; sort_desc?: boolean; filters?: Record<string, string> },\n): string {\n return JSON.stringify({ cmd: \"sub\", sid, cart, entity, ...opts });\n}\n\nexport function encodeUnsubCmd(sid: number): string {\n return JSON.stringify({ cmd: \"unsub\", sid });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "base64UrlEncode", "React"]
|
|
7
|
-
}
|
|
File without changes
|
|
File without changes
|