@linkshell/gateway 0.5.3 → 0.6.0

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 (109) hide show
  1. package/Dockerfile +8 -22
  2. package/README.md +99 -44
  3. package/dist/gateway/src/accounts.js.map +1 -0
  4. package/dist/gateway/src/index.d.ts +4 -1
  5. package/dist/gateway/src/index.js +4 -863
  6. package/dist/gateway/src/index.js.map +1 -1
  7. package/dist/gateway/src/main.js +57 -0
  8. package/dist/gateway/src/main.js.map +1 -0
  9. package/dist/gateway/src/rate-limit.d.ts +22 -0
  10. package/dist/gateway/src/rate-limit.js +66 -0
  11. package/dist/gateway/src/rate-limit.js.map +1 -0
  12. package/dist/gateway/src/relay.d.ts +84 -5
  13. package/dist/gateway/src/relay.js +402 -529
  14. package/dist/gateway/src/relay.js.map +1 -1
  15. package/dist/gateway/src/serve.d.ts +34 -0
  16. package/dist/gateway/src/serve.js +102 -0
  17. package/dist/gateway/src/serve.js.map +1 -0
  18. package/dist/{gateway-v2 → gateway}/src/store.d.ts +5 -0
  19. package/dist/{gateway-v2 → gateway}/src/store.js +7 -0
  20. package/dist/gateway/src/store.js.map +1 -0
  21. package/dist/gateway/src/subscription.d.ts +18 -0
  22. package/dist/gateway/src/subscription.js +46 -0
  23. package/dist/gateway/src/subscription.js.map +1 -0
  24. package/dist/gateway/tsconfig.tsbuildinfo +1 -1
  25. package/dist/wire/src/direct.d.ts +22 -0
  26. package/dist/wire/src/direct.js +37 -0
  27. package/dist/wire/src/direct.js.map +1 -0
  28. package/dist/wire/src/index.d.ts +1 -0
  29. package/dist/wire/src/index.js +1 -0
  30. package/dist/wire/src/index.js.map +1 -1
  31. package/dist/wire/src/model.d.ts +287 -6
  32. package/dist/wire/src/model.js +33 -0
  33. package/dist/wire/src/model.js.map +1 -1
  34. package/dist/wire/src/relay.d.ts +8 -8
  35. package/dist/wire/src/rpc.d.ts +1780 -44
  36. package/dist/wire/src/rpc.js +48 -3
  37. package/dist/wire/src/rpc.js.map +1 -1
  38. package/dist/wire/src/updates.d.ts +356 -0
  39. package/dist/wire/src/updates.js +11 -1
  40. package/dist/wire/src/updates.js.map +1 -1
  41. package/package.json +12 -12
  42. package/src/accounts.ts +32 -0
  43. package/src/index.ts +4 -997
  44. package/src/main.ts +65 -0
  45. package/src/rate-limit.ts +72 -0
  46. package/src/relay.ts +435 -620
  47. package/src/serve.ts +130 -0
  48. package/src/store.ts +135 -0
  49. package/src/subscription.ts +51 -0
  50. package/dist/gateway/src/auth-middleware.d.ts +0 -44
  51. package/dist/gateway/src/auth-middleware.js +0 -204
  52. package/dist/gateway/src/auth-middleware.js.map +0 -1
  53. package/dist/gateway/src/cors.d.ts +0 -2
  54. package/dist/gateway/src/cors.js +0 -7
  55. package/dist/gateway/src/cors.js.map +0 -1
  56. package/dist/gateway/src/embedded.d.ts +0 -21
  57. package/dist/gateway/src/embedded.js +0 -438
  58. package/dist/gateway/src/embedded.js.map +0 -1
  59. package/dist/gateway/src/host-auth.d.ts +0 -32
  60. package/dist/gateway/src/host-auth.js +0 -78
  61. package/dist/gateway/src/host-auth.js.map +0 -1
  62. package/dist/gateway/src/pairings.d.ts +0 -38
  63. package/dist/gateway/src/pairings.js +0 -119
  64. package/dist/gateway/src/pairings.js.map +0 -1
  65. package/dist/gateway/src/presence.d.ts +0 -28
  66. package/dist/gateway/src/presence.js +0 -92
  67. package/dist/gateway/src/presence.js.map +0 -1
  68. package/dist/gateway/src/sessions.d.ts +0 -113
  69. package/dist/gateway/src/sessions.js +0 -352
  70. package/dist/gateway/src/sessions.js.map +0 -1
  71. package/dist/gateway/src/state-store.d.ts +0 -21
  72. package/dist/gateway/src/state-store.js +0 -103
  73. package/dist/gateway/src/state-store.js.map +0 -1
  74. package/dist/gateway/src/static-web.d.ts +0 -15
  75. package/dist/gateway/src/static-web.js +0 -129
  76. package/dist/gateway/src/static-web.js.map +0 -1
  77. package/dist/gateway/src/tokens.d.ts +0 -19
  78. package/dist/gateway/src/tokens.js +0 -151
  79. package/dist/gateway/src/tokens.js.map +0 -1
  80. package/dist/gateway/src/tunnel.d.ts +0 -61
  81. package/dist/gateway/src/tunnel.js +0 -576
  82. package/dist/gateway/src/tunnel.js.map +0 -1
  83. package/dist/gateway-v2/src/accounts.js.map +0 -1
  84. package/dist/gateway-v2/src/index.d.ts +0 -3
  85. package/dist/gateway-v2/src/index.js +0 -4
  86. package/dist/gateway-v2/src/index.js.map +0 -1
  87. package/dist/gateway-v2/src/main.js +0 -17
  88. package/dist/gateway-v2/src/main.js.map +0 -1
  89. package/dist/gateway-v2/src/server.d.ts +0 -84
  90. package/dist/gateway-v2/src/server.js +0 -426
  91. package/dist/gateway-v2/src/server.js.map +0 -1
  92. package/dist/gateway-v2/src/store.js.map +0 -1
  93. package/dist/shared-protocol/src/index.d.ts +0 -17029
  94. package/dist/shared-protocol/src/index.js +0 -1064
  95. package/dist/shared-protocol/src/index.js.map +0 -1
  96. package/src/auth-middleware.ts +0 -266
  97. package/src/cors.ts +0 -8
  98. package/src/embedded.ts +0 -526
  99. package/src/host-auth.ts +0 -88
  100. package/src/pairings.ts +0 -133
  101. package/src/presence.ts +0 -118
  102. package/src/sessions.ts +0 -432
  103. package/src/state-store.ts +0 -140
  104. package/src/static-web.ts +0 -133
  105. package/src/tokens.ts +0 -159
  106. package/src/tunnel.ts +0 -644
  107. /package/dist/{gateway-v2 → gateway}/src/accounts.d.ts +0 -0
  108. /package/dist/{gateway-v2 → gateway}/src/accounts.js +0 -0
  109. /package/dist/{gateway-v2 → gateway}/src/main.d.ts +0 -0
package/Dockerfile CHANGED
@@ -6,27 +6,18 @@ WORKDIR /app
6
6
  COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
7
7
  # pnpm checks every patched dependency in the lockfile against its patch file.
8
8
  COPY patches/ patches/
9
- COPY packages/shared-protocol/package.json packages/shared-protocol/
10
9
  COPY packages/wire/package.json packages/wire/
11
- COPY packages/gateway-v2/package.json packages/gateway-v2/
12
10
  COPY packages/gateway/package.json packages/gateway/
13
- COPY apps/web-dashboard/package.json apps/web-dashboard/
14
11
 
15
- RUN pnpm install --frozen-lockfile --filter @linkshell/gateway --filter @linkshell/protocol --filter @linkshell/wire --filter @linkshell/gateway-v2 --filter @linkshell/web-dashboard
12
+ RUN pnpm install --frozen-lockfile --filter @linkshell/gateway --filter @linkshell/wire
16
13
 
17
- COPY packages/shared-protocol/ packages/shared-protocol/
18
14
  COPY packages/wire/ packages/wire/
19
- COPY packages/gateway-v2/ packages/gateway-v2/
20
15
  COPY packages/gateway/ packages/gateway/
21
- COPY apps/web-dashboard/ apps/web-dashboard/
22
16
  COPY tsconfig.base.json ./
23
17
 
24
- # Libraries first (gateway + web depend on their built dist), then both apps.
25
- RUN pnpm --filter @linkshell/protocol build \
26
- && pnpm --filter @linkshell/wire build \
27
- && pnpm --filter @linkshell/gateway-v2 build \
28
- && pnpm --filter @linkshell/gateway build \
29
- && pnpm --filter @linkshell/web-dashboard build
18
+ # The wire protocol first: the gateway runs against its built dist.
19
+ RUN pnpm --filter @linkshell/wire build \
20
+ && pnpm --filter @linkshell/gateway build
30
21
 
31
22
  # Prune to production deps only (the app's patches don't apply to the gateway).
32
23
  RUN pnpm --filter @linkshell/gateway deploy --legacy --prod --config.allow-unused-patches=true /app/pruned
@@ -36,7 +27,7 @@ RUN pnpm --filter @linkshell/gateway deploy --legacy --prod --config.allow-unuse
36
27
  FROM node:22-alpine
37
28
 
38
29
  LABEL org.opencontainers.image.source="https://github.com/LiuTianjie/LinkShell"
39
- LABEL org.opencontainers.image.description="LinkShell Gateway — WebSocket relay for remote terminal sessions"
30
+ LABEL org.opencontainers.image.description="LinkShell Gateway — relays end-to-end encrypted frames between computers and phones, and brokers pairing"
40
31
 
41
32
  RUN addgroup -S linkshell && adduser -S linkshell -G linkshell
42
33
 
@@ -44,27 +35,22 @@ WORKDIR /app
44
35
 
45
36
  # Copy pruned production node_modules + built dist
46
37
  COPY --from=builder /app/pruned/node_modules node_modules/
47
- COPY --from=builder /app/packages/shared-protocol/dist packages/shared-protocol/dist/
48
- COPY --from=builder /app/packages/shared-protocol/package.json packages/shared-protocol/
49
38
  COPY --from=builder /app/packages/gateway/dist packages/gateway/dist/
39
+ # Also where /healthz reads the version from.
50
40
  COPY --from=builder /app/packages/gateway/package.json packages/gateway/
51
41
 
52
- # Built web UI — served same-origin by the gateway from WEB_DIST.
53
- COPY --from=builder /app/apps/web-dashboard/dist web/
54
-
55
42
  # Workspace root package.json needed for module resolution
56
43
  COPY --from=builder /app/package.json ./
57
44
 
58
- # The v2 relay keeps pairings and keys here: mount a persistent volume.
45
+ # Pairings and keys are kept here: mount a persistent volume.
59
46
  RUN mkdir -p /data && chown -R linkshell:linkshell /app /data
60
47
  USER linkshell
61
48
 
62
49
  ENV NODE_ENV=production
63
50
  ENV PORT=8787
64
- ENV WEB_DIST=/app/web
65
51
  ENV RELAY_DATA_PATH=/data/relay.db
66
52
  # Collect garbage well inside a 768 MB container instead of growing into its limit.
67
53
  ENV NODE_OPTIONS=--max-old-space-size=512
68
54
  EXPOSE 8787
69
55
 
70
- CMD ["node", "packages/gateway/dist/gateway/src/index.js"]
56
+ CMD ["node", "packages/gateway/dist/gateway/src/main.js"]
package/README.md CHANGED
@@ -1,77 +1,132 @@
1
1
  # @linkshell/gateway
2
2
 
3
- LinkShell Gateway — WebSocket 消息中转服务,连接 CLI 和手机 App。
3
+ LinkShell 网关:手机和电脑之间的中继。它用密钥认证两端,在允许互相访问的手机和电脑之间转发**端到端加密**的数据帧(网关读不了内容),并负责配对(二维码或 6 位配对码)。
4
4
 
5
- Gateway 不运行任何终端进程,只负责配对、会话管理和消息路由。
5
+ 官方网关(`gateway.itool.tech`)和自建网关运行的是同一份代码。区别只在配置:自建网关没有账号,靠配对;官方网关另外校验账号和 Pro 订阅。
6
6
 
7
- ## 部署
7
+ 需要 Node.js 22.13 或更新版本(数据用 Node 自带的 SQLite 保存)。完整的自建步骤(HTTPS、反向代理、连接手机)见[部署指南](https://github.com/LiuTianjie/LinkShell/blob/main/docs/deploy.md)。
8
8
 
9
- ### Docker(推荐)
9
+ ## 运行
10
+
11
+ ### 用 CLI
12
+
13
+ ```bash
14
+ npm i -g linkshell-cli
15
+ linkshell gateway --port 8787 --daemon
16
+ linkshell gateway status
17
+ linkshell gateway stop
18
+ ```
19
+
20
+ 数据保存在 `~/.linkshell/relay.db`,日志在 `~/.linkshell/gateway.log`。
21
+
22
+ ### 用 Docker
10
23
 
11
24
  ```bash
12
- docker compose up -d
25
+ docker run -d --name linkshell-gateway --restart unless-stopped \
26
+ -p 8787:8787 -v linkshell-gateway:/data \
27
+ nickname4th/linkshell-gateway:latest
13
28
  ```
14
29
 
15
- ### 直接运行
30
+ 数据在容器里的 `/data/relay.db`,所以要挂载卷。镜像目前只有 `linux/amd64`。
31
+
32
+ 从源码构建镜像:在仓库根目录运行 `docker compose up -d`。
33
+
34
+ ### 从源码
16
35
 
17
36
  ```bash
18
37
  pnpm install
38
+ pnpm --filter @linkshell/wire build
19
39
  pnpm --filter @linkshell/gateway build
20
- PORT=8787 node packages/gateway/dist/gateway/src/index.js
40
+ PORT=8787 RELAY_DATA_PATH=./data/relay.db node packages/gateway/dist/gateway/src/main.js
41
+
42
+ pnpm dev:gateway # 开发:tsx 直接运行 src/main.ts
43
+ ```
44
+
45
+ ### 作为库
46
+
47
+ ```ts
48
+ import { startGateway } from "@linkshell/gateway";
49
+
50
+ const gateway = await startGateway({ port: 8787, databasePath: "./relay.db" });
51
+ // gateway.port;结束时 await gateway.close()
21
52
  ```
22
53
 
54
+ `linkshell gateway` 就是这样启动它的。
55
+
23
56
  ## 环境变量
24
57
 
25
58
  | 变量 | 默认值 | 说明 |
26
59
  |------|--------|------|
27
60
  | `PORT` | `8787` | 监听端口 |
28
61
  | `LOG_LEVEL` | `info` | 日志级别:debug / info / warn / error |
29
- | `AUTH_REQUIRED` | `false` | 设为 `true` 后要求 Supabase JWT 并校验订阅 |
30
- | `SUPABASE_URL` | - | Supabase 项目 URL |
31
- | `SUPABASE_ANON_KEY` | - | Supabase anon key |
32
- | `SUPABASE_SERVICE_ROLE_KEY` | - | 服务端订阅检查和 Gateway 状态持久化使用 |
33
- | `SUPABASE_GATEWAY_TOKEN_TABLE` | `linkshell_gateway_tokens` | 设备 token 持久化表 |
34
- | `SUPABASE_GATEWAY_PAIRING_TABLE` | `linkshell_gateway_pairings` | 配对状态持久化表 |
35
- | `PAIRING_TTL_MS` | `600000` | 配对码有效期,默认 10 分钟 |
62
+ | `RELAY_DATA_PATH` | `./data/relay.db` | 数据文件(SQLite)。Docker 镜像里是 `/data/relay.db` |
63
+ | `TRUSTED_PROXIES` | 空 | 反向代理的 IP(网关看到的来源地址),逗号分隔。只有连接来自这些地址时才采信 `X-Forwarded-For`;留空则一律按直接连接的地址计算限流 |
64
+ | `WS_CONNECT_RATE_LIMIT_MAX` | `20` | 每个 IP 在一个时间窗口内允许的连接次数(本机回环地址不限) |
65
+ | `WS_CONNECT_RATE_LIMIT_WINDOW_MS` | `60000` | 上面的时间窗口 |
66
+ | `SUPABASE_URL`、`SUPABASE_ANON_KEY` | - | 两个都设置后启用账号:校验账号令牌,同一账号下的手机和电脑不用配对就能互相访问 |
67
+ | `AUTH_REQUIRED` | `false` | 设为 `true`:电脑必须登录账号并且订阅有效才能接入(手机不受影响) |
68
+ | `SUPABASE_SERVICE_ROLE_KEY` | - | `AUTH_REQUIRED=true` 时用它查询订阅 |
69
+
70
+ 自建网关一般只需要 `PORT` 和 `RELAY_DATA_PATH`。网关前面有反向代理时要留意连接限流按谁的地址算:
71
+
72
+ - 没有设置 `TRUSTED_PROXIES`:所有连接都算作来自代理的地址。代理在另一台机器或另一个容器里时,所有用户共用一份限额(每分钟 20 次连接);代理在本机(`127.0.0.1`)时则完全不限流。
73
+ - 设置为代理的地址(代理在本机时是 `127.0.0.1,::1`):按 `X-Forwarded-For` 里每个用户自己的地址分别限流。
36
74
 
37
- 启用官方服务版部署时,先在 Supabase 执行 `docs/supabase-gateway-state.sql`。表不存在时 Gateway 会退回内存态,但 Docker 重启后设备 token 和未过期配对状态不会恢复。
75
+ ### 带账号和订阅校验的部署
38
76
 
39
- ## API
77
+ 官方网关是这样配置的(见仓库根目录的 `luma-gateway.yml`):
40
78
 
41
- | 方法 | 路径 | 说明 |
79
+ ```bash
80
+ AUTH_REQUIRED=true
81
+ SUPABASE_URL=https://<project>.supabase.co
82
+ SUPABASE_ANON_KEY=...
83
+ SUPABASE_SERVICE_ROLE_KEY=...
84
+ ```
85
+
86
+ - 账号令牌通过 `${SUPABASE_URL}/auth/v1/user` 校验。
87
+ - 订阅查的是 `profiles` 表:`plan` 为 `pro` 且 `plan_expires_at` 晚于当前时间才算有效。
88
+ - 只在电脑连接时检查一次;查询本身失败(网络、配置问题)时放行,不会因为一次查询失败把用户挡在外面。
89
+
90
+ ## 接口
91
+
92
+ | | 路径 | 说明 |
42
93
  |------|------|------|
94
+ | `WS` | `/v2/connect` | 电脑(host)和手机 App 的连接 |
43
95
  | `GET` | `/healthz` | 健康检查 |
44
- | `POST` | `/pairings` | 创建配对(返回 6 位 code,默认 10 分钟有效) |
45
- | `POST` | `/pairings/claim` | 用 code 换取 sessionId |
46
- | `GET` | `/pairings/:code/status` | 查询配对状态 |
47
- | `GET` | `/sessions` | 列出活跃会话 |
48
- | `GET` | `/sessions/:id` | 会话详情 |
49
- | `WS` | `/ws?sessionId=&role=` | 实时连接(role=host 或 client) |
50
- | `GET/POST` | `/tunnel/:sessionId/:port/**` | HTTP 端口转发 |
51
- | `WS` | `/tunnel/:sessionId/:port/**` | WebSocket 端口转发(HMR) |
52
-
53
- ## 特性
54
-
55
- - 内存态会话管理,可选 Supabase 持久化设备 token 和配对状态
56
- - ACK 追踪 + 输出缓存(最近 200 条,client 重连时快速重放)
57
- - 单设备控制权管理(claim/grant/reject/release)
58
- - Agent Workspace v2 envelope 透传,支持 capabilities、snapshot、event、permission 和 structured input
59
- - Tunnel proxy 支持 HTTP 与 WebSocket,移动端可预览本地 dev server
60
- - 心跳 ping/pong 检测死连接(20s 间隔)
61
- - 会话 TTL(host 断开保留 60s,空闲 30min 清理)
62
- - IP 限流(配对 30 req/min,WebSocket 20 conn/min)
63
- - CORS 支持
64
- - 协议版本协商
65
- - 优雅关闭(SIGINT/SIGTERM)
96
+
97
+ 其他路径一律返回 404。
98
+
99
+ ```bash
100
+ curl http://localhost:8787/healthz
101
+ # {"ok":true,"version":"0.6.0","relay":2,"memoryMb":61}
102
+ ```
103
+
104
+ `relay` 是当前在线的连接数(电脑加手机),`memoryMb` 是进程占用的内存。
105
+
106
+ ## 数据文件
107
+
108
+ 全部数据就是一个 SQLite 文件:每台电脑、每台手机的公钥、名称和所属账号,以及哪台手机和哪台电脑配对。没有任何会话内容。
109
+
110
+ **这个文件丢了,所有手机都要重新配对。** 迁移或升级时带上它(Docker 就是保留那个卷);备份时连同旁边的 `-wal`、`-shm` 文件一起,或者先停掉网关。
111
+
112
+ ## 从 0.5.x 升级
113
+
114
+ 0.6.0 去掉了 1.x 的那一半,只保留中继:
115
+
116
+ - 1.x 的接口没有了:`/ws`、`/pairings*`、`/sessions*`、`/tunnel/*`,以及根路径上的网页控制台。1.x 的 App 和 `linkshell start` 不能再连接这个网关。
117
+ - 这些环境变量不再读取,可以删掉:`PAIRING_TTL_MS`、`PAIRING_RATE_LIMIT_*`、`CLAIM_FAILURE_RATE_LIMIT_*`、`SUPABASE_GATEWAY_TOKEN_TABLE`、`SUPABASE_GATEWAY_PAIRING_TABLE`、`SUPABASE_STATE_TIMEOUT_MS`、`WEB_DIST`。
118
+ - 数据文件和格式没有变:沿用原来的 `relay.db`(Docker 沿用原来的卷),已配对的手机不用重新配对。2.x 的 CLI 和 App 不需要任何改动。
119
+ - 作为库使用时:`@linkshell/gateway/embedded` 的 `startEmbeddedGateway` 换成 `startGateway`;`@linkshell/gateway-v2` 已并入本包,不再单独发布。
66
120
 
67
121
  ## 代码入口
68
122
 
69
- 如果要继续改 Gateway,优先从这几个文件进入:
123
+ 1. `src/relay.ts`:`Gateway`,认证、路由、配对、背压
124
+ 2. `src/store.ts`:SQLite 里的两张表(`peers`、`links`)
125
+ 3. `src/serve.ts`:`startGateway`,HTTP 服务、`/healthz`、连接限流
126
+ 4. `src/main.ts`:可执行入口,读环境变量后调用 `startGateway`
127
+ 5. `src/accounts.ts`、`src/subscription.ts`:账号令牌和订阅
70
128
 
71
- 1. src/index.ts
72
- 2. src/pairings.ts
73
- 3. src/sessions.ts
74
- 4. src/relay.ts
129
+ `/v2/connect` 这个路径和 `store.ts` 里的表结构不能改:已安装的每一台电脑和手机都依赖它们。
75
130
 
76
131
  ## License
77
132
 
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/accounts.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sDAAsD;AAStD,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAe;IAC3D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+C,CAAC;IACrE,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,eAAe,EAAE;gBAClD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBAC9D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YAC/B,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACvD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI;gBAAE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK;oBAAE,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;wBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzG,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1,4 @@
1
- export {};
1
+ export { Gateway, type GatewayOptions } from "./relay.js";
2
+ export { GatewayStore } from "./store.js";
3
+ export { supabaseVerifier, type Account, type VerifyToken } from "./accounts.js";
4
+ export { startGateway, type RunningGateway, type StartGatewayOptions } from "./serve.js";