orez 0.2.24 → 0.2.26

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.
Files changed (138) hide show
  1. package/dist/cf-do/test-protocol.d.ts +11 -0
  2. package/dist/cf-do/test-protocol.d.ts.map +1 -0
  3. package/dist/cf-do/test-protocol.js +137 -0
  4. package/dist/cf-do/test-protocol.js.map +1 -0
  5. package/dist/cf-do/watermark.d.ts +21 -0
  6. package/dist/cf-do/watermark.d.ts.map +1 -0
  7. package/dist/cf-do/watermark.js +93 -0
  8. package/dist/cf-do/watermark.js.map +1 -0
  9. package/dist/cf-do/worker.d.ts +91 -0
  10. package/dist/cf-do/worker.d.ts.map +1 -0
  11. package/dist/cf-do/worker.js +813 -0
  12. package/dist/cf-do/worker.js.map +1 -0
  13. package/dist/config.d.ts +4 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +1 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/do-sql-tracking.d.ts +6 -0
  18. package/dist/do-sql-tracking.d.ts.map +1 -0
  19. package/dist/do-sql-tracking.js +14 -0
  20. package/dist/do-sql-tracking.js.map +1 -0
  21. package/dist/index.d.ts +2 -3
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +69 -23
  24. package/dist/index.js.map +1 -1
  25. package/dist/pg-proxy-browser.js +6 -6
  26. package/dist/pg-proxy-browser.js.map +1 -1
  27. package/dist/pg-proxy-do-backend.d.ts +128 -0
  28. package/dist/pg-proxy-do-backend.d.ts.map +1 -0
  29. package/dist/pg-proxy-do-backend.js +6292 -0
  30. package/dist/pg-proxy-do-backend.js.map +1 -0
  31. package/dist/pglite-ipc.d.ts +3 -0
  32. package/dist/pglite-ipc.d.ts.map +1 -1
  33. package/dist/pglite-ipc.js +34 -12
  34. package/dist/pglite-ipc.js.map +1 -1
  35. package/dist/pglite-web-proxy.d.ts +3 -0
  36. package/dist/pglite-web-proxy.d.ts.map +1 -1
  37. package/dist/pglite-web-proxy.js +50 -7
  38. package/dist/pglite-web-proxy.js.map +1 -1
  39. package/dist/query-rewrites.d.ts +2 -0
  40. package/dist/query-rewrites.d.ts.map +1 -0
  41. package/dist/query-rewrites.js +140 -0
  42. package/dist/query-rewrites.js.map +1 -0
  43. package/dist/replication/change-tracker.d.ts.map +1 -1
  44. package/dist/replication/change-tracker.js +18 -1
  45. package/dist/replication/change-tracker.js.map +1 -1
  46. package/dist/replication/handler.d.ts.map +1 -1
  47. package/dist/replication/handler.js +7 -2
  48. package/dist/replication/handler.js.map +1 -1
  49. package/dist/replication/pgoutput-encoder.d.ts.map +1 -1
  50. package/dist/replication/pgoutput-encoder.js +72 -30
  51. package/dist/replication/pgoutput-encoder.js.map +1 -1
  52. package/dist/worker/browser-build-config.d.ts.map +1 -1
  53. package/dist/worker/browser-build-config.js +2 -1
  54. package/dist/worker/browser-build-config.js.map +1 -1
  55. package/dist/worker/cf-patches.d.ts +5 -2
  56. package/dist/worker/cf-patches.d.ts.map +1 -1
  57. package/dist/worker/cf-patches.js +238 -4
  58. package/dist/worker/cf-patches.js.map +1 -1
  59. package/dist/worker/shims/node-stub.d.ts +35 -0
  60. package/dist/worker/shims/node-stub.d.ts.map +1 -1
  61. package/dist/worker/shims/node-stub.js +53 -1
  62. package/dist/worker/shims/node-stub.js.map +1 -1
  63. package/dist/worker/shims/oxfmt.d.ts +4 -0
  64. package/dist/worker/shims/oxfmt.d.ts.map +1 -0
  65. package/dist/worker/shims/oxfmt.js +4 -0
  66. package/dist/worker/shims/oxfmt.js.map +1 -0
  67. package/dist/worker/shims/postgres-socket.js +1 -1
  68. package/dist/worker/shims/postgres-socket.js.map +1 -1
  69. package/dist/worker/shims/sqlite.d.ts +1 -0
  70. package/dist/worker/shims/sqlite.d.ts.map +1 -1
  71. package/dist/worker/shims/sqlite.js +229 -9
  72. package/dist/worker/shims/sqlite.js.map +1 -1
  73. package/dist/worker/shims/ws.d.ts.map +1 -1
  74. package/dist/worker/shims/ws.js +45 -0
  75. package/dist/worker/shims/ws.js.map +1 -1
  76. package/dist/worker/shims/zero-process-env.d.ts +2 -0
  77. package/dist/worker/shims/zero-process-env.d.ts.map +1 -0
  78. package/dist/worker/shims/zero-process-env.js +9 -0
  79. package/dist/worker/shims/zero-process-env.js.map +1 -0
  80. package/dist/worker/zero-cache-embed-cf.d.ts +29 -12
  81. package/dist/worker/zero-cache-embed-cf.d.ts.map +1 -1
  82. package/dist/worker/zero-cache-embed-cf.js +83 -14
  83. package/dist/worker/zero-cache-embed-cf.js.map +1 -1
  84. package/package.json +6 -2
  85. package/src/cf-do/.wrangler/cache/cf.json +1 -0
  86. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite +0 -0
  87. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-shm +0 -0
  88. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-wal +0 -0
  89. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/0f0f3bdf0abda097eb6f1246db4657d9fc622081362d894d82c1a1ce067b05b6.sqlite +0 -0
  90. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/1ddd3a4a48a11b51658444f5458a1fb175194b1d5b6a5bda20ef3fe3205b900c.sqlite +0 -0
  91. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/204a39120310d37e972c5914cfd71ad55c151bdb9e8ed289a5f8c5b052dd60e4.sqlite +0 -0
  92. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/3835f242df9728adba3d127a238793fd054ed3e51df3f60749ee744c469bf2a2.sqlite +0 -0
  93. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/4aa9c80eb716cf55b8995ccf7afab0b36c683e6da07d7c37a3f9c570136036df.sqlite +0 -0
  94. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/533e2fd1d6ea46e7a9a0017916ef341802d438d72583462755f2c1f8225e9bf2.sqlite +0 -0
  95. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/5ffa1aced1225ecaeac6366f7586aa3de92761cdff8711d81fbd81f248076abd.sqlite +0 -0
  96. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/686c3a9f0d7e59ed2ab607efd4b76d779c97cafeb3818380033bf7c7eb86c819.sqlite +0 -0
  97. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/6e8214e8dcfadd0deb52d64e5e9ca85c6b329ace11193909845995396914c473.sqlite +0 -0
  98. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/78d9ec9ff873d3fe3507ff53c2a6f6dfc408b4268eb0db3f2a146c0678965366.sqlite +0 -0
  99. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/7eff9f0ed7e27ad0d3f9d923de0682fab1928591172c1ba336c5f79a134a5d85.sqlite +0 -0
  100. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/836cda5b995b25867d722ed4f4c2292167e80351a3c6038db626648eb247dd8b.sqlite +0 -0
  101. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/91ef63b112209ab30172763acd8a0935106c248f7f1bcae5545ce37a9f201551.sqlite +0 -0
  102. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/a66ea4293a5f5938bc6d116edfa2522bb85bc37aea3541fbc09c3b613b9b32c0.sqlite +0 -0
  103. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/ceb2ab26b80590840b65651deb6e948d3bf81565c6751f3a58752cf4bf4aecae.sqlite +0 -0
  104. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite +0 -0
  105. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-shm +0 -0
  106. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-wal +0 -0
  107. package/src/cf-do/ARCHITECTURE.md +83 -0
  108. package/src/cf-do/watermark.test.ts +103 -0
  109. package/src/cf-do/watermark.ts +118 -0
  110. package/src/cf-do/worker.ts +1033 -0
  111. package/src/cf-do/wrangler.toml +11 -0
  112. package/src/config.ts +5 -0
  113. package/src/do-sql-tracking.test.ts +19 -0
  114. package/src/do-sql-tracking.ts +19 -0
  115. package/src/index.ts +76 -28
  116. package/src/pg-proxy-browser.ts +6 -6
  117. package/src/pg-proxy-do-backend.test.ts +3890 -0
  118. package/src/pg-proxy-do-backend.ts +7157 -0
  119. package/src/pglite-ipc.test.ts +17 -0
  120. package/src/pglite-ipc.ts +31 -12
  121. package/src/pglite-web-proxy.test.ts +57 -0
  122. package/src/pglite-web-proxy.ts +48 -7
  123. package/src/replication/change-tracker.ts +16 -1
  124. package/src/replication/handler.test.ts +35 -0
  125. package/src/replication/handler.ts +7 -2
  126. package/src/replication/pgoutput-encoder.test.ts +71 -2
  127. package/src/replication/pgoutput-encoder.ts +65 -30
  128. package/src/worker/browser-build-config.test.ts +12 -0
  129. package/src/worker/browser-build-config.ts +2 -1
  130. package/src/worker/cf-patches.ts +274 -4
  131. package/src/worker/shims/node-stub.ts +53 -1
  132. package/src/worker/shims/oxfmt.ts +3 -0
  133. package/src/worker/shims/postgres-socket.ts +1 -1
  134. package/src/worker/shims/sqlite.test.ts +145 -0
  135. package/src/worker/shims/sqlite.ts +256 -9
  136. package/src/worker/shims/ws.ts +45 -0
  137. package/src/worker/shims/zero-process-env.ts +11 -0
  138. package/src/worker/zero-cache-embed-cf.ts +114 -18
@@ -0,0 +1,11 @@
1
+ name = "zero-do"
2
+ main = "worker.ts"
3
+ compatibility_date = "2025-04-01"
4
+
5
+ [[durable_objects.bindings]]
6
+ name = "ZERO_DO"
7
+ class_name = "ZeroDO"
8
+
9
+ [[migrations]]
10
+ tag = "v1"
11
+ new_sqlite_classes = ["ZeroDO"]
package/src/config.ts CHANGED
@@ -30,6 +30,8 @@ export interface ZeroLiteConfig {
30
30
  // storage controls
31
31
  checkpointIntervalMs: number // WAL checkpoint interval (default: 5min)
32
32
  maxLogFileSize: number // log rotation threshold in bytes (default: 2MB)
33
+ /** DO backend URL — replaces PGlite with Durable Object SQLite */
34
+ doBackendUrl?: string
33
35
  disableDiskLogs: boolean // skip writing logs to disk (default: false)
34
36
  // lifecycle hooks
35
37
  onDbReady?: Hook // after db+proxy ready, before zero-cache
@@ -103,6 +105,8 @@ export interface OrezConfig {
103
105
  maxLogFileSize?: number
104
106
  /** disable writing logs to disk (default: false) */
105
107
  disableDiskLogs?: boolean
108
+ /** DO backend URL — replaces PGlite with Durable Object SQLite */
109
+ doBackendUrl?: string
106
110
  }
107
111
 
108
112
  /** type-safe helper for orez.config.ts */
@@ -135,6 +139,7 @@ export function getConfig(overrides: Partial<ZeroLiteConfig> = {}): ZeroLiteConf
135
139
  checkpointIntervalMs: overrides.checkpointIntervalMs ?? 5 * 60 * 1000,
136
140
  maxLogFileSize: overrides.maxLogFileSize ?? 2 * 1024 * 1024,
137
141
  disableDiskLogs: overrides.disableDiskLogs ?? false,
142
+ doBackendUrl: overrides.doBackendUrl ?? process.env.DO_BACKEND_URL,
138
143
  onDbReady: overrides.onDbReady,
139
144
  onHealthy: overrides.onHealthy,
140
145
  }
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { trackedChangeRow } from './do-sql-tracking.js'
4
+
5
+ describe('trackedChangeRow', () => {
6
+ it('keeps only table columns and strips internal returning expressions', () => {
7
+ expect(
8
+ trackedChangeRow(
9
+ {
10
+ id: 't1',
11
+ body: 'hello',
12
+ __orez_returning_1: 'HELLO',
13
+ extra: 'client-visible only',
14
+ },
15
+ { rowColumns: ['id', 'body'] }
16
+ )
17
+ ).toEqual({ id: 't1', body: 'hello' })
18
+ })
19
+ })
@@ -0,0 +1,19 @@
1
+ export const RETURNING_INTERNAL_PREFIX = '__orez_returning_'
2
+
3
+ export interface TrackedRowFilter {
4
+ rowColumns?: string[]
5
+ }
6
+
7
+ export function trackedChangeRow(
8
+ row: Record<string, unknown>,
9
+ track: TrackedRowFilter
10
+ ): Record<string, unknown> {
11
+ const allowed = track.rowColumns ? new Set(track.rowColumns) : null
12
+ const out: Record<string, unknown> = {}
13
+ for (const [key, value] of Object.entries(row)) {
14
+ if (key.startsWith(RETURNING_INTERNAL_PREFIX)) continue
15
+ if (allowed && !allowed.has(key)) continue
16
+ out[key] = value
17
+ }
18
+ return out
19
+ }
package/src/index.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { spawn, spawnSync, type ChildProcess } from 'node:child_process'
10
+ import { randomUUID } from 'node:crypto'
10
11
  import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs'
11
12
  import { resolve } from 'node:path'
12
13
 
@@ -24,6 +25,7 @@ import {
24
25
  } from './child-process.js'
25
26
  import { getConfig, getConnectionString } from './config.js'
26
27
  import { log, port, setLogLevel, setLogStore } from './log.js'
28
+ import { DoBackend } from './pg-proxy-do-backend.js'
27
29
  import { startPgProxy } from './pg-proxy.js'
28
30
  import {
29
31
  createPGliteInstances,
@@ -60,6 +62,17 @@ import type { PGlite } from '@electric-sql/pglite'
60
62
 
61
63
  type ZeroChildProcess = ChildProcess & { __orezTail?: string[] }
62
64
 
65
+ function ensureDoBackendNamespace(dataDir: string): string {
66
+ const marker = resolve(dataDir, 'do-backend-namespace')
67
+ if (existsSync(marker)) {
68
+ const existing = readFileSync(marker, 'utf8').trim()
69
+ if (existing) return existing
70
+ }
71
+ const next = randomUUID()
72
+ writeFileSync(marker, `${next}\n`)
73
+ return next
74
+ }
75
+
63
76
  function resolveNodeBinary(): string {
64
77
  const explicitNode = process.env.NODE
65
78
  if (explicitNode && existsSync(explicitNode)) {
@@ -319,22 +332,60 @@ export async function startZeroLite(overrides: Partial<ZeroLiteConfig> = {}) {
319
332
  // single-db mode uses one instance for all databases (lighter for constrained envs).
320
333
  // otherwise, separate instances for postgres, zero_cvr, zero_cdb with optional
321
334
  // worker threads for non-blocking WASM execution.
322
- const instances = config.singleDb
323
- ? config.useWorkerThreads
324
- ? await createSinglePGliteWorkerInstance(config)
325
- : await createSinglePGliteInstance(config)
326
- : config.useWorkerThreads
327
- ? await createPGliteWorkerInstances(config)
328
- : await createPGliteInstances(config)
329
- const db = instances.postgres
330
-
331
- // periodic WAL checkpoint to prevent pg_wal/ from growing unboundedly
332
- const stopCheckpoint =
333
- config.checkpointIntervalMs > 0
334
- ? startPeriodicCheckpoint(instances, config.checkpointIntervalMs)
335
- : () => {}
336
-
337
- // config-based publications take precedence over env var
335
+
336
+ // ── DO backend path (replaces PGlite) ──────────────────────────────
337
+ let instances: any, db: any, stopCheckpoint: any
338
+ let migrationsApplied = 0
339
+ let isDoBackend = false
340
+
341
+ if (config.doBackendUrl) {
342
+ isDoBackend = true
343
+ log.orez(`using DO backend: ${config.doBackendUrl}`)
344
+ const backendUrl = config.doBackendUrl.replace(/\/+$/, '')
345
+ const doNamespace = ensureDoBackendNamespace(config.dataDir)
346
+ const doInstances = {
347
+ postgres: new DoBackend(backendUrl, 'postgres', doNamespace),
348
+ cvr: new DoBackend(backendUrl, 'zero_cvr', doNamespace),
349
+ cdb: new DoBackend(backendUrl, 'zero_cdb', doNamespace),
350
+ postgresReplicas: [],
351
+ }
352
+ await Promise.all([
353
+ doInstances.postgres.waitReady,
354
+ doInstances.cvr.waitReady,
355
+ doInstances.cdb.waitReady,
356
+ ])
357
+ instances = doInstances
358
+ db = doInstances.postgres
359
+ stopCheckpoint = () => {}
360
+ } else {
361
+ // ── PGlite backend (default) ────────────────────────────────────────────
362
+ instances = config.singleDb
363
+ ? config.useWorkerThreads
364
+ ? await createSinglePGliteWorkerInstance(config)
365
+ : await createSinglePGliteInstance(config)
366
+ : config.useWorkerThreads
367
+ ? await createPGliteWorkerInstances(config)
368
+ : await createPGliteInstances(config)
369
+ db = instances.postgres
370
+
371
+ // periodic WAL checkpoint
372
+ stopCheckpoint =
373
+ config.checkpointIntervalMs > 0
374
+ ? startPeriodicCheckpoint(instances, config.checkpointIntervalMs)
375
+ : () => {}
376
+
377
+ // config-based publications
378
+ if (config.zeroPublications && !process.env.ZERO_APP_PUBLICATIONS) {
379
+ process.env.ZERO_APP_PUBLICATIONS = config.zeroPublications
380
+ }
381
+
382
+ // run migrations & change tracking
383
+ migrationsApplied = await runMigrations(db, config)
384
+ log.debug.orez('installing change tracking')
385
+ await installChangeTracking(db)
386
+ }
387
+
388
+ // shared: publications config
338
389
  if (config.zeroPublications && !process.env.ZERO_APP_PUBLICATIONS) {
339
390
  process.env.ZERO_APP_PUBLICATIONS = config.zeroPublications
340
391
  }
@@ -343,14 +394,11 @@ export async function startZeroLite(overrides: Partial<ZeroLiteConfig> = {}) {
343
394
  log.debug.orez(`using managed publication: ${managedPub.names.join(', ')}`)
344
395
  }
345
396
 
346
- // run migrations (on postgres instance only)
347
- const migrationsApplied = await runMigrations(db, config)
397
+ // sync publications. for DO backend this goes through the TCP proxy, which
398
+ // rewrites the catalog queries and forwards CREATE PUBLICATION / ALTER PUBLICATION
399
+ // as no-ops or DO-native equivalents (PGlite still owns the real path).
348
400
  await syncManagedPublications(db, managedPub.names, managedPub.managedByOrez)
349
401
 
350
- // install change tracking (on postgres instance only)
351
- log.debug.orez('installing change tracking')
352
- await installChangeTracking(db)
353
-
354
402
  // start tcp proxy (routes connections to correct instance by database name)
355
403
  const pgServer = await startPgProxy(instances, config)
356
404
 
@@ -375,17 +423,17 @@ export async function startZeroLite(overrides: Partial<ZeroLiteConfig> = {}) {
375
423
  OREZ_PG_PORT: String(config.pgPort),
376
424
  })
377
425
 
378
- // re-sync publication membership after on-db-ready.
379
- // for orez-managed publications, add any new public tables.
380
- // for user-managed publications, ensure the publication isn't empty
381
- // (app migrations may have created the pub with tables, but if orez
382
- // pre-created an empty pub, the migration may have skipped adding tables).
426
+ // re-sync publication membership
383
427
  await syncManagedPublications(db, managedPub.names, managedPub.managedByOrez)
384
428
  await ensurePublicationHasTables(db, managedPub.names)
385
429
  log.debug.orez('re-installing change tracking after on-db-ready')
386
430
  await installChangeTracking(db)
387
431
  }
388
432
 
433
+ if (isDoBackend) {
434
+ await installChangeTracking(db)
435
+ }
436
+
389
437
  // write the ready marker so external orchestrators (e.g. CI scripts that
390
438
  // currently `wait:ports 6434`) can wait for orez to be fully initialized.
391
439
  // important: the pg port is bound earlier (startPgProxy above) so that
@@ -624,7 +672,7 @@ export async function startZeroLite(overrides: Partial<ZeroLiteConfig> = {}) {
624
672
 
625
673
  // remove stale zero shard schemas from upstream; these can outlive CVR/CDB
626
674
  // and cause dispatcher errors after full reset.
627
- const shardSchemas = await db.query<{ schemaname: string }>(
675
+ const shardSchemas = await db.query(
628
676
  `SELECT DISTINCT schemaname
629
677
  FROM pg_tables
630
678
  WHERE tablename IN ('clients', 'replicas', 'mutations')
@@ -656,7 +656,7 @@ function messagePortToDuplexWithInject(port: MessagePort): {
656
656
  chunk.byteOffset,
657
657
  chunk.byteOffset + chunk.byteLength
658
658
  ) as ArrayBuffer
659
- port.postMessage(buf, [buf])
659
+ port.postMessage(buf)
660
660
  },
661
661
  close() {
662
662
  port.close()
@@ -668,7 +668,7 @@ function messagePortToDuplexWithInject(port: MessagePort): {
668
668
  data.byteOffset,
669
669
  data.byteOffset + data.byteLength
670
670
  ) as ArrayBuffer
671
- port.postMessage(buf, [buf])
671
+ port.postMessage(buf)
672
672
  }
673
673
 
674
674
  const injectMessage = (data: Uint8Array) => {
@@ -714,12 +714,12 @@ function messagePortToDuplex(port: MessagePort): {
714
714
  if (isDebugWire() && _globalWriteCount <= 200) {
715
715
  console.debug(`[pg-proxy-ws-write] #${_globalWriteCount} len=${chunk.byteLength}`)
716
716
  }
717
- // transfer the ArrayBuffer for zero-copy
717
+ // CF workerd MessagePort does not support transfer lists.
718
718
  const buf = chunk.buffer.slice(
719
719
  chunk.byteOffset,
720
720
  chunk.byteOffset + chunk.byteLength
721
721
  ) as ArrayBuffer
722
- port.postMessage(buf, [buf])
722
+ port.postMessage(buf)
723
723
  },
724
724
  close() {
725
725
  port.close()
@@ -733,7 +733,7 @@ function messagePortToDuplex(port: MessagePort): {
733
733
  data.byteOffset,
734
734
  data.byteOffset + data.byteLength
735
735
  ) as ArrayBuffer
736
- port.postMessage(buf, [buf])
736
+ port.postMessage(buf)
737
737
  }
738
738
 
739
739
  return { duplex: { readable, writable }, rawWrite }
@@ -1020,7 +1020,7 @@ export async function createBrowserProxy(
1020
1020
  // cause issues if the caller still references the original data
1021
1021
  const copy = new Uint8Array(data.length)
1022
1022
  copy.set(data)
1023
- port.postMessage(copy.buffer, [copy.buffer])
1023
+ port.postMessage(copy.buffer)
1024
1024
  }
1025
1025
 
1026
1026
  // step 1: send AuthenticationClearTextPassword (R, type=3) — ask for password