UNPKG

@jimpick/fireproof-netlify

Version:

PartyKit gateway for Netlify

1 lines 21.3 kB
{"version":3,"sources":["../../src/netlify/index.ts","../../src/connection-from-store.ts","../../src/netlify/gateway.ts"],"sourcesContent":["import { ConnectFunction, connectionFactory, makeKeyBagUrlExtractable } from \"../connection-from-store.js\";\nimport { bs, Database } from \"@jimpick/fireproof-core\";\nimport { registerNetlifyStoreProtocol } 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/netlify'\n//\n// const { db } = useFireproof('test')\n//\n// const url = URI.from(\"netlify://localhost:8888\").build();\n//\n// const cx = connect.netlify(db, url);\n\nif (!runtimeFn().isBrowser) {\n const url = BuildURI.from(process.env.FP_KEYBAG_URL || \"file://./dist/kb-dir-netlify\");\n url.setParam(\"extractKey\", \"_deprecated_internal_api\");\n process.env.FP_KEYBAG_URL = url.toString();\n}\n\nregisterNetlifyStoreProtocol();\n\nconst connectionCache = new KeyedResolvOnce<bs.Connection>();\nexport const connect: ConnectFunction = (\n db: Database,\n remoteDbName = \"\",\n url = \"netlify://localhost:8888?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 return connectionCache.get(urlObj.toString()).once(() => {\n makeKeyBagUrlExtractable(sthis);\n const connection = connectionFactory(sthis, urlObj);\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 { KeyedResolvOnce, Result, URI, BuildURI, exception2Result } from \"@adviser/cement\";\nimport { bs, getStore, Logger, NotFoundError, SuperThis, ensureSuperLog } from \"@jimpick/fireproof-core\";\n\nexport class NetlifyGateway implements bs.Gateway {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n\n constructor(sthis: SuperThis) {\n this.sthis = ensureSuperLog(sthis, \"NetlifyGateway\");\n this.logger = this.sthis.logger;\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 async destroy(url: URI): Promise<Result<void>> {\n const { store } = getStore(url, this.sthis, (...args) => args.join(\"/\"));\n\n if (store !== \"meta\") {\n // why are the other store types not supported?\n return Result.Ok(undefined);\n // return Result.Err(new Error(\"Store is not meta\"));\n }\n const rName = url.getParamResult(\"name\");\n if (rName.isErr()) {\n return Result.Err(rName.Err());\n }\n let name = rName.Ok();\n const index = url.getParam(\"index\");\n if (index) {\n name += `-${index}`;\n }\n name += \".fp\";\n const remoteBaseUrl = url.getParam(\"remoteBaseUrl\");\n if (!remoteBaseUrl) {\n return Result.Err(new Error(\"Remote base URL not found in the URI\"));\n }\n const fetchUrl = BuildURI.from(remoteBaseUrl).setParam(\"meta\", name).URI();\n\n const response = await fetch(fetchUrl.asURL(), { method: \"DELETE\" });\n if (!response.ok) {\n return this.logger\n .Error()\n .Str(\"status\", response.statusText)\n .Msg(\"Failed to destroy meta database\")\n .ResultError();\n }\n return Result.Ok(undefined);\n }\n\n async start(uri: URI): Promise<Result<URI>> {\n // Convert netlify: to https: or http: based on the environment\n // the url should contain a parameter which describe if http or https is to use\n // the other parameters should also configurable\n const protocol = uri.host.startsWith(\"localhost\") ? \"http\" : \"https\";\n const host = uri.host;\n const path = \"/fireproof\";\n const urlString = `${protocol}://${host}${path}`;\n const baseUrl = BuildURI.from(urlString).URI();\n const ret = uri.build().defParam(\"version\", \"v0.1-netlify\").defParam(\"remoteBaseUrl\", baseUrl.toString()).URI();\n return Result.Ok(ret);\n }\n\n async close(): Promise<bs.VoidResult> {\n return Result.Ok(undefined);\n }\n\n async put(url: URI, body: Uint8Array): Promise<bs.VoidResult> {\n const { store } = getStore(url, this.sthis, (...args) => args.join(\"/\"));\n\n const rParams = url.getParamsResult(\"key\", \"name\");\n if (rParams.isErr()) {\n return this.logger.Error().Url(url).Err(rParams).Msg(\"Put Error\").ResultError();\n }\n const { key } = rParams.Ok();\n let { name } = rParams.Ok();\n const index = url.getParam(\"index\");\n if (index) {\n name += `-${index}`;\n }\n name += \".fp\";\n const remoteBaseUrl = url.getParam(\"remoteBaseUrl\");\n if (!remoteBaseUrl) {\n return Result.Err(new Error(\"Remote base URL not found in the URI\"));\n }\n const fetchUrl = BuildURI.from(remoteBaseUrl);\n switch (store) {\n case \"meta\":\n fetchUrl.setParam(\"meta\", name);\n break;\n default:\n fetchUrl.setParam(\"car\", key);\n break;\n }\n if (store === \"meta\") {\n const bodyRes = await bs.addCryptoKeyToGatewayMetaPayload(url, this.sthis, body);\n if (bodyRes.isErr()) {\n return Result.Err(bodyRes.Err());\n }\n body = bodyRes.Ok();\n }\n\n const done = await fetch(fetchUrl.asURL(), { method: \"PUT\", body });\n if (!done.ok) {\n return this.logger\n .Error()\n .Url(fetchUrl.URI())\n .Int(\"status\", done.status)\n .Str(\"statusText\", done.statusText)\n .Msg(`failed to upload ${store}`)\n .ResultError();\n }\n return Result.Ok(undefined);\n }\n\n async get(url: URI): Promise<bs.GetResult> {\n const { store } = getStore(url, this.sthis, (...args) => args.join(\"/\"));\n const rParams = url.getParamsResult(\"key\", \"name\", \"remoteBaseUrl\");\n if (rParams.isErr()) {\n return Result.Err(rParams.Err());\n }\n const { key, remoteBaseUrl } = rParams.Ok();\n let { name } = rParams.Ok();\n const index = url.getParam(\"index\");\n if (index) {\n name += `-${index}`;\n }\n name += \".fp\";\n const fetchUrl = BuildURI.from(remoteBaseUrl);\n switch (store) {\n case \"meta\":\n fetchUrl.setParam(\"meta\", name);\n break;\n default:\n fetchUrl.setParam(\"car\", key);\n break;\n }\n\n const rresponse = await exception2Result(() => {\n return fetch(fetchUrl.URI().asURL());\n });\n if (rresponse.isErr()) {\n return this.logger.Error().Url(fetchUrl).Err(rresponse).Msg(\"Failed to fetch\").ResultError();\n }\n const response = rresponse.Ok();\n\n if (!response.ok) {\n return Result.Err(new NotFoundError(`${store} not found: ${url}`));\n }\n\n const data = new Uint8Array(await response.arrayBuffer());\n if (store === \"meta\") {\n const res = await bs.setCryptoKeyFromGatewayMetaPayload(url, this.sthis, data);\n if (res.isErr()) {\n return this.logger.Error().Url(url).Err(res).Msg(\"Failed to set crypto key\").ResultError();\n }\n }\n return Result.Ok(data);\n }\n\n async delete(url: URI): Promise<bs.VoidResult> {\n const { store } = getStore(url, this.sthis, (...args) => args.join(\"/\"));\n const rParams = url.getParamsResult(\"key\", \"name\", \"remoteBaseUrl\");\n if (rParams.isErr()) {\n return Result.Err(rParams.Err());\n }\n const { key, remoteBaseUrl } = rParams.Ok();\n let { name } = rParams.Ok();\n\n const index = url.getParam(\"index\");\n if (index) {\n name += `-${index}`;\n }\n name += \".fp\";\n const fetchUrl = BuildURI.from(remoteBaseUrl);\n switch (store) {\n case \"meta\":\n fetchUrl.setParam(\"meta\", name);\n break;\n default:\n if (!key) {\n return Result.Err(new Error(\"Key not found in the URI\"));\n }\n fetchUrl.setParam(\"car\", key);\n break;\n }\n const response = await fetch(fetchUrl.URI().asURL(), { method: \"DELETE\" });\n if (!response.ok) {\n return Result.Err(new Error(`Failed to delete car: ${response.statusText}`));\n }\n return Result.Ok(undefined);\n }\n\n async subscribe(url: URI, callback: (msg: Uint8Array) => void): Promise<bs.UnsubscribeResult> {\n url = url.build().setParam(\"key\", \"main\").defParam(\"interval\", \"100\").defParam(\"maxInterval\", \"3000\").URI();\n\n let lastData: Uint8Array | undefined = undefined;\n const initInterval = parseInt(url.getParam(\"interval\") || \"100\", 10);\n const maxInterval = parseInt(url.getParam(\"maxInterval\") || \"3000\", 10);\n let interval = initInterval;\n const fetchData = async () => {\n const result = await this.get(url);\n\n if (result.isOk()) {\n const data = result.Ok();\n if (!lastData || !data.every((value, index) => lastData && value === lastData[index])) {\n lastData = data;\n\n callback(data);\n interval = initInterval; // Reset interval when data changes\n } else {\n interval = Math.min(interval * 2, maxInterval);\n }\n }\n timeoutId = setTimeout(fetchData, interval);\n };\n let timeoutId = setTimeout(fetchData, interval);\n\n return Result.Ok(() => {\n clearTimeout(timeoutId);\n });\n }\n}\n\nexport class NetlifyTestStore implements bs.TestGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n readonly gateway: bs.Gateway;\n\n constructor(sthis: SuperThis, gw: bs.Gateway) {\n this.sthis = ensureSuperLog(sthis, \"NetlifyTestStore\");\n this.logger = this.sthis.logger;\n this.gateway = gw;\n }\n\n async get(iurl: URI, key: string): Promise<Uint8Array> {\n const url = iurl.build().setParam(\"key\", key).URI();\n const buffer = await this.gateway.get(url);\n return buffer.Ok();\n }\n}\n\nconst onceRegisterNetlifyStoreProtocol = new KeyedResolvOnce<() => void>();\nexport function registerNetlifyStoreProtocol(protocol = \"netlify:\", overrideBaseURL?: string) {\n return onceRegisterNetlifyStoreProtocol.get(protocol).once(() => {\n URI.protocolHasHostpart(protocol);\n return bs.registerStoreProtocol({\n protocol,\n overrideBaseURL,\n gateway: async (sthis): Promise<bs.Gateway> => {\n return new NetlifyGateway(sthis);\n },\n test: async (sthis: SuperThis) => {\n const gateway = new NetlifyGateway(sthis);\n return new NetlifyTestStore(sthis, gateway);\n },\n });\n });\n}\n"],"mappings":"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","names":["import_cement","import_fireproof_core","import_cement"]}