UNPKG

@fireproof/aws

Version:

PartyKit gateway for AWS

1 lines 25.1 kB
{"version":3,"sources":["../../src/aws/index.ts","../../src/connection-from-store.ts","../../src/aws/gateway.ts"],"sourcesContent":["import { ConnectFunction, connectionFactory, makeKeyBagUrlExtractable } from \"../connection-from-store.js\";\nimport { bs, Database } from \"@fireproof/core\";\nimport { registerAWSStoreProtocol } from \"./gateway.js\";\nimport { BuildURI, KeyedResolvOnce } from \"@adviser/cement\";\n\n// Usage:\n//\n// import { useFireproof } from 'use-fireproof'\n// import { connect } from '@fireproof/aws'\n//\n// const { db } = useFireproof('test')\n//\n// const cx = connect.aws(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-aws?fs=mem\";\n// }\n\nregisterAWSStoreProtocol();\n\nconst connectionCache = new KeyedResolvOnce<bs.Connection>();\nexport const connect: ConnectFunction = (\n db: Database,\n remoteDbName = \"\",\n url = \"aws://aws.amazon.com\",\n region = \"us-east-2\",\n uploadUrl = \"https://7leodn3dj2.execute-api.us-east-2.amazonaws.com/uploads\",\n webSocketUrl = \"wss://fufauby0ii.execute-api.us-east-2.amazonaws.com/Prod\",\n dataUrl = \"https://fp1-uploads-201698179963.s3.us-east-2.amazonaws.com\"\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.setParam(\"name\", remoteDbName || existingName || dbName);\n urlObj.defParam(\"localName\", dbName);\n urlObj.defParam(\"storekey\", `@${dbName}:data@`);\n urlObj.defParam(\"region\", region);\n urlObj.defParam(\"uploadUrl\", uploadUrl);\n urlObj.defParam(\"webSocketUrl\", webSocketUrl);\n urlObj.defParam(\"dataUrl\", dataUrl);\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 \"@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://./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 { BuildURI, CoerceURI, exception2Result, KeyedResolvOnce, Result, URI } from \"@adviser/cement\";\nimport { bs, getStore, Logger, NotFoundError, SuperThis, ensureSuperLog } from \"@fireproof/core\";\n\nasync function resultFetch(logger: Logger, curl: CoerceURI, init?: RequestInit): Promise<Result<Response>> {\n const url = URI.from(curl);\n try {\n const ret = await fetch(url.asURL(), init);\n // logger.Debug().Url(url).Any(\"init\", init).Int(\"status\", ret.status).Msg(\"Fetch Done\");\n return Result.Ok(ret);\n } catch (err) {\n return logger.Error().Url(url).Any(\"init\", init).Err(err).Msg(\"Fetch Error\").ResultError();\n }\n}\n\nexport class AWSGateway implements bs.Gateway {\n readonly sthis: SuperThis;\n readonly logger: Logger;\n\n constructor(sthis: SuperThis) {\n this.sthis = ensureSuperLog(sthis, \"AWSGateway\");\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(): Promise<Result<void>> {\n // Implement the destroy logic for AWS\n return Result.Ok(undefined);\n }\n\n async start(baseUrl: URI): Promise<Result<URI>> {\n await this.sthis.start();\n this.logger.Debug().Str(\"url\", baseUrl.toString()).Msg(\"start\");\n\n const rParams = baseUrl.getParamsResult(\"uploadUrl\", \"webSocketUrl\", \"dataUrl\");\n if (rParams.isErr()) {\n return Result.Err(rParams.Err());\n }\n const ret = baseUrl\n .build()\n .defParam(\"version\", \"v0.1-aws\")\n .defParam(\"region\", baseUrl.getParam(\"region\") || \"us-east-2\")\n .URI();\n\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(\"uploadUrl\", \"key\", \"name\");\n if (rParams.isErr()) {\n return this.logger.Error().Url(url).Err(rParams).Msg(\"Put Error\").ResultError();\n }\n const { uploadUrl, key, name } = rParams.Ok();\n return store === \"meta\"\n ? this.putMeta(url, uploadUrl, key, name, body)\n : this.putData(uploadUrl, store, key, name, body);\n }\n private async putMeta(\n url: URI,\n uploadUrl: string,\n key: string,\n name: string,\n body: Uint8Array\n ): Promise<bs.VoidResult> {\n const index = url.getParam(\"index\");\n if (index) {\n name += `-${index}`;\n }\n name += \".fp\";\n const fetchUrl = BuildURI.from(uploadUrl)\n .setParam(\"type\", \"meta\")\n .setParam(\"key\", key)\n .setParam(\"name\", name)\n .URI();\n\n // const rPrefetch = await resultFetch(this.logger, fetchUrl, { method: \"GET\" });\n // if (rPrefetch.isErr()) {\n // return Result.Err(rPrefetch.Err());\n // }\n // const prefetch = rPrefetch.Ok();\n // // if (!prefetch.ok) {\n // // return this.logger.Error().Url(fetchUrl).Int(\"status\", prefetch.status).Msg(\"failed to upload meta\").ResultError();\n // // }\n\n // const doneJson = await prefetch.json();\n // if (!doneJson.uploadURL) {\n // return this.logger.Error().Url(fetchUrl).Any({doneJson}).Msg(\"Upload URL not found in the response\").ResultError();\n // }\n\n const meta = await bs.addCryptoKeyToGatewayMetaPayload(url, this.sthis, body);\n if (meta.isErr()) {\n return Result.Err(meta.Err());\n }\n this.logger.Debug().Url(fetchUrl).Any({ meta }).Msg(\"putMeta\");\n const rDone = await resultFetch(this.logger, fetchUrl, {\n method: \"PUT\",\n body: this.sthis.txt.decode(meta.Ok()),\n });\n if (rDone.isErr()) {\n return Result.Err(rDone.Err());\n }\n const done = rDone.Ok();\n if (!done.ok) {\n return this.logger\n .Error()\n .Url(fetchUrl)\n .Any({ done, x: await done.text() })\n .Msg(\"failed to upload meta\")\n .ResultError();\n }\n return Result.Ok(undefined);\n }\n\n private async putData(\n uploadUrl: string,\n store: string,\n key: string,\n name: string,\n body: Uint8Array\n ): Promise<bs.VoidResult> {\n const fetchUrl = BuildURI.from(uploadUrl).setParam(\"type\", store).setParam(\"car\", key).setParam(\"name\", name).URI();\n\n const rDone = await resultFetch(this.logger, fetchUrl, { method: \"GET\" });\n if (rDone.isErr()) {\n return Result.Err(rDone.Err());\n }\n const done = rDone.Ok();\n if (!done.ok) {\n return this.logger.Error().Any({ resp: done }).Msg(\"failed to upload meta\").ResultError();\n }\n\n const doneJson = await done.json();\n if (!doneJson.uploadURL) {\n return this.logger.Error().Url(fetchUrl).Msg(\"Upload URL not found in the response\").ResultError();\n }\n\n const ruploadDone = await resultFetch(this.logger, doneJson.uploadURL, { method: \"PUT\", body });\n if (ruploadDone.isErr()) {\n return Result.Err(ruploadDone.Err());\n }\n const uploadDone = ruploadDone.Ok();\n if (!uploadDone.ok) {\n return this.logger.Error().Any({ resp: uploadDone }).Msg(\"Upload Data response error\").ResultError();\n }\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 switch (store) {\n case \"meta\":\n return this.getMeta(url);\n case \"data\":\n return this.getData(url);\n case \"wal\":\n return this.getWal(url);\n default:\n throw new Error(`Unknown store type: ${store}`);\n }\n }\n\n private async getData(url: URI): Promise<bs.GetResult> {\n const rParams = url.getParamsResult(\"dataUrl\", \"key\", \"name\");\n // console.log(\"Get Data URL:\", url.toString());\n if (rParams.isErr()) {\n return Result.Err(rParams.Err());\n }\n const { dataUrl, name, key } = rParams.Ok();\n const fetchUrl = BuildURI.from(dataUrl).appendRelative(`/data/${name}/${key}.car`).URI();\n const rresponse = await resultFetch(this.logger, fetchUrl);\n if (rresponse.isErr()) {\n return Result.Err(rresponse.Err());\n }\n const response = rresponse.Ok();\n if (!response.ok) {\n this.logger\n .Error()\n .Url(fetchUrl, \"fetchUrl\")\n .Url(dataUrl, \"dataUrl\")\n .Int(\"status\", response.status)\n .Msg(\"Download Data response error\");\n return Result.Err(new NotFoundError(`data not found: ${url}`));\n }\n\n const data = new Uint8Array(await response.arrayBuffer());\n return Result.Ok(data);\n }\n\n private async getMeta(url: URI): Promise<bs.GetResult> {\n const rParams = url.getParamsResult(\"uploadUrl\", \"name\", \"key\");\n if (rParams.isErr()) {\n return Result.Err(rParams.Err());\n }\n const { uploadUrl, key } = rParams.Ok();\n let name = rParams.Ok().name;\n const index = url.getParam(\"index\");\n if (index) {\n name += `-${index}`;\n }\n name += \".fp\";\n const fetchUrl = BuildURI.from(uploadUrl)\n .setParam(\"type\", \"meta\")\n .setParam(\"key\", key)\n .setParam(\"name\", name)\n .URI();\n const rresponse = await resultFetch(this.logger, fetchUrl);\n if (rresponse.isErr()) {\n return Result.Err(rresponse.Err());\n }\n const response = rresponse.Ok();\n if (!response.ok) {\n if (response.status === 403) {\n return Result.Err(new NotFoundError(`meta not found: ${url}->${fetchUrl}`));\n }\n return this.logger.Error().Url(fetchUrl).Any({ response }).Msg(\"Download Meta response error\").ResultError();\n }\n\n const data = new Uint8Array(await response.arrayBuffer());\n // bs.setCryptoKeyFromGatewayMetaPayload(url, this.sthis, data);\n const res = await bs.setCryptoKeyFromGatewayMetaPayload(url, this.sthis, data);\n if (res.isErr()) {\n return Result.Err(res.Err());\n }\n return Result.Ok(data);\n }\n\n private async getWal(url: URI): Promise<bs.GetResult> {\n const rParams = url.getParamsResult(\"dataUrl\", \"key\", \"name\");\n if (rParams.isErr()) {\n return Result.Err(rParams.Err());\n }\n const { dataUrl, name } = rParams.Ok();\n const fetchUrl = BuildURI.from(dataUrl).appendRelative(`/wal/${name}.wal`).URI();\n const rresponse = await exception2Result(() => fetch(fetchUrl.asURL()));\n if (rresponse.isErr()) {\n return Result.Err(rresponse.Err());\n }\n const response = rresponse.Ok();\n if (!response.ok) {\n // console.log(\"Download Wal response error:\", response.status);\n return Result.Err(new NotFoundError(`wal not found: ${url}`));\n }\n const data = new Uint8Array(await response.arrayBuffer());\n return Result.Ok(data);\n }\n\n async delete(_url: URI): Promise<bs.VoidResult> {\n // throw new Error(\"Method not implemented.\");\n return Result.Ok(undefined);\n }\n\n async subscribe(url: URI, callback: (meta: Uint8Array) => void): Promise<bs.UnsubscribeResult> {\n url = url.build().setParam(\"key\", \"main\").defParam(\"interval\", \"100\").URI();\n\n let lastData: Uint8Array | undefined = undefined;\n let interval = parseInt(url.getParam(\"interval\") || \"100\", 10);\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 = 100; // Reset interval when data changes\n } else {\n interval = Math.min(interval * 2, 3000); // Double the interval when data is unchanged, but limit to 3 secs\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 AWSTestStore 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, \"AWSTestStore\");\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 onceRegisterAWSStoreProtocol = new KeyedResolvOnce<() => void>();\nexport function registerAWSStoreProtocol(protocol = \"aws:\", overrideBaseURL?: string) {\n return onceRegisterAWSStoreProtocol.get(protocol).once(() => {\n URI.protocolHasHostpart(protocol);\n return bs.registerStoreProtocol({\n protocol,\n overrideBaseURL,\n gateway: async (sthis) => {\n return new AWSGateway(sthis);\n },\n test: async (sthis: SuperThis) => {\n const gateway = new AWSGateway(sthis);\n return new AWSTestStore(sthis, gateway);\n },\n });\n });\n}\n"],"mappings":"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","names":["import_cement","import_core","import_cement"]}