@electric-sql/client

中文文档
1.5.28发布于 2026/09/09Apache-2.0TypeScriptESM + CJS构建来源已验证近 30 天下载 835.3万

Postgres everywhere - your data, in sync, wherever you need it.

原始使用文档
文档目录8 节
  1. Install
  2. How to use
  3. ShapeStream
  4. Shape
  5. React Native / Expo app lifecycle
  6. Error Handling
  7. Develop
  8. Test

ElectricSQL logo

License - Apache 2.0 Status - Beta Chat - Discord

TypeScript client for ElectricSQL

Real-time Postgres sync for modern apps.

Electric provides an HTTP interface to Postgres to enable a massive number of clients to query and get real-time updates to subsets of the database, called Shapes. In this way, Electric turns Postgres into a real-time database.

The TypeScript client helps ease reading Shapes from the HTTP API in the browser and other JavaScript environments, such as edge functions and server-side Node/Bun/Deno applications. It supports both fine-grained and coarse-grained reactivity patterns — you can subscribe to see every row that changes, or you can just subscribe to get the whole shape whenever it changes. The client also supports dynamic options through function-based params and headers, making it easy to handle auth tokens, user context, and other runtime values.

Install

The client is published on NPM as @electric-sql/client:

npm i @electric-sql/client

How to use

The client exports a ShapeStream class for getting updates to shapes on a row-by-row basis as well as a Shape class for getting updates to the entire shape.

ShapeStream

import { ShapeStream } from '@electric-sql/client'

const BASE_URL = 'http://localhost:3000'

// Passes subscribers rows as they're inserted, updated, or deleted
const stream = new ShapeStream({
  url: `${BASE_URL}/v1/shape`,
  params: {
    table: `foo`,
  },
})

// You can also add custom headers and URL parameters
const streamWithParams = new ShapeStream({
  url: `${BASE_URL}/v1/shape`,
  headers: {
    Authorization: 'Bearer token',
  },
  params: {
    table: `foo`,
    'custom-param': 'value',
  },
})

stream.subscribe((messages) => {
  // messages is an array with one or more row updates
  // and the stream will wait for all subscribers to process them
  // before proceeding
})

Shape

import { ShapeStream, Shape } from '@electric-sql/client'

const BASE_URL = 'http://localhost:3000'

const stream = new ShapeStream({
  url: `${BASE_URL}/v1/shape`,
  params: {
    table: `foo`,
  },
})
const shape = new Shape(stream)

// Returns promise that resolves with the latest shape data once it's fully loaded
await shape.rows

// passes subscribers shape data when the shape updates
shape.subscribe(({ rows }) => {
  // rows is an array of the latest value of each row in a shape.
})

React Native / Expo app lifecycle

Metro and Expo resolve the package's react-native export for native builds, so standard imports automatically wire React Native AppState into ShapeStream. If your bundler setup does not resolve the root react-native condition, use the explicit @electric-sql/client/react-native entrypoint or pass runtimeVisibility explicitly. See the TypeScript client docs for details.

Error Handling

The ShapeStream provides robust error handling with automatic retry support:

1. Stream-level error handler with retry control

The onError handler gives you full control over error recovery:

import { ShapeStream, FetchError } from '@electric-sql/client'

const BASE_URL = 'http://localhost:3000'
const getRefreshedToken = () => 'refreshed-token'
const fallbackUserId = 'fallback-user-id'

const stream = new ShapeStream({
  url: `${BASE_URL}/v1/shape`,
  params: { table: `foo` },
  onError: (error) => {
    console.error('Stream error:', error)

    // IMPORTANT: Return an object to keep syncing!
    // Return void/undefined to stop syncing permanently.

    // Note: 5xx errors and network errors are automatically retried,
    // so onError is mainly for handling client errors (4xx)

    if (error instanceof FetchError) {
      if (error.status === 401) {
        // Unauthorized - refresh token and retry
        const newToken = getRefreshedToken()
        return {
          headers: {
            Authorization: `Bearer ${newToken}`,
          },
        }
      }

      if (error.status === 403) {
        // Forbidden - maybe change user context
        return {
          params: {
            table: `foo`,
            where: `user_id = $1`,
            params: [fallbackUserId],
          },
        }
      }
    }

    // Stop syncing for other errors (return void)
  },
})

Critical: The onError callback's return value controls whether syncing continues:

  • Return an object (even empty {}) to retry syncing:
    • {} - Retry with same params and headers
    • { params } - Retry with modified params
    • { headers } - Retry with modified headers
    • { params, headers } - Retry with both modified
  • Return void/undefined to stop the stream permanently

The handler supports async operations:

import { FetchError } from '@electric-sql/client'

const refreshAuthToken = async () => 'refreshed-token'

const options = {
  onError: async (error: Error) => {
    if (error instanceof FetchError && error.status === 401) {
      // Perform async token refresh
      const newToken = await refreshAuthToken()
      return {
        headers: { Authorization: `Bearer ${newToken}` },
      }
    }

    return {} // Retry other errors
  },
}

Automatic retries: The client automatically retries 5xx server errors, network errors, and 429 rate limits with exponential backoff. The onError callback is only invoked after these retries are exhausted, or for non-retryable errors like 4xx client errors.

Without onError: If no onError handler is provided, non-retryable errors (like 4xx client errors) will be thrown and the stream will stop.

2. Subscription-level error callbacks

Individual subscribers can handle errors specific to their subscription:

stream.subscribe(
  (messages) => {
    // Handle messages
  },
  (error) => {
    // Handle errors for this specific subscription
    console.error('Subscription error:', error)
  }
)

Note: Subscription error callbacks cannot control retry behavior - use the stream-level onError for that.

Common Error Types

Setup errors:

  • MissingShapeUrlError: Missing required URL parameter
  • InvalidSignalError: Invalid AbortSignal instance
  • ReservedParamError: Using reserved parameter names

Runtime errors:

  • FetchError: HTTP errors during shape fetching (includes status, url, headers)
  • FetchBackoffAbortError: Fetch aborted using AbortSignal
  • MissingShapeHandleError: Missing required shape handle
  • ParserNullValueError: NULL value in a non-nullable column

See the TypeScript client docs for more details.

And in general, see the docs website and examples for more information.

Develop

Install the pnpm workspace at the repo root:

pnpm install

Build the package:

cd packages/typescript-client
pnpm build

Test

In one terminal, start the backend running:

cd ../sync-service
mix deps.get
mix stop_dev && mix compile && mix start_dev && iex -S mix

Then in this folder:

pnpm test

版本与发布记录

@electric-sql/client 共发布 89 个版本,首次发布于 2024/08/08;过去 12 个月发布了 39 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.5.28latest2026/09/092 个月前
1.5.272026/09/012 个月前
1.5.262026/08/142 个月前
1.5.252026/08/043 个月前
1.5.242026/07/084 个月前
1.5.232026/07/024 个月前

其他发布通道:beta → 1.0.0-beta.5。

关于 @electric-sql/client 的常见问题

@electric-sql/client 是什么?

Postgres everywhere - your data, in sync, wherever you need it.

如何安装 @electric-sql/client?

在项目目录运行 npm install @electric-sql/client,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 intent,可以用 npx intent 直接运行。

@electric-sql/client 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@electric-sql/client 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@electric-sql/client 可以商用吗?

@electric-sql/client 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@electric-sql/client 的下载量有多少?

根据 npm 官方下载统计,@electric-sql/client 在 2026/10/14 – 2026/11/12 这 30 天内被下载 8,352,591 次,日均约 278,420 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@electric-sql/client 还在维护吗?

最新版本 1.5.28 发布于 2026/09/09(2 个月前);至今共发布 89 个版本,其中过去 12 个月发布了 39 个;首次发布于 2024/08/08。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。