npm package: @sai.na/trpc-message-adapter
Description: `@sai.na/trpc-message-adapter` 是一个用于通过消息传递实现 [tRPC](https://trpc.io/) 通信的适配器。它提供了灵活的接口，允许用户对接任意使用场景，只需实现数据收发的通道即可。
Author: JuerGenie
Latest version: 0.1.2

# @sai.na/trpc-message-adapter

`@sai.na/trpc-message-adapter` 是一个用于通过消息传递实现 [tRPC](https://trpc.io/) 通信的适配器。它提供了灵活的接口，允许用户对接任意使用场景，只需实现数据收发的通道即可。

## 安装

```bash
npm install @sai.na/trpc-message-adapter
```

## 快速开始

以下是一个简单的示例，展示如何使用 `@sai.na/trpc-message-adapter` 在不同环境中实现通信。

### 服务端

在服务端，创建一个 tRPC 路由并使用 `createMessageHandler` 处理消息：

```js
// server.js
import { createMessageHandler } from "@sai.na/trpc-message-adapter";
import { initTRPC } from "@trpc/server";

const t = initTRPC.create();

const router = t.router({
  hello: t.procedure.query(() => {
    return "Hello from the server!";
  }),
});

createMessageHandler({
  router,
  on: (listener) => {
    const handler = (message) => listener(message);
    process.on("message", handler);
    return () => process.off("message", handler);
  },
  emit: (message) => {
    process.send(message);
  },
});
```

### 客户端

在客户端，创建一个 tRPC 客户端并通过 `messageLink` 与服务端通信：

```js
// client.js
import { createTRPCClient } from "@trpc/client";
import { messageLink } from "@sai.na/trpc-message-adapter";

const client = createTRPCClient({
  links: [
    messageLink({
      on: (listener) => {
        const handler = (message) => listener(message);
        process.on("message", handler);
        return () => process.off("message", handler);
      },
      emit: (message) => {
        process.send(message);
      },
    }),
  ],
});

client.hello
  .query()
  .then((response) => console.log({ response }))
  .catch((error) => console.error({ error }));
```

### 自定义场景

`@sai.na/trpc-message-adapter` 的核心是 `on` 和 `emit` 方法，用户可以根据自己的需求实现任意数据收发通道。例如，您可以将其用于 WebSocket、PostMessage、或其他通信方式。

- 对接到 `Worker`:

  ```js
  // file: worker.js

  import { createMessageHandler } from "@sai.na/trpc-message-adapter";
  import { initTRPC } from "@trpc/server";

  const t = initTRPC.create();
  const router = t.router({
    hello: t.procedure.query(() => {
      return "Hello from the worker!";
    }),
  });
  createMessageHandler({
    router,
    on: (listener) => {
      const handler = (message) => listener(message);
      self.addEventListener("message", handler);
      return () => self.removeEventListener("message", handler);
    },
    emit: (message) => {
      self.postMessage(message);
    },
  });

  // file: main.js
  import { createTRPCClient } from "@trpc/client";
  import { messageLink } from "@sai.na/trpc-message-adapter";

  const worker = new Worker("worker.js");

  const client = createTRPCClient({
    links: [
      messageLink({
        on: (listener) => {
          const handler = (message) => listener(message);
          self.addEventListener("message", handler);
          return () => self.removeEventListener("message", handler);
        },
        emit: (message) => {
          self.postMessage(message);
        },
      }),
    ],
  });

  client.hello
    .query()
    .then((response) => console.log({ response }))
    .catch((error) => console.error({ error }));
  ```

## 运行示例

1. 创建对应的文件并复制代码。
2. 根据您的场景实现 `on` 和 `emit` 方法。
3. 运行代码，验证通信是否正常。

## 贡献

欢迎提交 Issue 或 Pull Request 来改进此项目。

## License

MIT