{"version":3,"sources":["../../src/cloud/index.ts","../../src/connection-from-store.ts","../../src/cloud/gateway.ts"],"sourcesContent":["import { BuildURI, CoerceURI, KeyedResolvOnce, runtimeFn, URI } from \"@adviser/cement\";\nimport { bs, Database, fireproof } from \"@fireproof/core\";\nimport { ConnectFunction, connectionFactory, makeKeyBagUrlExtractable } from \"../connection-from-store.js\";\nimport { registerFireproofCloudStoreProtocol } from \"./gateway.js\";\n\ninterface ConnectData {\n  readonly remoteName: string;\n  firstConnect: boolean;\n  endpoint?: string;\n}\n\nconst SYNC_DB_NAME = \"fp_sync\";\n\n// Usage:\n//\n// import { useFireproof } from 'use-fireproof'\n// import { connect } from '@fireproof/cloud'\n//\n// const { db } = useFireproof('test')\n//\n// const cx = connect(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-fireproof?fs=mem\";\n// }\n\nif (!runtimeFn().isBrowser) {\n  const url = BuildURI.from(process.env.FP_KEYBAG_URL || \"file://./dist/kb-dir-FireproofCloud\");\n  url.setParam(\"extractKey\", \"_deprecated_internal_api\");\n  process.env.FP_KEYBAG_URL = url.toString();\n}\n\nregisterFireproofCloudStoreProtocol();\n\nconst connectionCache = new KeyedResolvOnce<bs.Connection>();\nexport const rawConnect: ConnectFunction = (\n  db: Database,\n  remoteDbName = \"\",\n  url = \"fireproof://cloud.fireproof.direct\"\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  urlObj.defParam(\"getBaseUrl\", \"https://storage.fireproof.direct/\");\n  const fpUrl = urlObj\n    .toString()\n    .replace(/^http:\\/\\//, \"fireproof://\")\n    .replace(/^https:\\/\\//, \"fireproof://\");\n  // console.log(\"Config URL: \" + fpUrl);\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\nasync function getOrCreateRemoteName(dbName: string, remoteName?: string) {\n  const syncDb = fireproof(SYNC_DB_NAME);\n\n  const result = await syncDb.query<string, ConnectData>(\"localName\", { key: dbName, includeDocs: true });\n  if (result.rows.length === 0) {\n    const doc = {\n      remoteName: remoteName || syncDb.sthis.timeOrderedNextId().str,\n      localName: dbName,\n      firstConnect: !remoteName,\n    } as ConnectData;\n    const { id } = await syncDb.put(doc);\n    return { ...doc, _id: id };\n  }\n  const doc = result.rows[0].doc;\n  return doc;\n}\n\nexport function connect(\n  db: Database,\n  remoteName?: string,\n  dashboardURI: CoerceURI = \"https://dashboard.fireproof.storage/\",\n  remoteURI: CoerceURI = \"fireproof://cloud.fireproof.direct\"\n): Promise<bs.Connection> {\n  const dbName = db.name as string;\n  if (!dbName) {\n    throw new Error(\"Database name is required for cloud connection\");\n  }\n\n  return getOrCreateRemoteName(dbName, remoteName).then(async (doc) => {\n    if (!doc) {\n      throw new Error(\"Failed to get or create remote name\");\n    }\n    doc.endpoint = URI.from(remoteURI).toString();\n    const connection = rawConnect(db, doc.remoteName, URI.from(doc.endpoint).toString());\n    const connectURI = URI.from(dashboardURI).build().pathname(\"/fp/databases/connect\");\n    connectURI.defParam(\"localName\", dbName);\n    connectURI.defParam(\"remoteName\", doc.remoteName);\n    if (doc.endpoint) {\n      connectURI.defParam(\"endpoint\", doc.endpoint);\n    }\n    // eslint-disable-next-line no-console\n    console.log(\"Fireproof Cloud: \" + connectURI.toString());\n    if (\n      doc.firstConnect &&\n      runtimeFn().isBrowser &&\n      window.location.href.indexOf(URI.from(dashboardURI).toString()) === -1\n    ) {\n      // Set firstConnect to false after opening the window, so we don't constantly annoy with the dashboard\n      const syncDb = fireproof(SYNC_DB_NAME);\n      doc.firstConnect = false;\n      await syncDb.put(doc);\n\n      // window.open(connectURI.toString(), \"_blank\");\n    }\n    connection.dashboardUrl = URI.from(connectURI);\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 { PartySocket, PartySocketOptions } from \"partysocket\";\nimport { Result, URI, BuildURI, KeyedResolvOnce, runtimeFn, exception2Result } from \"@adviser/cement\";\nimport { bs, ensureLogger, getStore, Logger, rt, SuperThis } from \"@fireproof/core\";\n\nexport class FireproofCloudGateway 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, \"FireproofCloudGateway\", {\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 FireproofCloudGateway with URI: \" + uri.toString());\n\n    await this.sthis.start();\n\n    this.url = uri;\n    const ret = uri.build().defParam(\"version\", \"v0.1-fireproof-cloud\");\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 connectFireproofCloud() {\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    if (store === \"meta\") {\n      const uploadUrl = pkMetaURL(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    } else {\n      const uploadUrl = pkURL(uri, key, \"car\");\n      return exception2Result(async () => {\n        const response = await fetch(uploadUrl.asURL(), { method: \"PUT\" });\n        this.logger\n          .Debug()\n          .Url(uploadUrl)\n          .Uint64(\"status\", response.status)\n          .Str(\"status-text\", response.statusText)\n          .Msg(\"put\");\n        if (response.status === 404) {\n          throw this.logger.Error().Url(uploadUrl).Msg(`Failure in uploading ${store}!`).AsError();\n        }\n        const url = (await response.json()).url;\n        this.logger.Debug().Url(url).Msg(\"put\");\n        const uploadResponse = await fetch(url, { method: \"PUT\", body: body });\n        if (uploadResponse.status === 404) {\n          throw this.logger.Error().Url(uploadUrl).Msg(`Failure in uploading ${store}!`).AsError();\n        }\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.connectFireproofCloud();\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      let downloadUrl;\n      this.logger.Debug().Str(\"store\", store).Str(\"key\", key).Msg(\"get\");\n      switch (store) {\n        case \"meta\":\n          downloadUrl = pkMetaURL(uri, key);\n          break;\n        case \"data\":\n          downloadUrl = pkCarGetURL(uri, key);\n          break;\n        default:\n          throw new Error(`Unsupported store: ${store}`);\n      }\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    // FIXME had to add this method back to make the compiler happy jchris\n    throw new Error(\"no delete for fireproof cloud\");\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 pkCarGetURL(uri: URI, key: string): URI {\n  const baseUrl = uri.getParam(\"getBaseUrl\");\n  if (!baseUrl) {\n    return pkURL(uri, key, \"car\");\n  }\n  const name = uri.getParam(\"name\");\n  const idx = uri.getParam(\"index\") || \"\";\n  const baseUri = URI.from(baseUrl).asURL();\n  baseUri.pathname = `/${name}${idx}/${key}`;\n  // console.log(\"pkCarGetURL\", baseUri.toString());\n  return BuildURI.from(baseUri).URI();\n}\n\nfunction pkMetaURL(uri: URI, key: string): URI {\n  return pkURL(uri, key, \"meta\");\n}\n\nexport class FireproofCloudTestStore 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, \"FireproofCloudTestStore\");\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 onceRegisterFireproofCloudStoreProtocol = new KeyedResolvOnce<() => void>();\nexport function registerFireproofCloudStoreProtocol(protocol = \"fireproof:\", overrideBaseURL?: string) {\n  return onceRegisterFireproofCloudStoreProtocol.get(protocol).once(() => {\n    URI.protocolHasHostpart(protocol);\n    return bs.registerStoreProtocol({\n      protocol,\n      overrideBaseURL,\n      gateway: async (sthis) => {\n        return new FireproofCloudGateway(sthis);\n      },\n      test: async (sthis: SuperThis) => {\n        const gateway = new FireproofCloudGateway(sthis);\n        return new FireproofCloudTestStore(gateway, sthis);\n      },\n    });\n  });\n}\n"],"mappings":"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","names":["import_cement","import_core","import_cement","import_core","doc"]}