From 393709809997a8bf2b997bcf6dee14e03ed06508 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 10:08:33 +0100 Subject: [PATCH 01/33] try again pgcrypto on CI --- docs/extensions/extensions.data.ts | 14 +++ docs/repl/allExtensions.ts | 5 +- packages/pglite/src/contrib/pgcrypto.ts | 16 +++ .../pglite/tests/contrib/pgcrypto.test.js | 115 ++++++++++++++++++ postgres-pglite | 2 +- 5 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 packages/pglite/src/contrib/pgcrypto.ts create mode 100644 packages/pglite/tests/contrib/pgcrypto.test.js diff --git a/docs/extensions/extensions.data.ts b/docs/extensions/extensions.data.ts index de0fde1c5..2dd0e1220 100644 --- a/docs/extensions/extensions.data.ts +++ b/docs/extensions/extensions.data.ts @@ -545,6 +545,20 @@ const baseExtensions: Extension[] = [ importName: 'pg_ivm', size: 24865, }, + { + name: 'pgcrypto', + description: ` + The pgcrypto module provides cryptographic functions for PostgreSQL. + `, + shortDescription: + 'The pgcrypto module provides cryptographic functions for PostgreSQL.', + docs: 'https://www.postgresql.org/docs/current/pgcrypto.html', + tags: ['postgres extension', 'postgres/contrib'], + importPath: '@electric-sql/pglite/contrib/pgcrypto', + importName: 'pgcrypto', + core: true, + size: 1004373, + }, ] const tags = [ diff --git a/docs/repl/allExtensions.ts b/docs/repl/allExtensions.ts index 1cfb1a674..b69f48a02 100644 --- a/docs/repl/allExtensions.ts +++ b/docs/repl/allExtensions.ts @@ -20,10 +20,11 @@ export { pg_buffercache } from '@electric-sql/pglite/contrib/pg_buffercache' export { pg_freespacemap } from '@electric-sql/pglite/contrib/pg_freespacemap' 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' export { pg_visibility } from '@electric-sql/pglite/contrib/pg_visibility' export { pg_walinspect } from '@electric-sql/pglite/contrib/pg_walinspect' +export { pgcrypto } from '@electric-sql/pglite/contrib/pgcrypto' export { pgtap } from '@electric-sql/pglite/pgtap' -export { pg_uuidv7 } from '@electric-sql/pglite/pg_uuidv7' export { seg } from '@electric-sql/pglite/contrib/seg' export { tablefunc } from '@electric-sql/pglite/contrib/tablefunc' export { tcn } from '@electric-sql/pglite/contrib/tcn' @@ -31,4 +32,4 @@ export { tsm_system_rows } from '@electric-sql/pglite/contrib/tsm_system_rows' 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 { vector } from '@electric-sql/pglite/vector' \ No newline at end of file diff --git a/packages/pglite/src/contrib/pgcrypto.ts b/packages/pglite/src/contrib/pgcrypto.ts new file mode 100644 index 000000000..fc4ffeba3 --- /dev/null +++ b/packages/pglite/src/contrib/pgcrypto.ts @@ -0,0 +1,16 @@ +import type { + Extension, + ExtensionSetupResult, + PGliteInterface, +} from '../interface' + +const setup = async (_pg: PGliteInterface, _emscriptenOpts: any) => { + return { + bundlePath: new URL('../../release/pgcrypto.tar.gz', import.meta.url), + } satisfies ExtensionSetupResult +} + +export const pgcrypto = { + name: 'pgcrypto', + setup, +} satisfies Extension \ No newline at end of file diff --git a/packages/pglite/tests/contrib/pgcrypto.test.js b/packages/pglite/tests/contrib/pgcrypto.test.js new file mode 100644 index 000000000..caa40c8f0 --- /dev/null +++ b/packages/pglite/tests/contrib/pgcrypto.test.js @@ -0,0 +1,115 @@ +import { describe, it, expect } from 'vitest' +import { PGlite } from '../../dist/index.js' +import { pgcrypto } from '../../dist/contrib/pgcrypto.js' +import * as openpgp from 'openpgp' + +describe('pg_pgcryptotrgm', () => { + it('digest', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query( + "SELECT encode(digest(convert_to('test', 'UTF8'), 'sha1'), 'hex') as value;", + ) + expect(res.rows[0].value, 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3') + }) + + it('hmac', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query( + "SELECT encode(hmac(convert_to('test', 'UTF8'), convert_to('key', 'UTF8'), 'sha1'), 'hex') as value;", + ) + expect(res.rows[0].value).toEqual( + '671f54ce0c540f78ffe1e26dcf9c2a047aea4fda', + ) + }) + + it('crypt', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query("SELECT crypt('test', gen_salt('bf')) as value;") + expect(res.rows[0].value.length).toEqual(60) + }) + + it('gen_salt', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query("SELECT gen_salt('bf') as value;") + expect(res.rows[0].value.length).toEqual(29) + }) + + it('pgp_sym_encrypt and pgp_sym_decrypt', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query( + "SELECT pgp_sym_encrypt('test', 'key') as value;", + ) + const encrypted = res.rows[0].value + + const res2 = await pg.query("SELECT pgp_sym_decrypt($1, 'key') as value;", [ + encrypted, + ]) + expect(res2.rows[0].value).toEqual('test') + }) + + it('pgp_pub_encrypt and pgp_pub_decrypt', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const { privateKey, publicKey } = await openpgp.generateKey({ + type: 'rsa', + rsaBits: 2048, + userIDs: [{ name: 'PGlite', email: 'hello@pglite.dev' }], + passphrase: '', + }) + + const toEncrypt = 'PGlite@$#%!^$&*WQFgjqPkVERewfreg094340f1012-=' + + const e2 = await pg.exec( + ` +WITH encrypted AS ( + SELECT pgp_pub_encrypt('${toEncrypt}', dearmor('${publicKey}')) AS encrypted +) +SELECT + pgp_pub_decrypt(encrypted, dearmor('${privateKey}')) as decrypted_output +FROM encrypted; +`, + ) + expect(e2[0].rows[0].decrypted_output, toEncrypt) + }) +}) \ No newline at end of file diff --git a/postgres-pglite b/postgres-pglite index 1195d5388..da9387504 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 1195d5388bd5529e0013c45fa816cfcd953d84e0 +Subproject commit da9387504aceb4caa41279b7eb5635ee3046f7e6 From 8f53e175b12004fa852d0e922a832e5b7e2f6e1a Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 10:10:46 +0100 Subject: [PATCH 02/33] add openpgp --- packages/pglite/package.json | 1 + pnpm-lock.yaml | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/pglite/package.json b/packages/pglite/package.json index 8d7b326bd..f66ceae43 100644 --- a/packages/pglite/package.json +++ b/packages/pglite/package.json @@ -178,6 +178,7 @@ "bun": "^1.1.30", "concurrently": "^8.2.2", "http-server": "^14.1.1", + "openpgp": "^6.3.0", "playwright": "^1.48.0", "tinytar": "^0.1.0", "vitest": "^2.1.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4fe1e8540..1693c8901 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,6 +189,9 @@ importers: http-server: specifier: ^14.1.1 version: 14.1.1 + openpgp: + specifier: ^6.3.0 + version: 6.3.0 playwright: specifier: ^1.48.0 version: 1.48.0 @@ -3384,6 +3387,10 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + openpgp@6.3.0: + resolution: {integrity: sha512-pLzCU8IgyKXPSO11eeharQkQ4GzOKNWhXq79pQarIRZEMt1/ssyr+MIuWBv1mNoenJLg04gvPx+fi4gcKZ4bag==} + engines: {node: '>= 18.0.0'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -8008,6 +8015,8 @@ snapshots: opener@1.5.2: {} + openpgp@6.3.0: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 From fc162f2d3198c01b15512340dc8f1ca1c3b82c67 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 10:19:10 +0100 Subject: [PATCH 03/33] style --- docs/repl/allExtensions.ts | 2 +- packages/pglite/src/contrib/pgcrypto.ts | 2 +- packages/pglite/tests/contrib/pgcrypto.test.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/repl/allExtensions.ts b/docs/repl/allExtensions.ts index b69f48a02..8c6c37966 100644 --- a/docs/repl/allExtensions.ts +++ b/docs/repl/allExtensions.ts @@ -32,4 +32,4 @@ export { tsm_system_rows } from '@electric-sql/pglite/contrib/tsm_system_rows' 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' \ No newline at end of file +export { vector } from '@electric-sql/pglite/vector' diff --git a/packages/pglite/src/contrib/pgcrypto.ts b/packages/pglite/src/contrib/pgcrypto.ts index fc4ffeba3..063d87dfc 100644 --- a/packages/pglite/src/contrib/pgcrypto.ts +++ b/packages/pglite/src/contrib/pgcrypto.ts @@ -13,4 +13,4 @@ const setup = async (_pg: PGliteInterface, _emscriptenOpts: any) => { export const pgcrypto = { name: 'pgcrypto', setup, -} satisfies Extension \ No newline at end of file +} satisfies Extension diff --git a/packages/pglite/tests/contrib/pgcrypto.test.js b/packages/pglite/tests/contrib/pgcrypto.test.js index caa40c8f0..e286df47c 100644 --- a/packages/pglite/tests/contrib/pgcrypto.test.js +++ b/packages/pglite/tests/contrib/pgcrypto.test.js @@ -112,4 +112,4 @@ FROM encrypted; ) expect(e2[0].rows[0].decrypted_output, toEncrypt) }) -}) \ No newline at end of file +}) From a99c2738499251e60377037a205031c032dc8959 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 10:36:53 +0100 Subject: [PATCH 04/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index da9387504..8ca114222 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit da9387504aceb4caa41279b7eb5635ee3046f7e6 +Subproject commit 8ca11422280035381bfb92bb13723899e5fdc715 From 35e2bc0334177f68a4824165c0f609950630f114 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 11:05:53 +0100 Subject: [PATCH 05/33] udpate submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 8ca114222..41b92387c 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 8ca11422280035381bfb92bb13723899e5fdc715 +Subproject commit 41b92387c2ee8a7e7b6820b004958b17c242f78e From a7d7ce04784c1bd33455835525bf51ea6a2cd31e Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 11:24:43 +0100 Subject: [PATCH 06/33] print error messages on pglite socket test --- packages/pglite-socket/tests/server.test.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/pglite-socket/tests/server.test.ts b/packages/pglite-socket/tests/server.test.ts index 4953b7ece..8c5a5d725 100644 --- a/packages/pglite-socket/tests/server.test.ts +++ b/packages/pglite-socket/tests/server.test.ts @@ -49,6 +49,10 @@ describe('Server Script Tests', () => { output += data.toString() }) + serverProcess.stderr?.on('data', (data) => { + console.error(data.toString()) + }) + await new Promise((resolve) => { serverProcess.on('exit', (code) => { expect(code).toBe(0) @@ -78,6 +82,10 @@ describe('Server Script Tests', () => { output += data.toString() }) + serverProcess.stderr?.on('data', (data) => { + console.error(data.toString()) + }) + // Wait for server to start await waitForPort(testPort) @@ -126,6 +134,10 @@ describe('Server Script Tests', () => { output += data.toString() }) + serverProcess.stderr?.on('data', (data) => { + console.error(data.toString()) + }) + // Wait for server to be ready const isReady = await waitForPort(testPort) expect(isReady).toBe(true) @@ -159,6 +171,10 @@ describe('Server Script Tests', () => { output += data.toString() }) + serverProcess.stderr?.on('data', (data) => { + console.error(data.toString()) + }) + const isReady = await waitForPort(testPort) expect(isReady).toBe(true) expect(output).toContain('Initializing PGLite with database: memory://') @@ -198,6 +214,10 @@ describe('Server Script Tests', () => { output += data.toString() }) + serverProcess.stderr?.on('data', (data) => { + console.error(data.toString()) + }) + const isReady = await waitForPort(testPort) expect(isReady).toBe(true) serverProcess.kill() From 7cb160f56708e8d844b2664153741fbda3086aa3 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 11:37:46 +0100 Subject: [PATCH 07/33] CI: do not fail fast --- .github/workflows/build_and_test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 3a18acca4..4342b1b13 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -89,7 +89,8 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, 22.x, 23.x, 24.x] + node: [20.x, 21.x, 22.x, 23.x, 24.x] + fail-fast: false defaults: run: working-directory: ./packages/pglite @@ -183,6 +184,7 @@ jobs: strategy: matrix: node: [20.x, 21.x, 22.x, 23.x, 24.x] + fail-fast: false needs: [build-and-test-pglite] steps: - uses: actions/checkout@v4 From 43c508518af157fddd2b0fa17c677d47041c5074 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 11:44:43 +0100 Subject: [PATCH 08/33] test using node v22.20.0 --- .github/workflows/build_and_test.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 4342b1b13..60c883426 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -89,7 +89,7 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, 22.x, 23.x, 24.x] + node: [20.x, 21.x, v22.20.0, 23.x, 24.x] fail-fast: false defaults: run: @@ -106,6 +106,9 @@ jobs: - uses: denoland/setup-deno@v1 with: deno-version: vx.x.x + + - name: Show node version + run: node -v - name: Download PGlite WASM build artifacts uses: actions/download-artifact@v4 @@ -183,7 +186,7 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, 22.x, 23.x, 24.x] + node: [20.x, 21.x, v22.20.0, 23.x, 24.x] fail-fast: false needs: [build-and-test-pglite] steps: From de9dcca675fb33c9dad16d622ac5795bc38f888b Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 11:45:15 +0100 Subject: [PATCH 09/33] test using node v22.20.0 --- .github/workflows/build_and_test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 60c883426..8a6a46bcd 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -197,6 +197,9 @@ jobs: node-version: ${{ matrix.node }} cache: pnpm + - name: Show node version + run: node -v + - name: Download PGlite build artifacts uses: actions/download-artifact@v4 with: From c4866b4e25b8d2ef7619dbc905ffd14141ac36b3 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 12:28:36 +0100 Subject: [PATCH 10/33] update submodule; disable pgcrypto test --- .../contrib/{pgcrypto.test.js => pgcrypto.disabled-test.js} | 0 postgres-pglite | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/pglite/tests/contrib/{pgcrypto.test.js => pgcrypto.disabled-test.js} (100%) diff --git a/packages/pglite/tests/contrib/pgcrypto.test.js b/packages/pglite/tests/contrib/pgcrypto.disabled-test.js similarity index 100% rename from packages/pglite/tests/contrib/pgcrypto.test.js rename to packages/pglite/tests/contrib/pgcrypto.disabled-test.js diff --git a/postgres-pglite b/postgres-pglite index 41b92387c..b5bc713db 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 41b92387c2ee8a7e7b6820b004958b17c242f78e +Subproject commit b5bc713dbf02c6e7ff0c6eadf4fb1aaebca1960d From 11d05fe2481be0c0b93f6e35a4a93767af8a8b6d Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 13:51:57 +0100 Subject: [PATCH 11/33] readd pgcrypto test --- .../contrib/{pgcrypto.disabled-test.js => pgcrypto.test.js} | 0 postgres-pglite | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/pglite/tests/contrib/{pgcrypto.disabled-test.js => pgcrypto.test.js} (100%) diff --git a/packages/pglite/tests/contrib/pgcrypto.disabled-test.js b/packages/pglite/tests/contrib/pgcrypto.test.js similarity index 100% rename from packages/pglite/tests/contrib/pgcrypto.disabled-test.js rename to packages/pglite/tests/contrib/pgcrypto.test.js diff --git a/postgres-pglite b/postgres-pglite index b5bc713db..804f5f378 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit b5bc713dbf02c6e7ff0c6eadf4fb1aaebca1960d +Subproject commit 804f5f378c5fda1c5a28c25609a812264880cd93 From 4fdd2849cf21b0baa3e15b085ec9629deeba4373 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 14:46:04 +0100 Subject: [PATCH 12/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 804f5f378..abef27f86 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 804f5f378c5fda1c5a28c25609a812264880cd93 +Subproject commit abef27f86476050e6a0882fadfbb26a9c1d3bdb3 From 98340f2011dff2aa9e6a89a9d443adab581c6bd6 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 14:57:46 +0100 Subject: [PATCH 13/33] try to identify what function call is missing --- .github/workflows/build_and_test.yml | 37 +++++++++++++++------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 8a6a46bcd..847240fff 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -61,12 +61,12 @@ jobs: run: | pnpm build:all - - name: Typecheck pglite - working-directory: ${{ github.workspace }}/packages/pglite - run: pnpm typecheck - - name: Test pglite - working-directory: ${{ github.workspace }}/packages/pglite - run: pnpm test + # - name: Typecheck pglite + # working-directory: ${{ github.workspace }}/packages/pglite + # run: pnpm typecheck + # - name: Test pglite + # working-directory: ${{ github.workspace }}/packages/pglite + # run: pnpm test - name: Upload PGlite Interim to Github artifacts id: upload-pglite-interim-build-files @@ -136,15 +136,15 @@ jobs: - name: Build run: pnpm build - - name: Test web integrations - # retry on failure as web tests can be flaky - run: pnpm test:web || pnpm test:web || pnpm test:web + # - name: Test web integrations + # # retry on failure as web tests can be flaky + # run: pnpm test:web || pnpm test:web || pnpm test:web - - name: Test Deno - run: pnpm test:deno + # - name: Test Deno + # run: pnpm test:deno - - name: Pack for distribution - run: pnpm pack + # - name: Pack for distribution + # run: pnpm pack - name: Upload PGlite distribution artifact id: upload-pglite-dist @@ -221,11 +221,14 @@ jobs: - name: Build packages run: pnpm --filter="...^pglite" build - - name: Typecheck packages - run: pnpm --filter="...^pglite" typecheck + # - name: Typecheck packages + # run: pnpm --filter="...^pglite" typecheck + + # - name: Test packages + # run: pnpm --filter="...^pglite" test - - name: Test packages - run: pnpm --filter="...^pglite" test + - name: Test pglite-socket + run: pnpm -C packages/pglite-socket/ test - name: Upload pglite-tools distribution artifact id: upload-pglite-tools-dist From d8142088f2c405c232a25aaf6a97ac335836eed8 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 15:12:44 +0100 Subject: [PATCH 14/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index abef27f86..70845fe37 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit abef27f86476050e6a0882fadfbb26a9c1d3bdb3 +Subproject commit 70845fe3769f3986499397ffaba632e7f36024ff From f648ebca8d64816d50ff41cf500c6fa2b5afdc01 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 15:27:49 +0100 Subject: [PATCH 15/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 70845fe37..a16b7149b 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 70845fe3769f3986499397ffaba632e7f36024ff +Subproject commit a16b7149bed05342d665525dd2449ce676395bea From c3d349a07f75ac0fbd06f3c495adcd7a212c1c9a Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 15:39:17 +0100 Subject: [PATCH 16/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index a16b7149b..e03679165 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit a16b7149bed05342d665525dd2449ce676395bea +Subproject commit e03679165bf977a0b7a27373699c651e84c8e0ef From 088c7ea84a0ca8a2a74ec6636dfea51075167180 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 18:39:12 +0100 Subject: [PATCH 17/33] trying to find missing symbol --- packages/pglite/src/pglite.ts | 12 ++++++++++++ packages/pglite/src/postgresMod.ts | 1 + postgres-pglite | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/pglite/src/pglite.ts b/packages/pglite/src/pglite.ts index c0da6cba8..17326f9e3 100644 --- a/packages/pglite/src/pglite.ts +++ b/packages/pglite/src/pglite.ts @@ -386,6 +386,18 @@ export class PGlite // Load the database engine this.mod = await PostgresModFactory(emscriptenOpts) + // experiment on wasmTable get + const prevGet = this.mod.wasmTable.get + this.mod.wasmTable.get = (index: number) => { + const result = prevGet.call(this.mod!.wasmTable, index); + if (!result) { + console.error('pglite: function index not found in wasmTable', index) + throw `pglite: function index not found in wasmTable ${index}` + // search the js.symbols file for index + } + return result + } + // set the write callback this.#pglite_write = this.mod.addFunction((ptr: any, length: number) => { let bytes diff --git a/packages/pglite/src/postgresMod.ts b/packages/pglite/src/postgresMod.ts index 2a3e8ee1e..1535b9290 100644 --- a/packages/pglite/src/postgresMod.ts +++ b/packages/pglite/src/postgresMod.ts @@ -16,6 +16,7 @@ export type FS = typeof FS & { export interface PostgresMod extends Omit { + wasmTable: WebAssembly.Table preInit: Array<{ (mod: PostgresMod): void }> preRun: Array<{ (mod: PostgresMod): void }> postRun: Array<{ (mod: PostgresMod): void }> diff --git a/postgres-pglite b/postgres-pglite index e03679165..af0cb762c 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit e03679165bf977a0b7a27373699c651e84c8e0ef +Subproject commit af0cb762cc2882b133188c2c1ae38dda62b2b615 From 45d70059c42c38547413f3b96ef1a4a77deb808c Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 19:02:00 +0100 Subject: [PATCH 18/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index af0cb762c..740a38490 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit af0cb762cc2882b133188c2c1ae38dda62b2b615 +Subproject commit 740a38490c413acc62629086c493fb23ef27cf00 From 986e954f6927a6a72c354929b8fa813da6d6c8a2 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 19:17:38 +0100 Subject: [PATCH 19/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 740a38490..31e629368 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 740a38490c413acc62629086c493fb23ef27cf00 +Subproject commit 31e629368c792e87131d6af5288514a98d24a45e From 21804b967f133aacda25c55c1cf6fa85a7bdcc4d Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 19:23:00 +0100 Subject: [PATCH 20/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 31e629368..e99177dab 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 31e629368c792e87131d6af5288514a98d24a45e +Subproject commit e99177dab7dd8dfd6aa0b014081693db77c5ab28 From d46771d84c58fa0e45801dcd3b3eb4d35fb26153 Mon Sep 17 00:00:00 2001 From: tudor Date: Thu, 11 Dec 2025 21:40:43 +0100 Subject: [PATCH 21/33] remove removeFunction calls on pglite end --- packages/pglite/src/pglite.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/pglite/src/pglite.ts b/packages/pglite/src/pglite.ts index 17326f9e3..c479728e7 100644 --- a/packages/pglite/src/pglite.ts +++ b/packages/pglite/src/pglite.ts @@ -392,7 +392,7 @@ export class PGlite const result = prevGet.call(this.mod!.wasmTable, index); if (!result) { console.error('pglite: function index not found in wasmTable', index) - throw `pglite: function index not found in wasmTable ${index}` + // throw `pglite: function index not found in wasmTable ${index}` // search the js.symbols file for index } return result @@ -586,10 +586,10 @@ export class PGlite // Close the database try { + // this.mod!.removeFunction(this.#pglite_read) + // this.mod!.removeFunction(this.#pglite_write) await this.execProtocol(serialize.end()) this.mod!._pgl_shutdown() - this.mod!.removeFunction(this.#pglite_read) - this.mod!.removeFunction(this.#pglite_write) } catch (e) { const err = e as { name: string; status: number } if (err.name === 'ExitStatus' && err.status === 0) { From b55618e243bf6a6bcdaa77f9a27c421ea66f57f0 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 15:25:05 +0100 Subject: [PATCH 22/33] undo changes to CI workflow --- .github/workflows/build_and_test.yml | 49 +++++++++++----------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 847240fff..3a18acca4 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -61,12 +61,12 @@ jobs: run: | pnpm build:all - # - name: Typecheck pglite - # working-directory: ${{ github.workspace }}/packages/pglite - # run: pnpm typecheck - # - name: Test pglite - # working-directory: ${{ github.workspace }}/packages/pglite - # run: pnpm test + - name: Typecheck pglite + working-directory: ${{ github.workspace }}/packages/pglite + run: pnpm typecheck + - name: Test pglite + working-directory: ${{ github.workspace }}/packages/pglite + run: pnpm test - name: Upload PGlite Interim to Github artifacts id: upload-pglite-interim-build-files @@ -89,8 +89,7 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, v22.20.0, 23.x, 24.x] - fail-fast: false + node: [20.x, 21.x, 22.x, 23.x, 24.x] defaults: run: working-directory: ./packages/pglite @@ -106,9 +105,6 @@ jobs: - uses: denoland/setup-deno@v1 with: deno-version: vx.x.x - - - name: Show node version - run: node -v - name: Download PGlite WASM build artifacts uses: actions/download-artifact@v4 @@ -136,15 +132,15 @@ jobs: - name: Build run: pnpm build - # - name: Test web integrations - # # retry on failure as web tests can be flaky - # run: pnpm test:web || pnpm test:web || pnpm test:web + - name: Test web integrations + # retry on failure as web tests can be flaky + run: pnpm test:web || pnpm test:web || pnpm test:web - # - name: Test Deno - # run: pnpm test:deno + - name: Test Deno + run: pnpm test:deno - # - name: Pack for distribution - # run: pnpm pack + - name: Pack for distribution + run: pnpm pack - name: Upload PGlite distribution artifact id: upload-pglite-dist @@ -186,8 +182,7 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, v22.20.0, 23.x, 24.x] - fail-fast: false + node: [20.x, 21.x, 22.x, 23.x, 24.x] needs: [build-and-test-pglite] steps: - uses: actions/checkout@v4 @@ -197,9 +192,6 @@ jobs: node-version: ${{ matrix.node }} cache: pnpm - - name: Show node version - run: node -v - - name: Download PGlite build artifacts uses: actions/download-artifact@v4 with: @@ -221,14 +213,11 @@ jobs: - name: Build packages run: pnpm --filter="...^pglite" build - # - name: Typecheck packages - # run: pnpm --filter="...^pglite" typecheck - - # - name: Test packages - # run: pnpm --filter="...^pglite" test + - name: Typecheck packages + run: pnpm --filter="...^pglite" typecheck - - name: Test pglite-socket - run: pnpm -C packages/pglite-socket/ test + - name: Test packages + run: pnpm --filter="...^pglite" test - name: Upload pglite-tools distribution artifact id: upload-pglite-tools-dist From 380b815f7744315e56ae1c1c2903c862be7f38f1 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 15:25:10 +0100 Subject: [PATCH 23/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index e99177dab..16ea22ce2 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit e99177dab7dd8dfd6aa0b014081693db77c5ab28 +Subproject commit 16ea22ce27216655c644589628f48ec6bd760395 From 3a00287046c1ade5692ba685ffde5bd73d98511a Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 15:37:28 +0100 Subject: [PATCH 24/33] undo pglite.ts changes --- packages/pglite/src/pglite.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/packages/pglite/src/pglite.ts b/packages/pglite/src/pglite.ts index c479728e7..c0da6cba8 100644 --- a/packages/pglite/src/pglite.ts +++ b/packages/pglite/src/pglite.ts @@ -386,18 +386,6 @@ export class PGlite // Load the database engine this.mod = await PostgresModFactory(emscriptenOpts) - // experiment on wasmTable get - const prevGet = this.mod.wasmTable.get - this.mod.wasmTable.get = (index: number) => { - const result = prevGet.call(this.mod!.wasmTable, index); - if (!result) { - console.error('pglite: function index not found in wasmTable', index) - // throw `pglite: function index not found in wasmTable ${index}` - // search the js.symbols file for index - } - return result - } - // set the write callback this.#pglite_write = this.mod.addFunction((ptr: any, length: number) => { let bytes @@ -586,10 +574,10 @@ export class PGlite // Close the database try { - // this.mod!.removeFunction(this.#pglite_read) - // this.mod!.removeFunction(this.#pglite_write) await this.execProtocol(serialize.end()) this.mod!._pgl_shutdown() + this.mod!.removeFunction(this.#pglite_read) + this.mod!.removeFunction(this.#pglite_write) } catch (e) { const err = e as { name: string; status: number } if (err.name === 'ExitStatus' && err.status === 0) { From 3458462f1d914b5208c7985280a6972695d5fdea Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 16:25:15 +0100 Subject: [PATCH 25/33] more pgcrypto tests --- .../pglite/tests/contrib/pgcrypto.test.js | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/packages/pglite/tests/contrib/pgcrypto.test.js b/packages/pglite/tests/contrib/pgcrypto.test.js index e286df47c..6e045175e 100644 --- a/packages/pglite/tests/contrib/pgcrypto.test.js +++ b/packages/pglite/tests/contrib/pgcrypto.test.js @@ -62,6 +62,22 @@ describe('pg_pgcryptotrgm', () => { expect(res.rows[0].value.length).toEqual(29) }) + it('armor', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query( + "SELECT armor(digest('test', 'sha1')) as value;", + ) + expect(res.rows[0].value).toContain('-----BEGIN PGP MESSAGE-----') + expect(res.rows[0].value).toContain('-----END PGP MESSAGE-----') + }) + it('pgp_sym_encrypt and pgp_sym_decrypt', async () => { const pg = new PGlite({ extensions: { @@ -112,4 +128,128 @@ FROM encrypted; ) expect(e2[0].rows[0].decrypted_output, toEncrypt) }) + + it('pgp_key_id', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const { publicKey } = await openpgp.generateKey({ + type: 'rsa', + rsaBits: 2048, + userIDs: [{ name: 'PGlite', email: 'hello@pglite.dev' }], + passphrase: '', + }) + + const res = await pg.query( + `SELECT pgp_key_id(dearmor('${publicKey}')) as value;`, + ) + // pgp_key_id returns a 16-character hex string + expect(res.rows[0].value).toHaveLength(16) + expect(res.rows[0].value).toMatch(/^[0-9A-F]+$/) + }) + + it('pgp_armor_headers', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + // Create armored data with headers + const res = await pg.query( + `SELECT armor(digest('test', 'sha1'), ARRAY['key1'], ARRAY['value1']) as armored;`, + ) + const armored = res.rows[0].armored + + const res2 = await pg.query( + `SELECT * FROM pgp_armor_headers($1);`, + [armored], + ) + expect(res2.rows).toContainEqual({ key: 'key1', value: 'value1' }) + }) + + it('encrypt and decrypt', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query( + `SELECT encrypt('test data'::bytea, 'secret key'::bytea, 'aes') as encrypted;`, + ) + const encrypted = res.rows[0].encrypted + + const res2 = await pg.query( + `SELECT convert_from(decrypt($1, 'secret key'::bytea, 'aes'), 'UTF8') as decrypted;`, + [encrypted], + ) + expect(res2.rows[0].decrypted).toEqual('test data') + }) + + it('encrypt_iv and decrypt_iv', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + // AES block size is 16 bytes, so IV must be 16 bytes + const iv = '1234567890123456' + + const res = await pg.query( + `SELECT encrypt_iv('test data'::bytea, 'secret key'::bytea, '${iv}'::bytea, 'aes') as encrypted;`, + ) + const encrypted = res.rows[0].encrypted + + const res2 = await pg.query( + `SELECT convert_from(decrypt_iv($1, 'secret key'::bytea, '${iv}'::bytea, 'aes'), 'UTF8') as decrypted;`, + [encrypted], + ) + expect(res2.rows[0].decrypted).toEqual('test data') + }) + + it('gen_random_bytes', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query( + `SELECT length(gen_random_bytes(32)) as len, encode(gen_random_bytes(16), 'hex') as bytes;`, + ) + expect(res.rows[0].len).toEqual(32) + // 16 bytes = 32 hex characters + expect(res.rows[0].bytes).toHaveLength(32) + }) + + it('gen_random_uuid', async () => { + const pg = new PGlite({ + extensions: { + pgcrypto, + }, + }) + + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') + + const res = await pg.query(`SELECT gen_random_uuid() as uuid;`) + // UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + expect(res.rows[0].uuid).toMatch( + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/, + ) + }) }) From e0fe1615f5b6d3819085f73da6c93a09e6d4db09 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 17:06:26 +0100 Subject: [PATCH 26/33] update size --- docs/extensions/extensions.data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extensions/extensions.data.ts b/docs/extensions/extensions.data.ts index 2dd0e1220..579db96d9 100644 --- a/docs/extensions/extensions.data.ts +++ b/docs/extensions/extensions.data.ts @@ -557,7 +557,7 @@ const baseExtensions: Extension[] = [ importPath: '@electric-sql/pglite/contrib/pgcrypto', importName: 'pgcrypto', core: true, - size: 1004373, + size: 1148162, }, ] From c7e6d888c49adbd59c2e68b621f4f57285233b13 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 17:06:46 +0100 Subject: [PATCH 27/33] remove wasmTable --- packages/pglite/src/postgresMod.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/pglite/src/postgresMod.ts b/packages/pglite/src/postgresMod.ts index 1535b9290..2a3e8ee1e 100644 --- a/packages/pglite/src/postgresMod.ts +++ b/packages/pglite/src/postgresMod.ts @@ -16,7 +16,6 @@ export type FS = typeof FS & { export interface PostgresMod extends Omit { - wasmTable: WebAssembly.Table preInit: Array<{ (mod: PostgresMod): void }> preRun: Array<{ (mod: PostgresMod): void }> postRun: Array<{ (mod: PostgresMod): void }> From d865dcbf944406e16cf8c814e88b988adbc5837f Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 17:12:13 +0100 Subject: [PATCH 28/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 16ea22ce2..d57e66a77 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 16ea22ce27216655c644589628f48ec6bd760395 +Subproject commit d57e66a77dda5cf31f52cbd18d854649d895be0a From 5de09e374741adc3c6e083deb5c47722c657efa4 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 18:54:34 +0100 Subject: [PATCH 29/33] style --- packages/pglite/tests/contrib/pgcrypto.test.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/pglite/tests/contrib/pgcrypto.test.js b/packages/pglite/tests/contrib/pgcrypto.test.js index 6e045175e..a60d577b6 100644 --- a/packages/pglite/tests/contrib/pgcrypto.test.js +++ b/packages/pglite/tests/contrib/pgcrypto.test.js @@ -71,9 +71,7 @@ describe('pg_pgcryptotrgm', () => { await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;') - const res = await pg.query( - "SELECT armor(digest('test', 'sha1')) as value;", - ) + const res = await pg.query("SELECT armor(digest('test', 'sha1')) as value;") expect(res.rows[0].value).toContain('-----BEGIN PGP MESSAGE-----') expect(res.rows[0].value).toContain('-----END PGP MESSAGE-----') }) @@ -168,10 +166,9 @@ FROM encrypted; ) const armored = res.rows[0].armored - const res2 = await pg.query( - `SELECT * FROM pgp_armor_headers($1);`, - [armored], - ) + const res2 = await pg.query(`SELECT * FROM pgp_armor_headers($1);`, [ + armored, + ]) expect(res2.rows).toContainEqual({ key: 'key1', value: 'value1' }) }) From 8775a24246459b23d08a06f4157afd986897ab47 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 16 Dec 2025 19:00:37 +0100 Subject: [PATCH 30/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index d57e66a77..f4f82f77c 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit d57e66a77dda5cf31f52cbd18d854649d895be0a +Subproject commit f4f82f77c0cbf9922cb839854d678904803bc0bf From 8959a023824691f8d957b0eb20096d31e1239d07 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 6 Jan 2026 13:09:49 +0100 Subject: [PATCH 31/33] udpate submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 5a5937915..ea732d479 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 5a593791571d6e0836dd31622dbcb941e4a43034 +Subproject commit ea732d479cc37fefebe6489098ecf6a8de22b6ab From 0c683bcea7be8f7405bbedfd72459896d7cd4531 Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 6 Jan 2026 13:59:46 +0100 Subject: [PATCH 32/33] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index ea732d479..bee4a36b7 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit ea732d479cc37fefebe6489098ecf6a8de22b6ab +Subproject commit bee4a36b76d2607f5c1d2ca61fd013958b17d0e9 From 80115d9d3de045413ecb84f62cb03b1a2684184c Mon Sep 17 00:00:00 2001 From: tudor Date: Tue, 6 Jan 2026 14:01:16 +0100 Subject: [PATCH 33/33] changeset --- .changeset/nervous-seahorses-mate.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/nervous-seahorses-mate.md diff --git a/.changeset/nervous-seahorses-mate.md b/.changeset/nervous-seahorses-mate.md new file mode 100644 index 000000000..f59667dfd --- /dev/null +++ b/.changeset/nervous-seahorses-mate.md @@ -0,0 +1,6 @@ +--- +'@electric-sql/pglite-socket': patch +'@electric-sql/pglite': patch +--- + +added pgcrypto extension