@effect/sql-sqlite-wasm 0.20.5 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/OpfsWorker/package.json +6 -0
- package/dist/cjs/OpfsWorker.js +103 -0
- package/dist/cjs/OpfsWorker.js.map +1 -0
- package/dist/cjs/SqliteClient.js +254 -32
- package/dist/cjs/SqliteClient.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/internal/opfsWorker.js +6 -0
- package/dist/cjs/internal/opfsWorker.js.map +1 -0
- package/dist/dts/OpfsWorker.d.ts +19 -0
- package/dist/dts/OpfsWorker.d.ts.map +1 -0
- package/dist/dts/SqliteClient.d.ts +48 -14
- package/dist/dts/SqliteClient.d.ts.map +1 -1
- package/dist/dts/index.d.ts +4 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/opfsWorker.d.ts +2 -0
- package/dist/dts/internal/opfsWorker.d.ts.map +1 -0
- package/dist/esm/OpfsWorker.js +92 -0
- package/dist/esm/OpfsWorker.js.map +1 -0
- package/dist/esm/SqliteClient.js +247 -29
- package/dist/esm/SqliteClient.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/opfsWorker.js +2 -0
- package/dist/esm/internal/opfsWorker.js.map +1 -0
- package/package.json +13 -5
- package/src/OpfsWorker.ts +101 -0
- package/src/SqliteClient.ts +360 -57
- package/src/index.ts +5 -0
- package/src/internal/opfsWorker.ts +9 -0
- package/src/sqlite-wasm.d.ts +10 -38
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SqliteClient","SqliteMigrator"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["OpfsWorker","SqliteClient","SqliteMigrator"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opfsWorker.js","names":[],"sources":["../../../src/internal/opfsWorker.ts"],"sourcesContent":[null],"mappings":"","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/sql-sqlite-wasm",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "A SQLite toolkit for Effect",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
},
|
|
11
11
|
"sideEffects": [],
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@opentelemetry/semantic-conventions": "^1.25.1"
|
|
14
|
-
"@sqlite.org/sqlite-wasm": "3.46.0-build2"
|
|
13
|
+
"@opentelemetry/semantic-conventions": "^1.25.1"
|
|
15
14
|
},
|
|
16
15
|
"peerDependencies": {
|
|
17
|
-
"@effect/
|
|
18
|
-
"effect": "^
|
|
16
|
+
"@effect/wa-sqlite": "^0.1.2",
|
|
17
|
+
"@effect/sql": "^0.20.7",
|
|
18
|
+
"effect": "^3.10.15"
|
|
19
19
|
},
|
|
20
20
|
"publishConfig": {
|
|
21
21
|
"provenance": true
|
|
@@ -30,6 +30,11 @@
|
|
|
30
30
|
"import": "./dist/esm/index.js",
|
|
31
31
|
"default": "./dist/cjs/index.js"
|
|
32
32
|
},
|
|
33
|
+
"./OpfsWorker": {
|
|
34
|
+
"types": "./dist/dts/OpfsWorker.d.ts",
|
|
35
|
+
"import": "./dist/esm/OpfsWorker.js",
|
|
36
|
+
"default": "./dist/cjs/OpfsWorker.js"
|
|
37
|
+
},
|
|
33
38
|
"./SqliteClient": {
|
|
34
39
|
"types": "./dist/dts/SqliteClient.d.ts",
|
|
35
40
|
"import": "./dist/esm/SqliteClient.js",
|
|
@@ -48,6 +53,9 @@
|
|
|
48
53
|
},
|
|
49
54
|
"typesVersions": {
|
|
50
55
|
"*": {
|
|
56
|
+
"OpfsWorker": [
|
|
57
|
+
"./dist/dts/OpfsWorker.d.ts"
|
|
58
|
+
],
|
|
51
59
|
"SqliteClient": [
|
|
52
60
|
"./dist/dts/SqliteClient.d.ts"
|
|
53
61
|
],
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
/// <reference lib="webworker" />
|
|
5
|
+
import { SqlError } from "@effect/sql/SqlError"
|
|
6
|
+
import * as WaSqlite from "@effect/wa-sqlite"
|
|
7
|
+
import SQLiteESMFactory from "@effect/wa-sqlite/dist/wa-sqlite.mjs"
|
|
8
|
+
import { AccessHandlePoolVFS } from "@effect/wa-sqlite/src/examples/AccessHandlePoolVFS.js"
|
|
9
|
+
import * as Effect from "effect/Effect"
|
|
10
|
+
import type { OpfsWorkerMessage } from "./internal/opfsWorker.js"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @category models
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export interface OpfsWorkerConfig {
|
|
17
|
+
readonly port: EventTarget & Pick<MessagePort, "postMessage" | "close">
|
|
18
|
+
readonly dbName: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @category constructor
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
*/
|
|
25
|
+
export const run = (
|
|
26
|
+
options: OpfsWorkerConfig
|
|
27
|
+
): Effect.Effect<void, SqlError> =>
|
|
28
|
+
Effect.gen(function*() {
|
|
29
|
+
const factory = yield* Effect.promise(() => SQLiteESMFactory())
|
|
30
|
+
const sqlite3 = WaSqlite.Factory(factory)
|
|
31
|
+
const vfs = yield* Effect.promise(() => AccessHandlePoolVFS.create("opfs", factory))
|
|
32
|
+
sqlite3.vfs_register(vfs, false)
|
|
33
|
+
const db = yield* Effect.acquireRelease(
|
|
34
|
+
Effect.try({
|
|
35
|
+
try: () => sqlite3.open_v2(options.dbName, undefined, "opfs"),
|
|
36
|
+
catch: (cause) => new SqlError({ cause, message: "Failed to open database" })
|
|
37
|
+
}),
|
|
38
|
+
(db) => Effect.sync(() => sqlite3.close(db))
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
return yield* Effect.async<void>((resume) => {
|
|
42
|
+
const onMessage = (event: any) => {
|
|
43
|
+
let messageId: number
|
|
44
|
+
const message = event.data as OpfsWorkerMessage
|
|
45
|
+
try {
|
|
46
|
+
switch (message[0]) {
|
|
47
|
+
case "close": {
|
|
48
|
+
options.port.close()
|
|
49
|
+
return resume(Effect.void)
|
|
50
|
+
}
|
|
51
|
+
case "import": {
|
|
52
|
+
const [, id, data] = message
|
|
53
|
+
messageId = id
|
|
54
|
+
sqlite3.deserialize(db, "main", data, data.length, data.length, 1 | 2)
|
|
55
|
+
options.port.postMessage([id, void 0, void 0])
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
case "export": {
|
|
59
|
+
const [, id] = message
|
|
60
|
+
messageId = id
|
|
61
|
+
const data = sqlite3.serialize(db, "main")
|
|
62
|
+
options.port.postMessage([id, undefined, data], [data.buffer])
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
case "update_hook": {
|
|
66
|
+
messageId = -1
|
|
67
|
+
sqlite3.update_hook(db, (_op, _db, table, rowid) => {
|
|
68
|
+
if (!table) return
|
|
69
|
+
options.port.postMessage(["update_hook", table, Number(rowid)])
|
|
70
|
+
})
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
default: {
|
|
74
|
+
const [id, sql, params] = message
|
|
75
|
+
messageId = id
|
|
76
|
+
const results: Array<any> = []
|
|
77
|
+
let columns: Array<string> | undefined
|
|
78
|
+
for (const stmt of sqlite3.statements(db, sql)) {
|
|
79
|
+
sqlite3.bind_collection(stmt, params as any)
|
|
80
|
+
while (sqlite3.step(stmt) === WaSqlite.SQLITE_ROW) {
|
|
81
|
+
columns = columns ?? sqlite3.column_names(stmt)
|
|
82
|
+
const row = sqlite3.row(stmt)
|
|
83
|
+
results.push(row)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
options.port.postMessage([id, undefined, [columns, results]])
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
} catch (e: any) {
|
|
91
|
+
const message = "message" in e ? e.message : String(e)
|
|
92
|
+
options.port.postMessage([messageId!, message, undefined])
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
options.port.addEventListener("message", onMessage)
|
|
96
|
+
options.port.postMessage(["ready", undefined, undefined])
|
|
97
|
+
return Effect.sync(() => {
|
|
98
|
+
options.port.removeEventListener("message", onMessage)
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
}).pipe(Effect.scoped)
|