Skip to content
This repository was archived by the owner on Dec 22, 2024. It is now read-only.

Commit 08045b9

Browse files
committed
fix: error handling
1 parent d7f7e2c commit 08045b9

File tree

5 files changed

+44
-9
lines changed

5 files changed

+44
-9
lines changed

examples/react-counter/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
"@automerge/automerge-repo-react-hooks": "^1.0.19",
1717
"@automerge/automerge-repo-storage-indexeddb": "^1.0.19",
1818
"@automerge/automerge-wasm": "^0.9.0",
19+
"@openscript-ch/automerge-repo-storage-opfs": "workspace:*",
20+
"@types/react": "^18.2.47",
1921
"@vitejs/plugin-react": "^4.2.1",
2022
"react": "^18.2.0",
2123
"react-dom": "^18.2.0",

examples/react-counter/src/main.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import ReactDOM from "react-dom/client"
33
import { App } from "./App.js"
44
import { Repo } from "@automerge/automerge-repo"
55
import { MessageChannelNetworkAdapter } from "@automerge/automerge-repo-network-messagechannel"
6-
import { IndexedDBStorageAdapter } from "@automerge/automerge-repo-storage-indexeddb"
6+
// import { IndexedDBStorageAdapter } from "@automerge/automerge-repo-storage-indexeddb"
7+
import { OPFSStorageAdapter } from '@openscript-ch/automerge-repo-storage-opfs'
78
import { RepoContext } from "@automerge/automerge-repo-react-hooks"
89

910
// We run the network & storage in a separate file and the tabs themselves are stateless and lightweight.
@@ -24,7 +25,8 @@ const sharedWorker = new SharedWorker(
2425
/* Create a repo and share any documents we create with our local in-browser storage worker. */
2526
const repo = new Repo({
2627
network: [new MessageChannelNetworkAdapter(sharedWorker.port)],
27-
storage: new IndexedDBStorageAdapter("automerge-repo-demo-counter"),
28+
//storage: new IndexedDBStorageAdapter("automerge-repo-demo-counter"),
29+
storage: new OPFSStorageAdapter("automerge-repo-demo-counter"),
2830
sharePolicy: async peerId => peerId.includes("shared-worker"),
2931
})
3032

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "automerge-repo-storage-opfs",
2+
"name": "@openscript-ch/automerge-repo-storage-opfs",
33
"version": "0.0.1",
44
"description": "OPFS storage adapter for Automerge Repo",
55
"repository": "https://github.com/openscript-ch/automerge-repo-storage-opfs",

pnpm-lock.yaml

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ import { Chunk, StorageAdapter, StorageKey } from '@automerge/automerge-repo';
33
export class OPFSStorageAdapter extends StorageAdapter {
44
private baseDirectory: string;
55
private baseDirectoryHandle: FileSystemDirectoryHandle;
6-
private root: FileSystemDirectoryHandle;
76

87
constructor(baseDirectory: string = "automerge-repo-data") {
98
super();
109
this.baseDirectory = baseDirectory;
11-
this.initialize();
1210
}
1311

1412
async load(key: StorageKey): Promise<Uint8Array | undefined> {
1513
const fileName = getKey(key);
14+
await this.initialize();
1615

1716
try {
1817
const fileHandle = await this.baseDirectoryHandle.getFileHandle(fileName);
@@ -21,13 +20,14 @@ export class OPFSStorageAdapter extends StorageAdapter {
2120
return new Uint8Array(arrayBuffer);
2221
} catch (error) {
2322
// don't throw if file not found
24-
if (error.code === "NotFoundError") return undefined
23+
if (error.name === "NotFoundError") return undefined
2524
throw error;
2625
}
2726
}
2827

2928
async save(key: StorageKey, data: Uint8Array): Promise<void> {
3029
const fileName = getKey(key);
30+
await this.initialize();
3131

3232
const fileHandle = await this.baseDirectoryHandle.getFileHandle(fileName, { create: true });
3333
const fileWritable = await fileHandle.createWritable();
@@ -37,19 +37,21 @@ export class OPFSStorageAdapter extends StorageAdapter {
3737

3838
async remove(key: StorageKey): Promise<void> {
3939
const fileName = getKey(key);
40+
await this.initialize();
4041

4142
try {
4243
return this.baseDirectoryHandle.removeEntry(fileName);
4344
} catch (error) {
4445
// don't throw if file not found
45-
if (error.code === "NotFoundError") return undefined
46+
if (error.name === "NotFoundError") return undefined
4647
throw error;
4748
}
4849
}
4950

5051
async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {
5152
const chunks: Chunk[] = [];
5253
const prefix = getKey(keyPrefix);
54+
await this.initialize();
5355

5456
for await (const [name] of this.baseDirectoryHandle) {
5557
if (name.startsWith(prefix)) {
@@ -65,6 +67,7 @@ export class OPFSStorageAdapter extends StorageAdapter {
6567

6668
async removeRange(keyPrefix: StorageKey): Promise<void> {
6769
const prefix = getKey(keyPrefix);
70+
await this.initialize();
6871

6972
for await (const [name] of this.baseDirectoryHandle) {
7073
if (name.startsWith(prefix)) {
@@ -74,8 +77,10 @@ export class OPFSStorageAdapter extends StorageAdapter {
7477
}
7578

7679
private async initialize() {
77-
this.root = await navigator.storage.getDirectory();
78-
this.baseDirectoryHandle = await this.root.getDirectoryHandle(this.baseDirectory, { create: true });
80+
if(!this.baseDirectoryHandle) {
81+
const root = await navigator.storage.getDirectory();
82+
this.baseDirectoryHandle = await root.getDirectoryHandle(this.baseDirectory, { create: true });
83+
}
7984
}
8085

8186
}

0 commit comments

Comments
 (0)