MCPcopy Create free account
hub / github.com/Effect-TS/effect / run

Function run

packages/sql/sqlite-wasm/src/OpfsWorker.ts:42–121  ·  view source on GitHub ↗
(
  options: OpfsWorkerConfig
)

Source from the content-addressed store, hash-verified

40 * @since 4.0.0
41 */
42export const run = (
43 options: OpfsWorkerConfig
44): Effect.Effect<void, SqlError> =>
45 Effect.gen(function*() {
46 const factory = yield* Effect.promise(() => SQLiteESMFactory())
47 const sqlite3 = WaSqlite.Factory(factory)
48 const vfs = yield* Effect.acquireRelease(
49 Effect.promise(() => AccessHandlePoolVFS.create("opfs", factory)),
50 (vfs) => Effect.promise(() => vfs.close())
51 )
52 sqlite3.vfs_register(vfs, false)
53 const db = yield* Effect.acquireRelease(
54 Effect.try({
55 try: () => sqlite3.open_v2(options.dbName, undefined, "opfs"),
56 catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to open database", "openDatabase") })
57 }),
58 (db) => Effect.sync(() => sqlite3.close(db))
59 )
60
61 return yield* Effect.callback<void>((resume) => {
62 const onMessage = (event: any) => {
63 let messageId: number
64 const message = event.data as OpfsWorkerMessage
65 try {
66 switch (message[0]) {
67 case "close": {
68 options.port.close()
69 return resume(Effect.void)
70 }
71 case "import": {
72 const [, id, data] = message
73 messageId = id
74 sqlite3.deserialize(db, "main", data, data.length, data.length, 1 | 2)
75 options.port.postMessage([id, void 0, void 0])
76 return
77 }
78 case "export": {
79 const [, id] = message
80 messageId = id
81 const data = sqlite3.serialize(db, "main")
82 options.port.postMessage([id, undefined, data], [data.buffer])
83 return
84 }
85 case "update_hook": {
86 messageId = -1
87 sqlite3.update_hook(db, (_op, _db, table, rowid) => {
88 if (!table) return
89 options.port.postMessage(["update_hook", table, Number(rowid)])
90 })
91 return
92 }
93 default: {
94 const [id, sql, params] = message
95 messageId = id
96 const results: Array<any> = []
97 let columns: Array<string> | undefined
98 for (const stmt of sqlite3.statements(db, sql)) {
99 sqlite3.bind_collection(stmt, params as any)

Callers 2

layerFunction · 0.70
layerFunction · 0.50

Calls 7

removeEventListenerMethod · 0.80
classifyErrorFunction · 0.70
pipeMethod · 0.65
closeMethod · 0.65
addEventListenerMethod · 0.65
syncMethod · 0.45
postMessageMethod · 0.45

Tested by

no test coverage detected