1 line
232 KiB
Text
1 line
232 KiB
Text
|
|
{"version":3,"sources":["../src/pg_dump.ts","../../../node_modules/.pnpm/tsup@8.3.0_@microsoft+api-extractor@7.47.7_@types+node@20.16.11__postcss@8.4.47_tsx@4.19.2_typescript@5.6.3/node_modules/tsup/assets/cjs_shims.js","../release/pg_dump.js","../src/pgDumpModFactory.ts"],"sourcesContent":["import { PGlite } from '@electric-sql/pglite'\nimport PgDumpModFactory, { PgDumpMod } from './pgDumpModFactory'\n\nconst dumpFilePath = '/tmp/out.sql'\n\n/**\n * Creates a new Uint8Array based on two different ArrayBuffers\n *\n * @private\n * @param {ArrayBuffers} buffer1 The first buffer.\n * @param {ArrayBuffers} buffer2 The second buffer.\n * @return {ArrayBuffers} The new ArrayBuffer created out of the two.\n */\nfunction concat(buffer1: ArrayBuffer, buffer2: ArrayBuffer) {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength)\n tmp.set(new Uint8Array(buffer1), 0)\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength)\n return tmp\n}\n\ninterface ExecResult {\n exitCode: number\n fileContents: string\n stderr: string\n stdout: string\n}\n\n/**\n * Inner function to execute pg_dump\n */\nasync function execPgDump({\n pg,\n args,\n}: {\n pg: PGlite\n args: string[]\n}): Promise<ExecResult> {\n let pgdump_write, pgdump_read\n let exitStatus = 0\n let stderrOutput: string = ''\n let stdoutOutput: string = ''\n const emscriptenOpts: Partial<PgDumpMod> = {\n arguments: args,\n noExitRuntime: false,\n print: (text) => {\n stdoutOutput += text\n },\n printErr: (text) => {\n stderrOutput += text\n },\n onExit: (status: number) => {\n exitStatus = status\n },\n preRun: [\n (mod: PgDumpMod) => {\n mod.onRuntimeInitialized = () => {\n let bufferedBytes: Uint8Array = new Uint8Array()\n\n pgdump_write = mod.addFunction((ptr: any, length: number) => {\n let bytes\n try {\n bytes = mod.HEAPU8.subarray(ptr, ptr + length)\n } catch (e: any) {\n console.error('error', e)\n throw e\n }\n const currentResponse = pg.execProtocolRawSync(bytes)\n bufferedBytes = concat(bufferedBytes, currentResponse)\n return length\n }, 'iii')\n\n pgdump_read = mod.addFunction((ptr: any, max_length: number) => {\n let length = bufferedBytes.length\n if (length > max_length) {\n length = max_length\n }\n try {\n mod.HEAP8.set(bufferedBytes.subarray(0, length), ptr)\n } catch (e) {\n console.error(e)\n }\n bufferedBytes = bufferedBytes.subarray(length, bufferedBytes.length)\n return length\n }, 'iii')\n\n mod._set_read_write_cbs(pgdump_read, pgdump_write)\n // default $HOME in emscripten is /home/web_user\n mod.FS.chmod('/home/web_user/.pgpass', 0o0600) // https://www.postgresql.org/docs/current/libpq-pgpass.html\n }\n },\n ],\n }\n\n const mod = await PgDumpModFactory(emscriptenOpts)\n let fileContents = ''\n if (!exitStatus) {\n fileContents = mod.FS.readFile(dumpFilePath, { encoding: 'utf8' })\n }\n\n return {\n exitCode: exitStatus,\n fileContents,\n stderr: stderrOutput,\n stdout: stdoutOutput,\n }\n}\n\ninterface PgDumpOptions {\n pg: PGlite\n args?: string[]\n fileName?: string\n verbose?: boolean\n}\n\n/**\n * Execute pg_dump\n */\nexport async function pgDump({\n pg,\n args,\n fileName = 'dump.sql',\n}: PgDumpOptions) {\n const getSearchPath = await pg.query<{ search_path: string }>(\n 'SHOW SEARCH_PATH;',\n )\n const search_path = getSearchPath.rows[0].search_path\n\n const baseArgs = [\n '-U',\n 'postgres',\n '--inserts',\n '-j',\n '1',\n '-f',\n dumpFilePath,\n 'postgres',\n ]\n\n const execResult = await execPgDump({\n pg,\n args: [...(args ?? []), ...baseArgs],\n })\n\n pg.exec(`DEALLOCATE ALL; SET SEARCH_PATH = ${search_path}`)\n\n if (execResult.exitCode !== 0) {\n throw
|