@jimpick/fireproof-partykit
Version:
PartyKit gateway for Fireproof
1 lines • 24.6 kB
Source Map (JSON)
{"version":3,"sources":["../../src/partykit/index.ts","../../src/connection-from-store.ts","../../src/partykit/gateway.ts"],"sourcesContent":["import { ConnectFunction, connectionFactory, makeKeyBagUrlExtractable } from \"../connection-from-store.js\";\nimport { bs, Database } from \"@jimpick/fireproof-core\";\nimport { registerPartyKitStoreProtocol } from \"./gateway.js\";\nimport { BuildURI, KeyedResolvOnce, runtimeFn } from \"@adviser/cement\";\n\n// Usage:\n//\n// import { useFireproof } from 'use-fireproof'\n// import { connect } from '@fireproof/partykit'\n//\n// const { db } = useFireproof('test')\n//\n// const cx = connect.partykit(db);\n\n// TODO need to set the keybag url automatically\n\n// if (!process.env.FP_KEYBAG_URL) {\n// process.env.FP_KEYBAG_URL = \"file://./dist/kb-dir-partykit?fs=mem\";\n// }\n\nif (!runtimeFn().isBrowser) {\n const url = BuildURI.from(process.env.FP_KEYBAG_URL || \"file://./dist/kb-dir-partykit\");\n url.setParam(\"extractKey\", \"_deprecated_internal_api\");\n process.env.FP_KEYBAG_URL = url.toString();\n}\n\nregisterPartyKitStoreProtocol();\n\nconst connectionCache = new KeyedResolvOnce<bs.Connection>();\nexport const connect: ConnectFunction = (\n db: Database,\n remoteDbName = \"\",\n url = \"http://localhost:1999?protocol=ws\"\n) => {\n const { sthis, blockstore, name: dbName } = db;\n if (!dbName) {\n throw new Error(\"dbName is required\");\n }\n const urlObj = BuildURI.from(url);\n const existingName = urlObj.getParam(\"name\");\n urlObj.defParam(\"name\", remoteDbName || existingName || dbName);\n urlObj.defParam(\"localName\", dbName);\n urlObj.defParam(\"storekey\", `@${dbName}:data@`);\n const fpUrl = urlObj.toString().replace(\"http://\", \"partykit://\").replace(\"https://\", \"partykit://\");\n return connectionCache.get(fpUrl).once(() => {\n makeKeyBagUrlExtractable(sthis);\n const connection = connectionFactory(sthis, fpUrl);\n connection.connect_X(blockstore);\n return connection;\n });\n};\n","import { BuildURI, CoerceURI, runtimeFn, URI } from \"@adviser/cement\";\nimport { bs, Database, ensureLogger, SuperThis } from \"@jimpick/fireproof-core\";\n\n// export interface StoreOptions {\n// readonly data: bs.DataStore;\n// readonly meta: bs.MetaStore;\n// readonly wal: bs.WALState;\n// }\n\nexport class ConnectionFromStore extends bs.ConnectionBase {\n stores?: {\n readonly data: bs.DataStore;\n readonly meta: bs.MetaStore;\n } = undefined;\n\n // readonly urlData: URI;\n // readonly urlMeta: URI;\n\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis, url: URI) {\n const logger = ensureLogger(sthis, \"ConnectionFromStore\", {\n url: () => url.toString(),\n this: 1,\n log: 1,\n });\n super(url, logger);\n this.sthis = sthis;\n // this.urlData = url;\n // this.urlMeta = url;\n }\n async onConnect(): Promise<void> {\n this.logger.Debug().Msg(\"onConnect-start\");\n const stores = {\n base: this.url,\n // data: this.urlData,\n // meta: this.urlMeta,\n };\n const rName = this.url.getParamResult(\"name\");\n if (rName.isErr()) {\n throw this.logger.Error().Err(rName).Msg(\"missing Parameter\").AsError();\n }\n const storeRuntime = bs.toStoreRuntime({ stores }, this.sthis);\n const loader = {\n name: rName.Ok(),\n ebOpts: {\n logger: this.logger,\n store: { stores },\n storeRuntime,\n },\n sthis: this.sthis,\n } as bs.Loadable;\n\n this.stores = {\n data: await storeRuntime.makeDataStore(loader),\n meta: await storeRuntime.makeMetaStore(loader),\n };\n // await this.stores.data.start();\n // await this.stores.meta.start();\n this.logger.Debug().Msg(\"onConnect-done\");\n return;\n }\n}\n\nexport function connectionFactory(sthis: SuperThis, iurl: CoerceURI): bs.ConnectionBase {\n return new ConnectionFromStore(sthis, URI.from(iurl));\n}\n\nexport function makeKeyBagUrlExtractable(sthis: SuperThis) {\n let base = sthis.env.get(\"FP_KEYBAG_URL\");\n if (!base) {\n if (runtimeFn().isBrowser) {\n base = \"indexdb://fp-keybag\";\n } else {\n base = \"file:///tmp/dist/kb-dir-partykit\";\n }\n }\n const kbUrl = BuildURI.from(base);\n kbUrl.defParam(\"extractKey\", \"_deprecated_internal_api\");\n sthis.env.set(\"FP_KEYBAG_URL\", kbUrl.toString());\n sthis.logger.Debug().Url(kbUrl, \"keyBagUrl\").Msg(\"Make keybag url extractable\");\n}\n\nexport type ConnectFunction = (db: Database, name?: string, url?: string) => bs.Connection;\n","import { PartySocket, PartySocketOptions } from \"partysocket\";\nimport { Result, URI, BuildURI, KeyedResolvOnce, runtimeFn, exception2Result } from \"@adviser/cement\";\nimport { bs, ensureLogger, getStore, Logger, rt, SuperThis } from \"@jimpick/fireproof-core\";\n\nexport class PartyKitGateway implements bs.Gateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly id: string;\n party?: PartySocket;\n url?: URI;\n\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.id = sthis.nextId().str;\n this.logger = ensureLogger(sthis, \"PartyKitGateway\", {\n url: () => this.url?.toString(),\n this: this.id,\n }); //.EnableLevel(Level.DEBUG);\n this.logger.Debug().Msg(\"constructor\");\n }\n\n async buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(\"key\", key).URI());\n }\n\n pso?: PartySocketOptions;\n async start(uri: URI): Promise<Result<URI>> {\n this.logger.Debug().Msg(\"Starting PartyKitGateway with URI: \" + uri.toString());\n\n await this.sthis.start();\n\n this.url = uri;\n const ret = uri.build().defParam(\"version\", \"v0.1-partykit\");\n\n const rName = uri.getParamResult(\"name\");\n if (rName.isErr()) {\n return this.logger.Error().Err(rName).Msg(\"name not found\").ResultError();\n }\n let dbName = rName.Ok();\n if (this.url.hasParam(\"index\")) {\n dbName = dbName + \"-idx\";\n }\n ret.defParam(\"party\", \"fireproof\");\n ret.defParam(\"protocol\", \"wss\");\n // const party = uri.getParam(\"party\") || \"fireproof\";\n // const proto = uri.getParam(\"protocol\") || \"wss\";\n let possibleUndef: {\n protocol: \"wss\" | \"ws\" | undefined;\n protocols?: string[];\n prefix?: string;\n } = { protocol: ret.getParam(\"protocol\") as \"wss\" | \"ws\" };\n\n const protocolsStr = uri.getParam(\"protocols\");\n if (protocolsStr) {\n const ps = protocolsStr\n .split(\",\")\n .map((x) => x.trim())\n .filter((x) => x);\n if (ps.length > 0) {\n possibleUndef = { ...possibleUndef, protocols: ps };\n }\n }\n const prefixStr = uri.getParam(\"prefix\");\n if (prefixStr) {\n possibleUndef = { ...possibleUndef, prefix: prefixStr };\n }\n\n const query: PartySocketOptions[\"query\"] = {};\n\n const partySockOpts: PartySocketOptions = {\n id: this.id,\n host: this.url.host,\n room: dbName,\n party: ret.getParam(\"party\"),\n ...possibleUndef,\n query,\n path: this.url.pathname.replace(/^\\//, \"\"),\n };\n\n if (runtimeFn().isNodeIsh) {\n const { WebSocket } = await import(\"ws\");\n partySockOpts.WebSocket = WebSocket;\n }\n this.pso = partySockOpts;\n\n return Result.Ok(ret.URI());\n }\n\n async ready(): Promise<void> {\n this.logger.Debug().Msg(\"ready\");\n }\n\n async connectPartyKit() {\n const pkKeyThis = pkKey(this.pso);\n return pkSockets.get(pkKeyThis).once(async () => {\n if (!this.pso) {\n throw new Error(\"Party socket options not found\");\n }\n this.party = new PartySocket(this.pso);\n let exposedResolve: (value: boolean) => void;\n const openFn = () => {\n this.logger.Debug().Msg(\"party open\");\n this.party?.addEventListener(\"message\", async (event: MessageEvent<string>) => {\n this.logger.Debug().Msg(`got message: ${event.data}`);\n const mbin = this.sthis.txt.encode(event.data);\n this.notifySubscribers(mbin);\n });\n exposedResolve(true);\n };\n return await new Promise<boolean>((resolve) => {\n exposedResolve = resolve;\n this.party?.addEventListener(\"open\", openFn);\n });\n });\n }\n\n async close(): Promise<bs.VoidResult> {\n await this.ready();\n this.logger.Debug().Msg(\"close\");\n this.party?.close();\n return Result.Ok(undefined);\n }\n\n async put(uri: URI, body: Uint8Array): Promise<Result<void>> {\n await this.ready();\n const { store } = getStore(uri, this.sthis, (...args) => args.join(\"/\"));\n if (store === \"meta\") {\n const bodyRes = await bs.addCryptoKeyToGatewayMetaPayload(uri, this.sthis, body);\n if (bodyRes.isErr()) {\n this.logger.Error().Err(bodyRes.Err()).Msg(\"Error in addCryptoKeyToGatewayMetaPayload\");\n throw bodyRes.Err();\n }\n body = bodyRes.Ok();\n }\n const rkey = uri.getParamResult(\"key\");\n if (rkey.isErr()) return Result.Err(rkey.Err());\n const key = rkey.Ok();\n const uploadUrl = store === \"meta\" ? pkMetaURL(uri, key) : pkCarURL(uri, key);\n return exception2Result(async () => {\n const response = await fetch(uploadUrl.asURL(), { method: \"PUT\", body: body });\n if (response.status === 404) {\n throw this.logger.Error().Url(uploadUrl).Msg(`Failure in uploading ${store}!`).AsError();\n }\n });\n }\n\n private readonly subscriberCallbacks = new Set<(data: Uint8Array) => void>();\n\n private notifySubscribers(data: Uint8Array): void {\n for (const callback of this.subscriberCallbacks) {\n try {\n callback(data);\n } catch (error) {\n this.logger.Error().Err(error).Msg(\"Error in subscriber callback execution\");\n }\n }\n }\n async subscribe(uri: URI, callback: (meta: Uint8Array) => void): Promise<bs.UnsubscribeResult> {\n await this.ready();\n await this.connectPartyKit();\n\n const store = uri.getParam(\"store\");\n if (store !== \"meta\") {\n return Result.Err(new Error(\"store must be meta\"));\n }\n\n this.subscriberCallbacks.add(callback);\n\n return Result.Ok(() => {\n this.subscriberCallbacks.delete(callback);\n });\n }\n\n async get(uri: URI): Promise<bs.GetResult> {\n await this.ready();\n return exception2Result(async () => {\n const { store } = getStore(uri, this.sthis, (...args) => args.join(\"/\"));\n const key = uri.getParam(\"key\");\n if (!key) throw new Error(\"key not found\");\n const downloadUrl = store === \"meta\" ? pkMetaURL(uri, key) : pkCarURL(uri, key);\n const response = await fetch(downloadUrl.toString(), { method: \"GET\" });\n if (response.status === 404) {\n throw new Error(`Failure in downloading ${store}!`);\n }\n const body = new Uint8Array(await response.arrayBuffer());\n if (store === \"meta\") {\n const resKeyInfo = await bs.setCryptoKeyFromGatewayMetaPayload(uri, this.sthis, body);\n if (resKeyInfo.isErr()) {\n this.logger\n .Error()\n .Url(uri)\n .Err(resKeyInfo)\n .Any(\"body\", body)\n .Msg(\"Error in setCryptoKeyFromGatewayMetaPayload\");\n throw resKeyInfo.Err();\n }\n }\n return body;\n });\n }\n\n async delete(uri: URI): Promise<bs.VoidResult> {\n await this.ready();\n return exception2Result(async () => {\n const { store } = getStore(uri, this.sthis, (...args) => args.join(\"/\"));\n const key = uri.getParam(\"key\");\n if (!key) throw new Error(\"key not found\");\n if (store === \"meta\") throw new Error(\"Cannot delete from meta store\");\n const deleteUrl = pkCarURL(uri, key);\n const response = await fetch(deleteUrl.toString(), { method: \"DELETE\" });\n if (response.status === 404) {\n throw new Error(`Failure in deleting ${store}!`);\n }\n });\n }\n\n async destroy(uri: URI): Promise<Result<void>> {\n await this.ready();\n return exception2Result(async () => {\n const deleteUrl = pkBaseURL(uri);\n const response = await fetch(deleteUrl.asURL(), { method: \"DELETE\" });\n if (response.status === 404) {\n throw new Error(\"Failure in deleting data!\");\n }\n return Result.Ok(undefined);\n });\n }\n}\n\nconst pkSockets = new KeyedResolvOnce<PartySocket>();\n\nfunction pkKey(set?: PartySocketOptions): string {\n const ret = JSON.stringify(\n Object.entries(set || {})\n .sort(([a], [b]) => a.localeCompare(b))\n .filter(([k]) => k !== \"id\")\n .map(([k, v]) => ({ [k]: v }))\n );\n return ret;\n}\n// ws://localhost:1999/parties/fireproof/test-public-api?_pk=zp9BXhS6u\n// partykit://localhost:1999/?name=test-public-api&protocol=ws&store=meta\nfunction pkURL(uri: URI, key: string, type: \"car\" | \"meta\"): URI {\n const host = uri.host;\n const name = uri.getParam(\"name\");\n const idx = uri.getParam(\"index\") || \"\";\n const protocol = uri.getParam(\"protocol\") === \"ws\" ? \"http\" : \"https\";\n // TODO extract url from uri\n const path = `/parties/fireproof/${name}${idx}`;\n return BuildURI.from(`${protocol}://${host}${path}`).setParam(type, key).URI();\n}\n\nfunction pkBaseURL(uri: URI): URI {\n const host = uri.host;\n const name = uri.getParam(\"name\");\n const idx = uri.getParam(\"index\") || \"\";\n const protocol = uri.getParam(\"protocol\") === \"ws\" ? \"http\" : \"https\";\n // TODO extract url from uri\n const path = `/parties/fireproof/${name}${idx}`;\n return BuildURI.from(`${protocol}://${host}${path}`).URI();\n}\n\nfunction pkCarURL(uri: URI, key: string): URI {\n return pkURL(uri, key, \"car\");\n}\n\nfunction pkMetaURL(uri: URI, key: string): URI {\n return pkURL(uri, key, \"meta\");\n}\n\nexport class PartyKitTestStore implements bs.TestGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly gateway: bs.Gateway;\n constructor(gw: bs.Gateway, sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = ensureLogger(sthis, \"PartyKitTestStore\");\n this.gateway = gw;\n }\n async get(uri: URI, key: string): Promise<Uint8Array> {\n const url = uri.build().setParam(\"key\", key).URI();\n const dbFile = this.sthis.pathOps.join(rt.getPath(url, this.sthis), rt.getFileName(url, this.sthis));\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await this.gateway.get(url);\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return buffer.Ok();\n }\n}\n\nconst onceRegisterPartyKitStoreProtocol = new KeyedResolvOnce<() => void>();\nexport function registerPartyKitStoreProtocol(protocol = \"partykit:\", overrideBaseURL?: string) {\n return onceRegisterPartyKitStoreProtocol.get(protocol).once(() => {\n URI.protocolHasHostpart(protocol);\n return bs.registerStoreProtocol({\n protocol,\n overrideBaseURL,\n gateway: async (sthis) => {\n return new PartyKitGateway(sthis);\n },\n test: async (sthis: SuperThis) => {\n const gateway = new PartyKitGateway(sthis);\n return new PartyKitTestStore(gateway, sthis);\n },\n });\n });\n}\n"],"mappings":"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","names":["import_cement","import_fireproof_core","import_cement"]}