From 61d4a386cceb8b1cd5873b6cb8e0b5e070d0c641 Mon Sep 17 00:00:00 2001
From: saul <saul@organicdesign.co.nz>
Date: Thu, 4 Apr 2024 10:24:41 +1300
Subject: [PATCH] Add unixfs to components.

---
 packages/daemon/src/common/index.ts                       | 6 +++++-
 packages/daemon/src/common/interface.ts                   | 2 ++
 packages/daemon/src/modules/filesystem/commands/read.ts   | 7 ++-----
 packages/daemon/src/modules/filesystem/commands/write.ts  | 8 +++-----
 .../daemon/src/modules/filesystem/upload-operations.ts    | 6 ++----
 .../src/modules/revisions/commands/read-revision.ts       | 7 ++-----
 6 files changed, 16 insertions(+), 20 deletions(-)

diff --git a/packages/daemon/src/common/index.ts b/packages/daemon/src/common/index.ts
index 2d95c8d3..69fa423a 100644
--- a/packages/daemon/src/common/index.ts
+++ b/packages/daemon/src/common/index.ts
@@ -1,5 +1,6 @@
 import Path from 'path'
 import { bitswap } from '@helia/block-brokers'
+import { unixfs as createUnixfs } from '@helia/unixfs'
 import HeliaPinManager from '@organicdesign/db-helia-pin-manager'
 import { createKeyManager, type KeyManager } from '@organicdesign/db-key-manager'
 import { ManualBlockBroker } from '@organicdesign/db-manual-block-broker'
@@ -73,6 +74,8 @@ export default async (settings: Partial<Settings> = {}): Promise<Components> =>
     blockBrokers: [bitswap(), () => manualBlockBroker]
   })
 
+  const unixfs = createUnixfs(helia)
+
   const welo = await createWelo({
     // @ts-expect-error Helia version mismatch here.
     ipfs: helia,
@@ -163,7 +166,8 @@ export default async (settings: Partial<Settings> = {}): Promise<Components> =>
     welo,
     heliaPinManager,
     events,
-    keyManager
+    keyManager,
+    unixfs
   }
 
   handleCommands(components)
diff --git a/packages/daemon/src/common/interface.ts b/packages/daemon/src/common/interface.ts
index 24aeaeca..ca669ec9 100644
--- a/packages/daemon/src/common/interface.ts
+++ b/packages/daemon/src/common/interface.ts
@@ -8,6 +8,7 @@ import type { Sneakernet } from './sneakernet/index.js'
 import type { Tick } from './tick.js'
 import type { KeyvalueDB } from '@/interface.js'
 import type { Helia } from '@helia/interface'
+import type { UnixFS } from '@helia/unixfs'
 import type { Libp2p } from '@libp2p/interface'
 import type HeliaPinManager from '@organicdesign/db-helia-pin-manager'
 import type { KeyManager } from '@organicdesign/db-key-manager'
@@ -53,4 +54,5 @@ export interface Components {
   heliaPinManager: HeliaPinManager
   events: EventTarget
   keyManager: KeyManager
+  unixfs: UnixFS
 }
diff --git a/packages/daemon/src/modules/filesystem/commands/read.ts b/packages/daemon/src/modules/filesystem/commands/read.ts
index 89d20a79..cee96a60 100644
--- a/packages/daemon/src/modules/filesystem/commands/read.ts
+++ b/packages/daemon/src/modules/filesystem/commands/read.ts
@@ -1,4 +1,3 @@
-import { unixfs } from '@helia/unixfs'
 import { Read } from '@organicdesign/db-rpc-interfaces'
 import { CID } from 'multiformats/cid'
 import { collect } from 'streaming-iterables'
@@ -7,7 +6,7 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
 import type { Context } from '../index.js'
 import type { ModuleMethod } from '@/interface.js'
 
-const command: ModuleMethod<Context> = ({ net, helia }, context) => {
+const command: ModuleMethod<Context> = ({ net, unixfs }, context) => {
   net.rpc.addMethod(Read.name, async (raw: unknown): Promise<Read.Return> => {
     const params = Read.Params.parse(raw)
     const fs = context.getFileSystem(CID.parse(params.group))
@@ -22,9 +21,7 @@ const command: ModuleMethod<Context> = ({ net, helia }, context) => {
       throw new Error(`no such item: ${params.path}`)
     }
 
-    const ufs = unixfs(helia)
-
-    return uint8ArrayToString(uint8ArrayConcat(await collect(ufs.cat(entry.cid, { offset: params.position, length: params.length }))))
+    return uint8ArrayToString(uint8ArrayConcat(await collect(unixfs.cat(entry.cid, { offset: params.position, length: params.length }))))
   })
 }
 
diff --git a/packages/daemon/src/modules/filesystem/commands/write.ts b/packages/daemon/src/modules/filesystem/commands/write.ts
index 50f4b3c3..13f735b0 100644
--- a/packages/daemon/src/modules/filesystem/commands/write.ts
+++ b/packages/daemon/src/modules/filesystem/commands/write.ts
@@ -1,4 +1,3 @@
-import { unixfs } from '@helia/unixfs'
 import { CustomEvent } from '@libp2p/interface'
 import { Write } from '@organicdesign/db-rpc-interfaces'
 import all from 'it-all'
@@ -9,7 +8,7 @@ import type { Context } from '../index.js'
 import type { Entry } from '../interface.js'
 import type { ModuleMethod } from '@/interface.js'
 
-const command: ModuleMethod<Context> = ({ net, helia, events }, context) => {
+const command: ModuleMethod<Context> = ({ net, unixfs, events }, context) => {
   net.rpc.addMethod(Write.name, async (raw: unknown): Promise<Write.Return> => {
     const params = Write.Params.parse(raw)
     const group = CID.parse(params.group)
@@ -20,9 +19,8 @@ const command: ModuleMethod<Context> = ({ net, helia, events }, context) => {
     }
 
     const entry: Partial<Entry> = await fs.get(params.path) ?? {}
-    const ufs = unixfs(helia)
 
-    const existingData = (entry.cid != null) ? uint8ArrayConcat(await all(ufs.cat(entry.cid))) : new Uint8Array()
+    const existingData = (entry.cid != null) ? uint8ArrayConcat(await all(unixfs.cat(entry.cid))) : new Uint8Array()
 
     const dataToWrite = uint8ArrayConcat([
       existingData.slice(0, params.position),
@@ -30,7 +28,7 @@ const command: ModuleMethod<Context> = ({ net, helia, events }, context) => {
       existingData.slice(params.position + params.length)
     ])
 
-    const cid = await ufs.addBytes(dataToWrite)
+    const cid = await unixfs.addBytes(dataToWrite)
 
     const newEntryParams = {
       cid,
diff --git a/packages/daemon/src/modules/filesystem/upload-operations.ts b/packages/daemon/src/modules/filesystem/upload-operations.ts
index 674472a1..f982f5bc 100644
--- a/packages/daemon/src/modules/filesystem/upload-operations.ts
+++ b/packages/daemon/src/modules/filesystem/upload-operations.ts
@@ -1,5 +1,4 @@
 import Path from 'path'
-import { unixfs } from '@helia/unixfs'
 import { CustomEvent } from '@libp2p/interface'
 import { type RevisionStrategies } from '@organicdesign/db-rpc-interfaces/zod'
 import all from 'it-all'
@@ -12,7 +11,7 @@ import type { Pair } from '@/interface.js'
 import type { Datastore } from 'interface-datastore'
 import { OperationManager } from '@/operation-manager.js'
 
-export default async (context: Pick<Context, 'getFileSystem'>, { events, pinManager, helia }: Components, datastore: Datastore): Promise<OperationManager<{
+export default async (context: Pick<Context, 'getFileSystem'>, { events, pinManager, unixfs }: Components, datastore: Datastore): Promise<OperationManager<{
   put(groupData: Uint8Array, path: string, encodedEntry: { cid: Uint8Array, encrypted: boolean, revisionStrategy: RevisionStrategies, priority: number }): Promise<void>
   delete(groupData: Uint8Array, path: string): Promise<Array<Pair<string, Entry>>>
 }>> => {
@@ -42,8 +41,7 @@ export default async (context: Pick<Context, 'getFileSystem'>, { events, pinMana
       }
 
       const parentPath = path.split('/').slice(0, -2).join('/')
-      const ufs = unixfs(helia)
-      const cid = await ufs.addBytes(new Uint8Array([]))
+      const cid = await unixfs.addBytes(new Uint8Array([]))
       const pairs = await all(fs.getDir(path))
 
       for await (const p of pairs) {
diff --git a/packages/daemon/src/modules/revisions/commands/read-revision.ts b/packages/daemon/src/modules/revisions/commands/read-revision.ts
index e0135225..94409525 100644
--- a/packages/daemon/src/modules/revisions/commands/read-revision.ts
+++ b/packages/daemon/src/modules/revisions/commands/read-revision.ts
@@ -1,4 +1,3 @@
-import { unixfs } from '@helia/unixfs'
 import { ReadRevision } from '@organicdesign/db-rpc-interfaces'
 import { CID } from 'multiformats/cid'
 import { collect } from 'streaming-iterables'
@@ -8,7 +7,7 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
 import type { Context } from '../index.js'
 import type { ModuleMethod } from '@/interface.js'
 
-const command: ModuleMethod<Context> = ({ net, helia }, context) => {
+const command: ModuleMethod<Context> = ({ net, unixfs }, context) => {
   net.rpc.addMethod(ReadRevision.name, async (raw: unknown): Promise<ReadRevision.Return> => {
     const params = ReadRevision.Params.parse(raw)
     const group = CID.parse(params.group)
@@ -26,9 +25,7 @@ const command: ModuleMethod<Context> = ({ net, helia }, context) => {
       throw new Error(`no such revision: ${params.path}, ${author}, ${params.sequence}`)
     }
 
-    const ufs = unixfs(helia)
-
-    return uint8ArrayToString(uint8ArrayConcat(await collect(ufs.cat(entry.cid, { offset: params.position, length: params.length }))))
+    return uint8ArrayToString(uint8ArrayConcat(await collect(unixfs.cat(entry.cid, { offset: params.position, length: params.length }))))
   })
 }