Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
cd20be5
update submodule; improve CI
tdrz Nov 5, 2025
7556a66
update submodule
tdrz Nov 5, 2025
ab17e07
update submodule
tdrz Nov 6, 2025
2826cd9
merge main
tdrz Nov 6, 2025
a2788f7
pg_dump improvements; update submodule
tdrz Nov 10, 2025
e919f7b
update submodule
tdrz Nov 11, 2025
20cc911
cleanup
tdrz Nov 11, 2025
c28028a
update submodule
tdrz Nov 11, 2025
647b5c7
refactor
tdrz Nov 11, 2025
7c63bc7
Merge remote-tracking branch 'origin/main' into tdrz/libpglite
tdrz Nov 11, 2025
185f045
update submodule
tdrz Nov 11, 2025
41ad77e
update submodule
tdrz Nov 12, 2025
c68e149
update submodule
tdrz Nov 12, 2025
2f82930
update submodule
tdrz Nov 12, 2025
445c04d
do not automatically call main; refactorings
tdrz Nov 17, 2025
c064d18
more cleanup; update submodule
tdrz Nov 17, 2025
b6d3526
cleanup
tdrz Nov 17, 2025
abce644
moved env vars to module in TS
tdrz Nov 17, 2025
cb017cd
cleanup
tdrz Nov 17, 2025
93941a5
tests fix
tdrz Nov 17, 2025
7270d06
submodule
tdrz Nov 17, 2025
cd53ca2
more env vars
tdrz Nov 18, 2025
e90f375
rename pglite main to pgl_startup
tdrz Nov 18, 2025
86cee66
submodule
tdrz Nov 18, 2025
621480f
new initdb ts bindings
Nov 20, 2025
8f0f590
builds
Nov 20, 2025
61daf27
update submodule
Nov 20, 2025
282ed01
progress standalone initdb
Nov 21, 2025
4f8c453
popen implementation
tdrz Nov 21, 2025
ea299ba
bug fix
tdrz Nov 21, 2025
57d3d47
fgets
Nov 21, 2025
7b270f4
submodule
Nov 21, 2025
813a794
improvements to fgets
tdrz Nov 21, 2025
b79df1f
progress running inidb
tdrz Nov 24, 2025
dd84f56
pglite libc
tdrz Nov 24, 2025
62765f4
trying to redirect stdin/out/err
tdrz Nov 25, 2025
a9ea2bd
fgets handling for reading the stdout of program
tdrz Nov 25, 2025
ae86b8d
progress inidb
tdrz Nov 26, 2025
0bdebdd
progress
tdrz Nov 26, 2025
36d65e2
further progress but db initialization fails because of corrupted dat…
tdrz Nov 28, 2025
aa7e91e
more initdb
tdrz Dec 1, 2025
30e698f
no comment
tdrz Dec 1, 2025
a343f3a
rewrite stdin<->stdout wiring logic
Dec 2, 2025
a87129e
no comment
tdrz Dec 4, 2025
f59dc40
cleanup initdb.ts
tdrz Dec 5, 2025
b5c6103
simplifications
tdrz Dec 6, 2025
70c9834
initdb with exit 0 - I added some flags to postgresql when running in…
tdrz Dec 7, 2025
f870dda
backup
tdrz Jan 15, 2026
4878e60
something is working
tdrz Jan 15, 2026
19faaeb
cleanup
tdrz Jan 20, 2026
6efded3
improvements
tdrz Jan 20, 2026
3d5a5dd
simple queries work!
tdrz Jan 27, 2026
69f89db
update submodule
tdrz Jan 27, 2026
d8470bd
basic tests except ones with setjmp longjmp pass
tdrz Jan 27, 2026
4e61501
more tests passing; cleanup and improvements
tdrz Jan 28, 2026
83c2f0f
update submodule
tdrz Jan 28, 2026
4af1ec3
initdb: do not throw on error
tdrz Jan 28, 2026
520648d
update submodule
tdrz Jan 28, 2026
4b5fcf2
Merge branch 'main' into tdrz/simplifyinitdb
tdrz Jan 28, 2026
b47c71b
update docs
tdrz Jan 28, 2026
e1318fd
update submodule
tdrz Jan 28, 2026
dc5edeb
update submodule
tdrz Jan 28, 2026
b3d97be
update submodule
tdrz Jan 29, 2026
f8f592b
more tests passing
tdrz Jan 29, 2026
442d5ac
update submodule
tdrz Jan 29, 2026
6a576d5
amcheck test
tdrz Jan 30, 2026
dbad558
bloom filter test fix
tdrz Jan 30, 2026
171a18a
improvements, simplifications
tdrz Feb 6, 2026
6cef05f
update submodule
tdrz Feb 6, 2026
8efecd5
more tests passing
tdrz Feb 7, 2026
1bea40a
update submodule
tdrz Feb 7, 2026
b567660
simplifications
tdrz Feb 8, 2026
8e6c237
make sure to flush
tdrz Feb 8, 2026
5e64d85
more tests passing
tdrz Feb 8, 2026
c3ed483
update submodule
tdrz Feb 8, 2026
eff4fd6
add nodefs test that reuses an already populated directory on disk
tdrz Feb 9, 2026
44731b4
close pg before test ends
tdrz Feb 9, 2026
467eb33
pglite tests pass
tdrz Feb 10, 2026
4db4346
update submodule
tdrz Feb 10, 2026
f91814d
basic browser examples work
tdrz Feb 10, 2026
1ffa35e
repl fix
tdrz Feb 10, 2026
6c36e95
all? tests pass; refactorings; allow pipelining of commands;
tdrz Feb 24, 2026
6c629e8
style
tdrz Feb 24, 2026
9ea85fb
update submodule
tdrz Feb 24, 2026
fd0d641
Merge branch 'main' of github.com:electric-sql/pglite
tdrz Feb 24, 2026
fdf18fe
merge main
tdrz Feb 24, 2026
1a897dd
pglite-socket simplifications
tdrz Feb 24, 2026
ae28531
update CI to use pglite-inidb artifacts
tdrz Feb 24, 2026
ae7143a
style
tdrz Feb 24, 2026
02c551c
deno tests fixes
tdrz Feb 24, 2026
621a382
fix pg_dump
tdrz Feb 25, 2026
bb45f50
update submodule
tdrz Feb 25, 2026
2178c82
simplifications
tdrz Feb 25, 2026
489f457
polyfill for react tests when usin jsdom
tdrz Feb 25, 2026
5fb5c1b
same polyfill for vitest
tdrz Feb 25, 2026
4a8dcbf
sorting
tdrz Feb 26, 2026
5ee5c25
exclude unsuported modules
tdrz Feb 26, 2026
6300f9f
cleanup
tdrz Feb 26, 2026
2d7ebc5
style
tdrz Feb 26, 2026
5cb4af3
update submodule
tdrz Mar 2, 2026
837b185
update submodule
tdrz Mar 2, 2026
7c2b455
update submodule
tdrz Mar 2, 2026
aef6e2c
update submodule
tdrz Mar 2, 2026
214f536
update submodule
Mar 9, 2026
b427abb
merge main
tdrz Mar 10, 2026
473d192
update submodule
tdrz Mar 10, 2026
6e26838
converted argsParser to typescript
tdrz Mar 10, 2026
91fdabc
cleanup
tdrz Mar 10, 2026
2b263ea
moved initdb out of its own package to pglite main package
tdrz Mar 10, 2026
de4dc24
Update packages/pglite/src/pglite.ts
tdrz Mar 10, 2026
7c74575
changes after code review
tdrz Mar 10, 2026
dd22b0a
Merge branch 'tdrz/simplifyinitdb' of github.com:electric-sql/pglite …
tdrz Mar 10, 2026
c824f29
cleanup
tdrz Mar 10, 2026
48e5051
comments
tdrz Mar 10, 2026
9955b01
simplifications, comments
tdrz Mar 10, 2026
4698871
simplifications; allow passing of parameters on startup
tdrz Mar 11, 2026
4406ff7
cleanup
tdrz Mar 11, 2026
afd653e
use postgres as default database
tdrz Mar 11, 2026
366bcc5
remove specifying database to dump because it doesnt actually work
tdrz Mar 11, 2026
1869fef
cleanup
tdrz Mar 11, 2026
f2f6437
fix gh comments
tdrz Mar 12, 2026
659937d
refactoring
tdrz Mar 12, 2026
ad4c261
try not flushing after query
tdrz Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ jobs:
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: '- PGlite:'
body-includes: '- PGlite with node'

- name: Create or update build outputs comment
uses: peter-evans/create-or-update-comment@v4
Expand All @@ -175,7 +175,7 @@ jobs:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
- PGlite: ${{ steps.upload-pglite-package.outputs.artifact-url }}
- PGlite with node v${{ matrix.node }}: ${{ steps.upload-pglite-package.outputs.artifact-url }}
edit-mode: append

build-and-test-pglite-dependents:
Expand Down Expand Up @@ -204,7 +204,7 @@ jobs:
with:
name: pglite-tools-release-files-node-v20.x
path: ./packages/pglite-tools/release/

- name: Install dependencies
run: pnpm install --frozen-lockfile

Expand Down Expand Up @@ -252,7 +252,7 @@ jobs:
uses: actions/download-artifact@v4
with:
name: pglite-tools-release-files-node-v20.x
path: ./packages/pglite-tools/release
path: ./packages/pglite-tools/release

- name: Download PGlite build artifacts
uses: actions/download-artifact@v4
Expand Down Expand Up @@ -313,7 +313,7 @@ jobs:
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Built bundles
body-includes: "- Demos:"

- name: Create or update build outputs comment
uses: peter-evans/create-or-update-comment@v4
Expand Down
6 changes: 3 additions & 3 deletions docs/extensions/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,18 +84,18 @@ $ git checkout -b myghname/myawesomeextension
PGlite's backend code is in the repo [postgres-pglite](https://github.com/electric-sql/postgres-pglite) and is downloaded as a submodule dependency of the main repo. You will add your extension's code as a new submodule dependency:

```
$ cd postgres-pglite/pglite
$ cd postgres-pglite/pglite/other_extensions
$ git submodule add <myawesomeextension_url>
```

This **should** create a new folder `postgres-pglite/pglite/myawesomeextension` where the extension code has been downloaded. Check it:
This **should** create a new folder `postgres-pglite/pglite/other_extensions/myawesomeextension` where the extension code has been downloaded. Check it:

```
$ ls -lah myawesomeextension
<the extension files should be listed here>
```

Now append the **folder name** to `SUBDIRS` inside `postgres-pglite/pglite/Makefile`:
Now append the **folder name** to `SUBDIRS` inside `postgres-pglite/pglite/other_extensions/Makefile`:

```
SUBDIRS = \
Expand Down
2 changes: 1 addition & 1 deletion docs/repl/allExtensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export { ltree } from '@electric-sql/pglite/contrib/ltree'
export { pageinspect } from '@electric-sql/pglite/contrib/pageinspect'
export { pg_buffercache } from '@electric-sql/pglite/contrib/pg_buffercache'
export { pg_freespacemap } from '@electric-sql/pglite/contrib/pg_freespacemap'
export { pg_hashids } from '@electric-sql/pglite/pg_hashids'
export { pg_surgery } from '@electric-sql/pglite/contrib/pg_surgery'
export { pg_trgm } from '@electric-sql/pglite/contrib/pg_trgm'
export { pg_uuidv7 } from '@electric-sql/pglite/pg_uuidv7'
Expand All @@ -33,5 +34,4 @@ export { tsm_system_time } from '@electric-sql/pglite/contrib/tsm_system_time'
export { unaccent } from '@electric-sql/pglite/contrib/unaccent'
export { uuid_ossp } from '@electric-sql/pglite/contrib/uuid_ossp'
export { vector } from '@electric-sql/pglite/vector'
export { pg_hashids } from '@electric-sql/pglite/pg_hashids'
export { age } from '@electric-sql/pglite/age'
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
"ci:publish": "pnpm changeset publish",
"ts:build": "pnpm -r --filter \"./packages/**\" build",
"ts:build:debug": "DEBUG=true pnpm ts:build",
"wasm:copy-initdb": "mkdir -p ./packages/pglite/release && cp ./postgres-pglite/dist/bin/initdb.* ./packages/pglite/release",
"wasm:copy-pgdump": "mkdir -p ./packages/pglite-tools/release && cp ./postgres-pglite/dist/bin/pg_dump.* ./packages/pglite-tools/release",
"wasm:copy-pglite": "mkdir -p ./packages/pglite/release/ && cp ./postgres-pglite/dist/bin/pglite.* ./packages/pglite/release/ && cp ./postgres-pglite/dist/extensions/*.tar.gz ./packages/pglite/release/",
"wasm:build": "cd postgres-pglite && ./build-with-docker.sh && cd .. && pnpm wasm:copy-pglite && pnpm wasm:copy-pgdump",
"wasm:build": "cd postgres-pglite && ./build-with-docker.sh && cd .. && pnpm wasm:copy-pglite && pnpm wasm:copy-pgdump && pnpm wasm:copy-initdb",
"wasm:build:debug": "DEBUG=true pnpm wasm:build",
"build:all": "pnpm wasm:build && pnpm ts:build",
"build:all:debug": "DEBUG=true pnpm build:all"
Expand Down
13 changes: 13 additions & 0 deletions packages/pglite-react/test-setup.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
import { afterEach } from 'vitest'
import { cleanup } from '@testing-library/react'

// Polyfill File.prototype.arrayBuffer for jsdom
// jsdom's File implementation doesn't properly support arrayBuffer()
if (typeof File !== 'undefined' && !File.prototype.arrayBuffer) {
File.prototype.arrayBuffer = function () {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.onload = () => resolve(reader.result as ArrayBuffer)
reader.onerror = () => reject(reader.error)
reader.readAsArrayBuffer(this)
})
}
}

// https://testing-library.com/docs/react-testing-library/api#cleanup
afterEach(() => cleanup())
16 changes: 9 additions & 7 deletions packages/pglite-socket/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,21 +93,23 @@ class QueryQueueManager {
`processing query from handler #${query.handlerId} (waited ${waitTime}ms)`,
)

let result
try {
// Execute the query with exclusive access to PGlite
const result = await this.db.runExclusive(async () => {
result = await this.db.runExclusive(async () => {
return await this.db.execProtocolRaw(query.message)
})

this.log(
`query from handler #${query.handlerId} completed, ${result.length} bytes`,
)
this.lastHandlerId = query.handlerId
query.resolve(result)
} catch (error) {
this.log(`query from handler #${query.handlerId} failed:`, error)
query.reject(error as Error)
return
}

this.log(
`query from handler #${query.handlerId} completed, ${result.length} bytes`,
)
this.lastHandlerId = query.handlerId
query.resolve(result)
}

this.processing = false
Expand Down
Empty file modified packages/pglite-socket/src/scripts/server.ts
100644 → 100755
Empty file.
4 changes: 2 additions & 2 deletions packages/pglite-tools/src/pgDumpModFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@ export interface PgDumpMod
FS: FS
WASM_PREFIX: string
INITIAL_MEMORY: number
_set_read_write_cbs: (read_cb: number, write_cb: number) => void
_pgl_set_rw_cbs: (read_cb: number, write_cb: number) => void
addFunction: (
cb: (ptr: any, length: number) => void,
signature: string,
) => number
removeFunction: (f: number) => void
_main: (args: string[]) => number
onExit: (status: number) => void
print: (test: string) => void
printErr: (text: string) => void
callMain: (args?: string[]) => number
}

type PgDumpFactory<T extends PgDumpMod = PgDumpMod> = (
Expand Down
36 changes: 26 additions & 10 deletions packages/pglite-tools/src/pg_dump.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,10 @@ async function execPgDump({
args: string[]
}): Promise<ExecResult> {
let pgdump_write, pgdump_read
let exitStatus = 0
let exitCode = 0
let stderrOutput: string = ''
let stdoutOutput: string = ''
const emscriptenOpts: Partial<PgDumpMod> = {
arguments: args,
noExitRuntime: false,
print: (text) => {
stdoutOutput += text
Expand All @@ -49,7 +48,7 @@ async function execPgDump({
stderrOutput += text
},
onExit: (status: number) => {
exitStatus = status
exitCode = status
},
preRun: [
(mod: PgDumpMod) => {
Expand Down Expand Up @@ -83,7 +82,8 @@ async function execPgDump({
return length
}, 'iii')

mod._set_read_write_cbs(pgdump_read, pgdump_write)
mod._pgl_set_rw_cbs(pgdump_read, pgdump_write)

// default $HOME in emscripten is /home/web_user
mod.FS.chmod('/home/web_user/.pgpass', 0o0600) // https://www.postgresql.org/docs/current/libpq-pgpass.html
}
Expand All @@ -92,13 +92,14 @@ async function execPgDump({
}

const mod = await PgDumpModFactory(emscriptenOpts)
mod.callMain(args)
let fileContents = ''
if (!exitStatus) {
if (!exitCode) {
fileContents = mod.FS.readFile(dumpFilePath, { encoding: 'utf8' })
}

return {
exitCode: exitStatus,
exitCode,
fileContents,
stderr: stderrOutput,
stdout: stdoutOutput,
Expand All @@ -108,12 +109,17 @@ async function execPgDump({
interface PgDumpOptions {
pg: PGlite
args?: string[]
database?: string
fileName?: string
verbose?: boolean
}

/**
* Execute pg_dump
* @param pg - The PGlite instance
* @param args - The arguments to pass to pg_dump
* @param fileName - The name of the file to write the dump to (dump.sql by default)
* @returns The file containing the dump
*/
export async function pgDump({
pg,
Expand All @@ -123,25 +129,35 @@ export async function pgDump({
const getSearchPath = await pg.query<{ search_path: string }>(
'SHOW SEARCH_PATH;',
)
const search_path = getSearchPath.rows[0].search_path
const searchPath = getSearchPath.rows[0].search_path

const baseArgs = [
'-U',
'postgres',
'web_user',
'--inserts',
'-j',
'1',
'-f',
dumpFilePath,
'postgres',
]

const execResult = await execPgDump({
pg,
args: [...(args ?? []), ...baseArgs],
})

pg.exec(`DEALLOCATE ALL; SET SEARCH_PATH = ${search_path}`)
await pg.exec(`DEALLOCATE ALL`)
await pg.exec(`SET SEARCH_PATH = ${searchPath}`)
const newSearchPath = await pg.query<{ search_path: string }>(
'SHOW SEARCH_PATH;',
)
if (newSearchPath.rows[0].search_path !== searchPath) {
console.warn(
`Warning: search_path has been changed from ${searchPath} to ${newSearchPath}`,
searchPath,
newSearchPath,
)
}

if (execResult.exitCode !== 0) {
throw new Error(
Expand Down
13 changes: 13 additions & 0 deletions packages/pglite-vue/test-setup.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
import { install } from 'vue-demi'

// Polyfill File.prototype.arrayBuffer for jsdom
// jsdom's File implementation doesn't properly support arrayBuffer()
if (typeof File !== 'undefined' && !File.prototype.arrayBuffer) {
File.prototype.arrayBuffer = function () {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.onload = () => resolve(reader.result as ArrayBuffer)
reader.onerror = () => reject(reader.error)
reader.readAsArrayBuffer(this)
})
}
}

install()
2 changes: 1 addition & 1 deletion packages/pglite/examples/basic.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ <h1>PGlite Basic Example</h1>
console.log('Starting...')

// In-memory database:
const pg = new PGlite()
const pg = await PGlite.create()
// Or, stored in indexedDB:
// const pg = new PGlite('pgdata');

Expand Down
17 changes: 16 additions & 1 deletion packages/pglite/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,22 @@
"type": "module",
"types": "dist/index.d.ts",
"files": [
"dist"
"dist",
"!dist/auth_delay.tar.gz",
"!dist/basebackup_to_shell.tar.gz",
"!dist/basic_archive.tar.gz",
"!dist/dblink.tar.gz",
"!dist/intagg.tar.gz",
"!dist/oid2name.tar.gz",
"!dist/pg_prewarm.tar.gz",
"!dist/pg_stat_statements.tar.gz",
"!dist/pglite.html",
"!dist/pgrowlocks.tar.gz",
"!dist/pgstattuple.tar.gz",
"!dist/spi.tar.gz",
"!dist/test_decoding.tar.gz",
"!dist/vacuumlo.tar.gz",
"!dist/xml2.tar.gz"
],
"repository": {
"type": "git",
Expand Down
Loading
Loading