首页
/ PartyKit项目Party.Server API详解

PartyKit项目Party.Server API详解

2025-07-08 03:27:20作者:郦嵘贵Just

概述

PartyKit是一个用于构建实时协作应用的工具集,其中Party.Server是其核心API之一。本文将深入解析Party.Server的各个组成部分,帮助开发者更好地理解和使用这一强大的实时通信框架。

Party.Server基础

Party.Server是PartyKit服务器的核心接口,每个PartyKit服务器都是一个实现了该接口的TypeScript模块。

import type * as Party from "partykit/server";

export default class Server implements Party.Server {}

构造函数

Party.Server构造函数接收一个Party.Room实例,提供对房间状态和资源的访问:

constructor(readonly room: Party.Room) {
  // 初始化逻辑
}

核心生命周期方法

1. onStart方法

在服务器启动或从休眠状态唤醒后调用,在第一个onConnect或onRequest之前执行。适合用于异步初始化操作:

async onStart() {
  // 加载存储数据或获取配置
}

2. onConnect方法

当新WebSocket连接建立时触发:

async onConnect(connection: Party.Connection, ctx: Party.ConnectionContext) {
  // 处理新连接
}

3. onMessage方法

当接收到客户端或其它连接方发送的消息时触发:

async onMessage(message: string | ArrayBuffer, sender: Party.Connection) {
  // 处理消息
}

4. onClose方法

当WebSocket连接关闭时触发:

async onClose(connection: Party.Connection) {
  // 清理连接相关资源
}

5. onError方法

当连接因错误关闭时触发:

async onError(connection: Party.Connection, error: Error) {
  // 错误处理逻辑
}

HTTP请求处理

onRequest方法

处理对房间URL的HTTP请求,返回标准的Fetch API Response:

async onRequest(req: Party.Request) {
  return new Response("Hello World", { status: 200 });
}

高级功能

1. 休眠选项

通过设置hibernate选项控制服务器在请求/消息之间的内存管理:

readonly options = {
  hibernate: false // 默认为false
};

2. 连接标签

通过getConnectionTags方法为连接添加元数据,便于后续筛选:

getConnectionTags(connection: Party.Connection, ctx: Party.ConnectionContext) {
  return [ctx.request.cf?.country ?? "unknown"];
}

3. 静态拦截方法

在请求到达房间前进行拦截处理:

static async onBeforeRequest(req: Party.Request) {
  // 修改请求或直接返回响应
}

房间资源管理

Party.Room实例提供对房间状态和资源的访问:

1. 存储系统

提供异步键值存储,适合持久化数据:

// 写入数据
await this.room.storage.put("key", value);
// 读取数据
const value = await this.room.storage.get("key");

2. 广播消息

向所有连接客户端发送消息:

this.room.broadcast("系统消息", [排除的连接ID数组]);

3. 连接管理

获取和筛选当前连接:

// 获取所有连接
const allConnections = [...this.room.getConnections()];
// 按标签筛选连接
const taggedConnections = [...this.room.getConnections("tag")];

连接对象详解

Party.Connection封装了WebSocket连接:

1. 连接状态管理

// 设置状态
connection.setState({ user: "jani" });
// 读取状态
const username = connection.state?.user;

2. 基本操作

connection.send("消息内容"); // 发送消息
connection.close(); // 关闭连接

最佳实践建议

  1. 状态管理:小量临时数据使用连接状态(connection.state),大量或持久化数据使用房间存储(room.storage)

  2. 错误处理:始终实现onError方法以处理连接异常

  3. 资源清理:在onClose中释放连接相关资源

  4. 性能优化:对不常使用的房间启用hibernate选项

  5. 安全考虑:使用onBeforeRequest/onBeforeConnect进行请求验证和过滤

总结

Party.Server API提供了构建实时协作应用所需的全套工具,从基础的连接管理到高级的状态持久化和消息广播。通过合理利用其生命周期方法和资源管理功能,开发者可以构建高效、可靠的实时应用系统。