@tienne/gestalt 0.109.0 → 0.110.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 (82) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/cli/commands/peer.d.ts +30 -0
  3. package/dist/src/cli/commands/peer.d.ts.map +1 -1
  4. package/dist/src/cli/commands/peer.js +159 -4
  5. package/dist/src/cli/commands/peer.js.map +1 -1
  6. package/dist/src/cli/index.d.ts.map +1 -1
  7. package/dist/src/cli/index.js +48 -2
  8. package/dist/src/cli/index.js.map +1 -1
  9. package/dist/src/peer/daemon.d.ts +17 -5
  10. package/dist/src/peer/daemon.d.ts.map +1 -1
  11. package/dist/src/peer/daemon.js +124 -15
  12. package/dist/src/peer/daemon.js.map +1 -1
  13. package/dist/src/peer/feed.d.ts +103 -0
  14. package/dist/src/peer/feed.d.ts.map +1 -0
  15. package/dist/src/peer/feed.js +167 -0
  16. package/dist/src/peer/feed.js.map +1 -0
  17. package/dist/src/peer/index.d.ts +10 -0
  18. package/dist/src/peer/index.d.ts.map +1 -1
  19. package/dist/src/peer/index.js +5 -0
  20. package/dist/src/peer/index.js.map +1 -1
  21. package/dist/src/peer/keys.d.ts +26 -0
  22. package/dist/src/peer/keys.d.ts.map +1 -0
  23. package/dist/src/peer/keys.js +95 -0
  24. package/dist/src/peer/keys.js.map +1 -0
  25. package/dist/src/peer/lock.d.ts +32 -0
  26. package/dist/src/peer/lock.d.ts.map +1 -0
  27. package/dist/src/peer/lock.js +147 -0
  28. package/dist/src/peer/lock.js.map +1 -0
  29. package/dist/src/peer/mirror.d.ts +21 -0
  30. package/dist/src/peer/mirror.d.ts.map +1 -0
  31. package/dist/src/peer/mirror.js +68 -0
  32. package/dist/src/peer/mirror.js.map +1 -0
  33. package/dist/src/peer/network.d.ts +148 -0
  34. package/dist/src/peer/network.d.ts.map +1 -0
  35. package/dist/src/peer/network.js +809 -0
  36. package/dist/src/peer/network.js.map +1 -0
  37. package/dist/src/peer/protocol.d.ts +52 -1
  38. package/dist/src/peer/protocol.d.ts.map +1 -1
  39. package/dist/src/peer/protocol.js +1 -0
  40. package/dist/src/peer/protocol.js.map +1 -1
  41. package/dist/src/peer/relay.d.ts +70 -0
  42. package/dist/src/peer/relay.d.ts.map +1 -0
  43. package/dist/src/peer/relay.js +410 -0
  44. package/dist/src/peer/relay.js.map +1 -0
  45. package/dist/src/peer/roster.d.ts +89 -0
  46. package/dist/src/peer/roster.d.ts.map +1 -0
  47. package/dist/src/peer/roster.js +160 -0
  48. package/dist/src/peer/roster.js.map +1 -0
  49. package/dist/src/peer/seal.d.ts +37 -0
  50. package/dist/src/peer/seal.d.ts.map +1 -0
  51. package/dist/src/peer/seal.js +115 -0
  52. package/dist/src/peer/seal.js.map +1 -0
  53. package/dist/src/peer/share.d.ts +4 -86
  54. package/dist/src/peer/share.d.ts.map +1 -1
  55. package/dist/src/peer/share.js +6 -140
  56. package/dist/src/peer/share.js.map +1 -1
  57. package/dist/src/peer/state.d.ts +35 -4
  58. package/dist/src/peer/state.d.ts.map +1 -1
  59. package/dist/src/peer/state.js +65 -3
  60. package/dist/src/peer/state.js.map +1 -1
  61. package/dist/src/peer/transport.d.ts +89 -0
  62. package/dist/src/peer/transport.d.ts.map +1 -0
  63. package/dist/src/peer/transport.js +345 -0
  64. package/dist/src/peer/transport.js.map +1 -0
  65. package/dist/src/peer/viewer-html.d.ts.map +1 -1
  66. package/dist/src/peer/viewer-html.js +10 -2
  67. package/dist/src/peer/viewer-html.js.map +1 -1
  68. package/dist/src/peer/viewer.d.ts +2 -2
  69. package/dist/src/peer/viewer.d.ts.map +1 -1
  70. package/dist/src/peer/viewer.js.map +1 -1
  71. package/dist/src/peer/wire.d.ts +90 -0
  72. package/dist/src/peer/wire.d.ts.map +1 -0
  73. package/dist/src/peer/wire.js +10 -0
  74. package/dist/src/peer/wire.js.map +1 -0
  75. package/dist/src/peer/ws.d.ts +47 -0
  76. package/dist/src/peer/ws.d.ts.map +1 -0
  77. package/dist/src/peer/ws.js +308 -0
  78. package/dist/src/peer/ws.js.map +1 -0
  79. package/package.json +1 -1
  80. package/plugin/.codex-plugin/plugin.json +1 -1
  81. package/plugin/.mcp.json +1 -1
  82. package/plugin/mcp.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/peer/network.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { ToolsLevel } from './redact.js';
2
- import type { ShareStatus } from './share.js';
2
+ import type { ShareStatus } from './feed.js';
3
+ import type { MemberInfo, TeamStatus } from './network.js';
4
+ export type { MemberInfo, TeamStatus };
3
5
  /** IPC 한 줄 요청. 줄 단위 JSON이다 */
4
6
  export type PeerRequest = {
5
7
  op: 'ping';
@@ -16,6 +18,30 @@ export type PeerRequest = {
16
18
  } | {
17
19
  op: 'unshare';
18
20
  id: string;
21
+ } | {
22
+ op: 'init';
23
+ person: string;
24
+ relay: string;
25
+ } | {
26
+ op: 'invite';
27
+ person: string;
28
+ } | {
29
+ op: 'join';
30
+ code: string;
31
+ timeoutMs?: number;
32
+ } | {
33
+ op: 'remove';
34
+ person: string;
35
+ } | {
36
+ op: 'members';
37
+ } | {
38
+ op: 'watch';
39
+ link: string;
40
+ } | {
41
+ op: 'watches';
42
+ } | {
43
+ op: 'unwatch';
44
+ id: string;
19
45
  };
20
46
  export type PeerResponse<T = unknown> = {
21
47
  ok: true;
@@ -43,6 +69,22 @@ export interface ShareInfo {
43
69
  droppedEvents: number;
44
70
  title?: string;
45
71
  url: string;
72
+ /** 팀에 들었으면 팀원에게 건넬 링크. 공유 키가 `#` 뒤에 붙는다 */
73
+ link?: string;
74
+ }
75
+ export interface WatchResult {
76
+ id: string;
77
+ share: string;
78
+ owner: string;
79
+ url: string;
80
+ }
81
+ export interface WatchListItem {
82
+ id: string;
83
+ share: string;
84
+ owner: string;
85
+ status: string;
86
+ events: number;
87
+ url: string;
46
88
  }
47
89
  export interface DaemonStatus {
48
90
  pid: number;
@@ -51,9 +93,18 @@ export interface DaemonStatus {
51
93
  startedAt: number;
52
94
  shares: number;
53
95
  viewers: number;
96
+ /** 기기 id(Ed25519 공개키) */
97
+ machineKey: string;
98
+ team: TeamStatus | null;
54
99
  }
55
100
  /** 한 요청 줄의 한도. 소켓은 0600이지만 같은 사용자의 프로세스가 메모리를 못 불리게 둔다 */
56
101
  export declare const MAX_REQUEST_BYTES: number;
102
+ /**
103
+ * 처음 붙는 팀원을 받는 방식. ask는 주인이 받아 주고 team은 명단에 있으면 바로 받는다.
104
+ * 기본은 ask다. 동작은 PR 4가 붙이고 지금은 명단에 있고 링크를 가진 팀원이면 바로 붙는다.
105
+ */
106
+ export type FirstWatchApproval = 'ask' | 'team';
107
+ export declare const DEFAULT_FIRST_WATCH_APPROVAL: FirstWatchApproval;
57
108
  /** 기본 만료. 설계 원문의 8시간 */
58
109
  export declare const DEFAULT_EXPIRES_MINUTES: number;
59
110
  /** 만료 상한. 공유를 사실상 영구로 열어 두지 못하게 한다 */
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/peer/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACd;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,GAChB;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,GAChB;IACE,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAE3C,wBAAwB;AACxB,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,sCAAsC;AACtC,eAAO,MAAM,mBAAmB,QAAc,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/peer/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAEvC,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACd;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,GAChB;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,GAChB;IACE,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,GACjB;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,GACjB;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACzB;AAED,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,CAAC;AAChD,eAAO,MAAM,4BAA4B,EAAE,kBAA0B,CAAC;AAEtE,wBAAwB;AACxB,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,sCAAsC;AACtC,eAAO,MAAM,mBAAmB,QAAc,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /** 한 요청 줄의 한도. 소켓은 0600이지만 같은 사용자의 프로세스가 메모리를 못 불리게 둔다 */
2
2
  export const MAX_REQUEST_BYTES = 64 * 1024;
3
+ export const DEFAULT_FIRST_WATCH_APPROVAL = 'ask';
3
4
  /** 기본 만료. 설계 원문의 8시간 */
4
5
  export const DEFAULT_EXPIRES_MINUTES = 8 * 60;
5
6
  /** 만료 상한. 공유를 사실상 영구로 열어 두지 못하게 한다 */
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/peer/protocol.ts"],"names":[],"mappings":"AAiDA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3C,wBAAwB;AACxB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,CAAC;AAE9C,sCAAsC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/peer/protocol.ts"],"names":[],"mappings":"AAiFA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAO3C,MAAM,CAAC,MAAM,4BAA4B,GAAuB,KAAK,CAAC;AAEtE,wBAAwB;AACxB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,CAAC;AAE9C,sCAAsC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC"}
@@ -0,0 +1,70 @@
1
+ export interface RelayServerOptions {
2
+ /** 팀 id. 처음 받는 명단은 이 키가 서명해야 한다 */
3
+ team: string;
4
+ host?: string;
5
+ port?: number;
6
+ /** 받은 명단을 남겨 둘 파일. 릴레이가 다시 떠도 내보낸 기기의 옛 명단을 안 받으려고 둔다 */
7
+ rosterFile?: string;
8
+ tls?: {
9
+ cert: Buffer;
10
+ key: Buffer;
11
+ };
12
+ /** 테스트가 릴레이를 지나는 프레임을 들여다볼 때 쓴다 */
13
+ onFrame?: (direction: 'in' | 'out', text: string) => void;
14
+ /** hello를 기다리는 시간 */
15
+ helloTimeoutMs?: number;
16
+ /** join 모드 연결이 명단에 오르기를 기다리는 시간 */
17
+ joinTimeoutMs?: number;
18
+ pingMs?: number;
19
+ }
20
+ /** 받는 쪽 소켓에 이만큼 넘게 밀려 있으면 그 연결을 끊는다. 안 읽는 기기 하나가 릴레이 메모리를 못 붙잡게 한다 */
21
+ export declare const MAX_RELAY_BUFFERED_BYTES: number;
22
+ /**
23
+ * `gestalt peer relay`. 팀이 한 대 띄우는 WebSocket 중계 서버다.
24
+ *
25
+ * 기기 키로 서명한 challenge로 접속을 받고 명단에 없는 키는 member로 안 받는다. 명단 밖
26
+ * 키는 join 모드로만 붙어 초대한 관리자에게 봉인한 요청 하나를 넘길 수 있다.
27
+ *
28
+ * 대화 기록은 쌓지 않는다. 받는 기기가 없으면 실패로 답한다. 쌓아 두는 건 관리자가 오프라인일
29
+ * 때의 join 요청뿐이고 메모리에만 둔다.
30
+ */
31
+ export declare class RelayServer {
32
+ private readonly options;
33
+ private server;
34
+ private roster;
35
+ private conns;
36
+ private members;
37
+ private pending;
38
+ private announced;
39
+ private joinQueue;
40
+ private pinger;
41
+ constructor(options: RelayServerOptions);
42
+ get port(): number | undefined;
43
+ get epoch(): number;
44
+ /** 지금 member로 붙어 있는 기기 id */
45
+ get onlineKeys(): string[];
46
+ start(): Promise<number>;
47
+ stop(): Promise<void>;
48
+ private accept;
49
+ private onMessage;
50
+ private hello;
51
+ /** member로 올린다. 같은 기기의 이전 연결은 닫는다 */
52
+ private admit;
53
+ private forward;
54
+ private announce;
55
+ private join;
56
+ private flushJoins;
57
+ /**
58
+ * 명단을 받는다. 받으면 모두에게 돌리고 빠진 기기는 바로 끊고 명단에 새로 오른 join 연결은
59
+ * member로 올린다.
60
+ */
61
+ private acceptRoster;
62
+ private drop;
63
+ private reject;
64
+ private broadcast;
65
+ private send;
66
+ private pingAll;
67
+ private loadRosterFile;
68
+ private saveRosterFile;
69
+ }
70
+ //# sourceMappingURL=relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../../src/peer/relay.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,qBAAqB;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqBD,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,QAAmB,CAAC;AAQzD;;;;;;;;GAQG;AACH,qBAAa,WAAW;IAUV,OAAO,CAAC,QAAQ,CAAC,OAAO;IATpC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,MAAM,CAA+B;gBAEhB,OAAO,EAAE,kBAAkB;IAIxD,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAG7B;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,6BAA6B;IAC7B,IAAI,UAAU,IAAI,MAAM,EAAE,CAEzB;IAEK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA4BxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,KAAK;IAsCb,qCAAqC;IACrC,OAAO,CAAC,KAAK;IAqBb,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,IAAI;IA4BZ,OAAO,CAAC,UAAU;IAUlB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,cAAc;CAWvB"}
@@ -0,0 +1,410 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
3
+ import { createServer as createHttpServer } from 'node:http';
4
+ import { createServer as createHttpsServer } from 'node:https';
5
+ import { isRawKey } from './keys.js';
6
+ import { checkRosterUpdate, isAdmin, memberOf } from './roster.js';
7
+ import { verifyText } from './seal.js';
8
+ import { acceptUpgrade } from './ws.js';
9
+ import { CLOSE_REJECTED, CLOSE_REMOVED, helloSigned } from './wire.js';
10
+ import { errMessage } from './errors.js';
11
+ /** 받는 쪽 소켓에 이만큼 넘게 밀려 있으면 그 연결을 끊는다. 안 읽는 기기 하나가 릴레이 메모리를 못 붙잡게 한다 */
12
+ export const MAX_RELAY_BUFFERED_BYTES = 16 * 1024 * 1024;
13
+ const MAX_JOIN_DATA = 16 * 1024;
14
+ const MAX_JOINS_PER_CONN = 3;
15
+ const MAX_QUEUED_JOINS = 64;
16
+ const JOIN_QUEUE_TTL_MS = 24 * 60 * 60 * 1000;
17
+ const MAX_ANNOUNCED_PER_CONN = 256;
18
+ const SHARE_ID = /^[A-Za-z0-9_-]{1,64}$/;
19
+ /**
20
+ * `gestalt peer relay`. 팀이 한 대 띄우는 WebSocket 중계 서버다.
21
+ *
22
+ * 기기 키로 서명한 challenge로 접속을 받고 명단에 없는 키는 member로 안 받는다. 명단 밖
23
+ * 키는 join 모드로만 붙어 초대한 관리자에게 봉인한 요청 하나를 넘길 수 있다.
24
+ *
25
+ * 대화 기록은 쌓지 않는다. 받는 기기가 없으면 실패로 답한다. 쌓아 두는 건 관리자가 오프라인일
26
+ * 때의 join 요청뿐이고 메모리에만 둔다.
27
+ */
28
+ export class RelayServer {
29
+ options;
30
+ server = null;
31
+ roster = null;
32
+ conns = new Set();
33
+ members = new Map();
34
+ pending = new Map();
35
+ announced = new Map();
36
+ joinQueue = [];
37
+ pinger = null;
38
+ constructor(options) {
39
+ this.options = options;
40
+ if (!isRawKey(options.team))
41
+ throw new Error('팀 id 꼴이 아니에요 (43자 base64url)');
42
+ }
43
+ get port() {
44
+ const addr = this.server?.address();
45
+ return addr && typeof addr === 'object' ? addr.port : undefined;
46
+ }
47
+ get epoch() {
48
+ return this.roster?.roster.epoch ?? 0;
49
+ }
50
+ /** 지금 member로 붙어 있는 기기 id */
51
+ get onlineKeys() {
52
+ return [...this.members.keys()];
53
+ }
54
+ async start() {
55
+ this.loadRosterFile();
56
+ const handler = (_req, res) => {
57
+ res.writeHead(426, { 'Content-Type': 'text/plain; charset=utf-8' });
58
+ res.end('gestalt peer relay: WebSocket only\n');
59
+ };
60
+ const server = this.options.tls
61
+ ? createHttpsServer({ cert: this.options.tls.cert, key: this.options.tls.key }, handler)
62
+ : createHttpServer(handler);
63
+ server.on('upgrade', (req, socket, head) => {
64
+ const ws = acceptUpgrade(req, socket, head);
65
+ if (ws)
66
+ this.accept(ws);
67
+ });
68
+ server.on('clientError', (_err, socket) => socket.destroy());
69
+ this.server = server;
70
+ await new Promise((resolve, reject) => {
71
+ server.once('error', reject);
72
+ server.listen(this.options.port ?? 0, this.options.host ?? '0.0.0.0', () => {
73
+ server.off('error', reject);
74
+ server.on('error', (err) => process.stderr.write(`[peer-relay] ${err.message}\n`));
75
+ resolve();
76
+ });
77
+ });
78
+ this.pinger = setInterval(() => this.pingAll(), this.options.pingMs ?? 30_000);
79
+ this.pinger.unref();
80
+ return this.port;
81
+ }
82
+ async stop() {
83
+ if (this.pinger)
84
+ clearInterval(this.pinger);
85
+ this.pinger = null;
86
+ for (const c of this.conns)
87
+ c.ws.terminate(1001, 'relay stop');
88
+ this.conns.clear();
89
+ this.members.clear();
90
+ this.pending.clear();
91
+ this.announced.clear();
92
+ const server = this.server;
93
+ this.server = null;
94
+ if (!server)
95
+ return;
96
+ server.closeAllConnections?.();
97
+ await new Promise((resolve) => server.close(() => resolve()));
98
+ }
99
+ accept(ws) {
100
+ const conn = {
101
+ ws,
102
+ nonce: randomBytes(24).toString('base64url'),
103
+ member: false,
104
+ joins: 0,
105
+ alive: true,
106
+ };
107
+ this.conns.add(conn);
108
+ conn.timer = setTimeout(() => ws.close(CLOSE_REJECTED, 'hello timeout'), this.options.helloTimeoutMs ?? 10_000);
109
+ conn.timer.unref();
110
+ ws.on('pong', () => (conn.alive = true));
111
+ ws.on('message', (text) => {
112
+ this.options.onFrame?.('in', text);
113
+ try {
114
+ this.onMessage(conn, text);
115
+ }
116
+ catch (err) {
117
+ process.stderr.write(`[peer-relay] frame failed: ${errMessage(err)}\n`);
118
+ this.reject(conn, 'bad_frame', '프레임을 처리하지 못했어요');
119
+ }
120
+ });
121
+ ws.on('close', () => this.drop(conn));
122
+ this.send(conn, { t: 'challenge', nonce: conn.nonce });
123
+ }
124
+ onMessage(conn, text) {
125
+ let frame;
126
+ try {
127
+ frame = JSON.parse(text);
128
+ }
129
+ catch {
130
+ return this.reject(conn, 'bad_frame', 'JSON이 아니에요');
131
+ }
132
+ if (typeof frame !== 'object' || frame === null || typeof frame.t !== 'string') {
133
+ return this.reject(conn, 'bad_frame', 't가 없어요');
134
+ }
135
+ if (!conn.key) {
136
+ if (frame.t !== 'hello')
137
+ return this.reject(conn, 'bad_frame', 'hello부터 보내야 해요');
138
+ return this.hello(conn, frame);
139
+ }
140
+ if (!conn.member) {
141
+ if (frame.t === 'join')
142
+ return this.join(conn, frame);
143
+ return;
144
+ }
145
+ switch (frame.t) {
146
+ case 'send':
147
+ return this.forward(conn, frame);
148
+ case 'resolve': {
149
+ if (!Number.isSafeInteger(frame.id))
150
+ return;
151
+ const owner = typeof frame.share === 'string' ? this.announced.get(frame.share) : undefined;
152
+ this.send(conn, { t: 'resolved', id: frame.id, owner: owner ?? null });
153
+ return;
154
+ }
155
+ case 'announce':
156
+ return this.announce(conn, frame.shares);
157
+ case 'roster': {
158
+ const verdict = this.acceptRoster(frame.roster);
159
+ if (!verdict.ok) {
160
+ this.send(conn, { t: 'error', code: 'bad_signature', message: verdict.reason });
161
+ }
162
+ return;
163
+ }
164
+ default:
165
+ return;
166
+ }
167
+ }
168
+ hello(conn, frame) {
169
+ if (frame.team !== this.options.team)
170
+ return this.reject(conn, 'wrong_team', '다른 팀이에요');
171
+ if (frame.mode !== 'member' && frame.mode !== 'join') {
172
+ return this.reject(conn, 'bad_frame', 'mode가 틀렸어요');
173
+ }
174
+ if (!isRawKey(frame.key) ||
175
+ !verifyText(frame.key, helloSigned(frame.team, conn.nonce, frame.mode), frame.sig)) {
176
+ return this.reject(conn, 'bad_signature', 'hello 서명이 맞지 않아요');
177
+ }
178
+ if (conn.timer)
179
+ clearTimeout(conn.timer);
180
+ conn.key = frame.key;
181
+ conn.mode = frame.mode;
182
+ // 들고 온 명단이 더 새것이면 받는다. 낮거나 서명이 틀리면 조용히 버린다
183
+ if (frame.roster !== undefined)
184
+ this.acceptRoster(frame.roster);
185
+ const roster = this.roster;
186
+ if (roster && memberOf(roster.roster, frame.key)) {
187
+ this.admit(conn);
188
+ return;
189
+ }
190
+ if (frame.mode === 'member') {
191
+ if (!roster)
192
+ return this.reject(conn, 'no_roster', '릴레이가 아직 팀 명단을 못 받았어요');
193
+ return this.reject(conn, 'not_member', '명단에 없는 기기예요', CLOSE_REMOVED);
194
+ }
195
+ const prev = this.pending.get(frame.key);
196
+ if (prev)
197
+ prev.ws.close(4000, 'replaced');
198
+ this.pending.set(frame.key, conn);
199
+ conn.timer = setTimeout(() => conn.ws.close(CLOSE_REJECTED, 'join timeout'), this.options.joinTimeoutMs ?? 120_000);
200
+ conn.timer.unref();
201
+ this.send(conn, { t: 'pending' });
202
+ }
203
+ /** member로 올린다. 같은 기기의 이전 연결은 닫는다 */
204
+ admit(conn) {
205
+ const key = conn.key;
206
+ if (conn.timer)
207
+ clearTimeout(conn.timer);
208
+ if (this.pending.get(key) === conn)
209
+ this.pending.delete(key);
210
+ const prev = this.members.get(key);
211
+ if (prev && prev !== conn) {
212
+ this.members.delete(key);
213
+ prev.member = false;
214
+ prev.ws.close(4000, 'replaced');
215
+ }
216
+ conn.member = true;
217
+ this.members.set(key, conn);
218
+ this.send(conn, {
219
+ t: 'welcome',
220
+ roster: this.roster,
221
+ online: [...this.members.keys()].filter((k) => k !== key),
222
+ });
223
+ this.broadcast({ t: 'presence', key, online: true }, conn);
224
+ this.flushJoins(key);
225
+ }
226
+ forward(conn, frame) {
227
+ if (!Number.isSafeInteger(frame.id))
228
+ return;
229
+ const ack = (ok, error) => {
230
+ if (frame.ack === false)
231
+ return;
232
+ this.send(conn, { t: 'ack', id: frame.id, ok, ...(error ? { error } : {}) });
233
+ };
234
+ if (typeof frame.to !== 'string' || typeof frame.data !== 'string')
235
+ return ack(false, 'bad_frame');
236
+ const target = this.members.get(frame.to);
237
+ if (!target)
238
+ return ack(false, 'offline');
239
+ if (target.ws.bufferedAmount > MAX_RELAY_BUFFERED_BYTES) {
240
+ target.ws.terminate(1008, 'slow');
241
+ return ack(false, 'slow');
242
+ }
243
+ this.send(target, { t: 'recv', from: conn.key, data: frame.data });
244
+ ack(true);
245
+ }
246
+ announce(conn, shares) {
247
+ if (!Array.isArray(shares) || shares.length > MAX_ANNOUNCED_PER_CONN)
248
+ return;
249
+ const key = conn.key;
250
+ const wanted = new Set(shares.filter((s) => typeof s === 'string' && SHARE_ID.test(s)));
251
+ for (const [id, owner] of [...this.announced]) {
252
+ if (owner === key && !wanted.has(id))
253
+ this.announced.delete(id);
254
+ }
255
+ for (const id of wanted) {
256
+ const owner = this.announced.get(id);
257
+ // 먼저 알린 기기가 붙어 있으면 그대로 둔다. 남의 공유 id를 가로채지 못하게
258
+ if (owner && owner !== key && this.members.has(owner))
259
+ continue;
260
+ this.announced.set(id, key);
261
+ }
262
+ }
263
+ join(conn, frame) {
264
+ if (frame.t !== 'join')
265
+ return;
266
+ conn.joins++;
267
+ if (conn.joins > MAX_JOINS_PER_CONN) {
268
+ return this.reject(conn, 'rate_limited', 'join 요청이 너무 많아요');
269
+ }
270
+ const roster = this.roster;
271
+ if (!roster ||
272
+ typeof frame.to !== 'string' ||
273
+ !isAdmin(roster.roster, frame.to) ||
274
+ typeof frame.data !== 'string' ||
275
+ frame.data.length > MAX_JOIN_DATA) {
276
+ return;
277
+ }
278
+ const item = { to: frame.to, from: conn.key, data: frame.data, at: Date.now() };
279
+ const admin = this.members.get(frame.to);
280
+ if (admin) {
281
+ this.send(admin, { t: 'join', from: item.from, data: item.data });
282
+ return;
283
+ }
284
+ // 관리자가 오프라인이면 붙을 때까지 들고 있는다. 같은 기기가 다시 보내면 앞의 것을 바꾼다
285
+ this.joinQueue = this.joinQueue.filter((q) => !(q.from === item.from && q.to === item.to));
286
+ this.joinQueue.push(item);
287
+ if (this.joinQueue.length > MAX_QUEUED_JOINS)
288
+ this.joinQueue.shift();
289
+ }
290
+ flushJoins(key) {
291
+ const now = Date.now();
292
+ this.joinQueue = this.joinQueue.filter((q) => now - q.at < JOIN_QUEUE_TTL_MS);
293
+ const target = this.members.get(key);
294
+ if (!target)
295
+ return;
296
+ const mine = this.joinQueue.filter((q) => q.to === key);
297
+ this.joinQueue = this.joinQueue.filter((q) => q.to !== key);
298
+ for (const q of mine)
299
+ this.send(target, { t: 'join', from: q.from, data: q.data });
300
+ }
301
+ /**
302
+ * 명단을 받는다. 받으면 모두에게 돌리고 빠진 기기는 바로 끊고 명단에 새로 오른 join 연결은
303
+ * member로 올린다.
304
+ */
305
+ acceptRoster(incoming) {
306
+ const verdict = checkRosterUpdate(this.roster, incoming, {
307
+ team: this.options.team,
308
+ anchor: this.options.team,
309
+ });
310
+ if (!verdict.ok)
311
+ return verdict;
312
+ const roster = incoming;
313
+ this.roster = roster;
314
+ this.saveRosterFile();
315
+ for (const [key, conn] of [...this.members]) {
316
+ if (memberOf(roster.roster, key))
317
+ continue;
318
+ this.members.delete(key);
319
+ conn.member = false;
320
+ for (const [id, owner] of [...this.announced])
321
+ if (owner === key)
322
+ this.announced.delete(id);
323
+ conn.ws.close(CLOSE_REMOVED, 'removed');
324
+ this.broadcast({ t: 'presence', key, online: false });
325
+ }
326
+ this.broadcast({ t: 'roster', roster });
327
+ for (const [key, conn] of [...this.pending]) {
328
+ if (memberOf(roster.roster, key))
329
+ this.admit(conn);
330
+ }
331
+ return verdict;
332
+ }
333
+ drop(conn) {
334
+ if (conn.timer)
335
+ clearTimeout(conn.timer);
336
+ this.conns.delete(conn);
337
+ const key = conn.key;
338
+ if (!key)
339
+ return;
340
+ if (this.pending.get(key) === conn)
341
+ this.pending.delete(key);
342
+ if (this.members.get(key) === conn) {
343
+ this.members.delete(key);
344
+ for (const [id, owner] of [...this.announced])
345
+ if (owner === key)
346
+ this.announced.delete(id);
347
+ this.broadcast({ t: 'presence', key, online: false });
348
+ }
349
+ }
350
+ reject(conn, code, message, closeCode = CLOSE_REJECTED) {
351
+ this.send(conn, { t: 'error', code, message });
352
+ conn.ws.close(closeCode, code);
353
+ }
354
+ broadcast(frame, except) {
355
+ for (const c of this.members.values())
356
+ if (c !== except)
357
+ this.send(c, frame);
358
+ }
359
+ send(conn, frame) {
360
+ const text = JSON.stringify(frame);
361
+ this.options.onFrame?.('out', text);
362
+ conn.ws.send(text);
363
+ }
364
+ pingAll() {
365
+ for (const c of this.conns) {
366
+ if (!c.alive) {
367
+ c.ws.terminate(1006, 'no pong');
368
+ continue;
369
+ }
370
+ c.alive = false;
371
+ c.ws.ping();
372
+ }
373
+ }
374
+ loadRosterFile() {
375
+ const file = this.options.rosterFile;
376
+ if (!file || !existsSync(file))
377
+ return;
378
+ let saved;
379
+ try {
380
+ saved = JSON.parse(readFileSync(file, 'utf8'));
381
+ }
382
+ catch {
383
+ process.stderr.write(`[peer-relay] 명단 파일을 못 읽어 버려요: ${file}\n`);
384
+ return;
385
+ }
386
+ // 파일에 남은 명단도 서명을 다시 본다. 판의 차례는 처음 받는 것처럼 팀 id 서명만 믿는다
387
+ const verdict = checkRosterUpdate(null, saved, {
388
+ team: this.options.team,
389
+ anchor: this.options.team,
390
+ });
391
+ if (verdict.ok)
392
+ this.roster = saved;
393
+ else
394
+ process.stderr.write(`[peer-relay] 명단 파일을 버려요: ${verdict.reason}\n`);
395
+ }
396
+ saveRosterFile() {
397
+ const file = this.options.rosterFile;
398
+ if (!file || !this.roster)
399
+ return;
400
+ const tmp = `${file}.${process.pid}.tmp`;
401
+ try {
402
+ writeFileSync(tmp, JSON.stringify(this.roster) + '\n', { mode: 0o600 });
403
+ renameSync(tmp, file);
404
+ }
405
+ catch (err) {
406
+ process.stderr.write(`[peer-relay] 명단 파일을 못 썼어요: ${errMessage(err)}\n`);
407
+ }
408
+ }
409
+ }
410
+ //# sourceMappingURL=relay.js.map