@tienne/gestalt 0.109.0 → 0.111.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.
- package/dist/package.json +1 -1
- package/dist/src/cli/commands/peer.d.ts +30 -0
- package/dist/src/cli/commands/peer.d.ts.map +1 -1
- package/dist/src/cli/commands/peer.js +159 -4
- package/dist/src/cli/commands/peer.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +48 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/digest/render-html.d.ts +5 -0
- package/dist/src/digest/render-html.d.ts.map +1 -1
- package/dist/src/digest/render-html.js +31 -10
- package/dist/src/digest/render-html.js.map +1 -1
- package/dist/src/digest/render-lens.d.ts +1 -1
- package/dist/src/digest/render-lens.d.ts.map +1 -1
- package/dist/src/digest/render-lens.js +17 -2
- package/dist/src/digest/render-lens.js.map +1 -1
- package/dist/src/digest/server.d.ts.map +1 -1
- package/dist/src/digest/server.js +7 -4
- package/dist/src/digest/server.js.map +1 -1
- package/dist/src/digest/theme-diary.d.ts +10 -0
- package/dist/src/digest/theme-diary.d.ts.map +1 -0
- package/dist/src/digest/theme-diary.js +111 -0
- package/dist/src/digest/theme-diary.js.map +1 -0
- package/dist/src/digest/viewer-js.d.ts +6 -0
- package/dist/src/digest/viewer-js.d.ts.map +1 -1
- package/dist/src/digest/viewer-js.js +78 -4
- package/dist/src/digest/viewer-js.js.map +1 -1
- package/dist/src/peer/daemon.d.ts +17 -5
- package/dist/src/peer/daemon.d.ts.map +1 -1
- package/dist/src/peer/daemon.js +124 -15
- package/dist/src/peer/daemon.js.map +1 -1
- package/dist/src/peer/feed.d.ts +103 -0
- package/dist/src/peer/feed.d.ts.map +1 -0
- package/dist/src/peer/feed.js +167 -0
- package/dist/src/peer/feed.js.map +1 -0
- package/dist/src/peer/index.d.ts +10 -0
- package/dist/src/peer/index.d.ts.map +1 -1
- package/dist/src/peer/index.js +5 -0
- package/dist/src/peer/index.js.map +1 -1
- package/dist/src/peer/keys.d.ts +26 -0
- package/dist/src/peer/keys.d.ts.map +1 -0
- package/dist/src/peer/keys.js +95 -0
- package/dist/src/peer/keys.js.map +1 -0
- package/dist/src/peer/lock.d.ts +32 -0
- package/dist/src/peer/lock.d.ts.map +1 -0
- package/dist/src/peer/lock.js +147 -0
- package/dist/src/peer/lock.js.map +1 -0
- package/dist/src/peer/mirror.d.ts +21 -0
- package/dist/src/peer/mirror.d.ts.map +1 -0
- package/dist/src/peer/mirror.js +68 -0
- package/dist/src/peer/mirror.js.map +1 -0
- package/dist/src/peer/network.d.ts +148 -0
- package/dist/src/peer/network.d.ts.map +1 -0
- package/dist/src/peer/network.js +809 -0
- package/dist/src/peer/network.js.map +1 -0
- package/dist/src/peer/protocol.d.ts +52 -1
- package/dist/src/peer/protocol.d.ts.map +1 -1
- package/dist/src/peer/protocol.js +1 -0
- package/dist/src/peer/protocol.js.map +1 -1
- package/dist/src/peer/relay.d.ts +70 -0
- package/dist/src/peer/relay.d.ts.map +1 -0
- package/dist/src/peer/relay.js +410 -0
- package/dist/src/peer/relay.js.map +1 -0
- package/dist/src/peer/roster.d.ts +89 -0
- package/dist/src/peer/roster.d.ts.map +1 -0
- package/dist/src/peer/roster.js +160 -0
- package/dist/src/peer/roster.js.map +1 -0
- package/dist/src/peer/seal.d.ts +37 -0
- package/dist/src/peer/seal.d.ts.map +1 -0
- package/dist/src/peer/seal.js +115 -0
- package/dist/src/peer/seal.js.map +1 -0
- package/dist/src/peer/share.d.ts +4 -86
- package/dist/src/peer/share.d.ts.map +1 -1
- package/dist/src/peer/share.js +6 -140
- package/dist/src/peer/share.js.map +1 -1
- package/dist/src/peer/state.d.ts +35 -4
- package/dist/src/peer/state.d.ts.map +1 -1
- package/dist/src/peer/state.js +65 -3
- package/dist/src/peer/state.js.map +1 -1
- package/dist/src/peer/transport.d.ts +89 -0
- package/dist/src/peer/transport.d.ts.map +1 -0
- package/dist/src/peer/transport.js +345 -0
- package/dist/src/peer/transport.js.map +1 -0
- package/dist/src/peer/viewer-html.d.ts.map +1 -1
- package/dist/src/peer/viewer-html.js +10 -2
- package/dist/src/peer/viewer-html.js.map +1 -1
- package/dist/src/peer/viewer.d.ts +2 -2
- package/dist/src/peer/viewer.d.ts.map +1 -1
- package/dist/src/peer/viewer.js.map +1 -1
- package/dist/src/peer/wire.d.ts +90 -0
- package/dist/src/peer/wire.d.ts.map +1 -0
- package/dist/src/peer/wire.js +10 -0
- package/dist/src/peer/wire.js.map +1 -0
- package/dist/src/peer/ws.d.ts +47 -0
- package/dist/src/peer/ws.d.ts.map +1 -0
- package/dist/src/peer/ws.js +308 -0
- package/dist/src/peer/ws.js.map +1 -0
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/peer/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { MachineKey } from './keys.js';
|
|
2
|
+
/**
|
|
3
|
+
* 팀 명단. 관리자 키로 서명한 문서 하나이고 판(epoch) 번호가 있다.
|
|
4
|
+
*
|
|
5
|
+
* 팀 id는 팀을 만든 관리자의 기기 id다. 릴레이와 처음 명단을 받는 쪽은 이 id를 믿을
|
|
6
|
+
* 출발점으로 삼는다. 판을 올린 명단은 지금 들고 있는 명단의 관리자가 서명해야 받는다.
|
|
7
|
+
*/
|
|
8
|
+
export type Role = 'admin' | 'member';
|
|
9
|
+
export interface RosterMember {
|
|
10
|
+
person: string;
|
|
11
|
+
/** 기기 id(Ed25519 공개키) */
|
|
12
|
+
machineKey: string;
|
|
13
|
+
/** X25519 공개키 */
|
|
14
|
+
boxKey: string;
|
|
15
|
+
role: Role;
|
|
16
|
+
addedAt: number;
|
|
17
|
+
}
|
|
18
|
+
export interface Roster {
|
|
19
|
+
v: 1;
|
|
20
|
+
team: string;
|
|
21
|
+
epoch: number;
|
|
22
|
+
/** 팀 릴레이 주소. `ws://` 또는 `wss://` */
|
|
23
|
+
relay: string;
|
|
24
|
+
members: RosterMember[];
|
|
25
|
+
issuedAt: number;
|
|
26
|
+
/** 서명한 관리자 기기 id */
|
|
27
|
+
issuer: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SignedRoster {
|
|
30
|
+
roster: Roster;
|
|
31
|
+
sig: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function isPersonName(value: unknown): value is string;
|
|
34
|
+
export declare function isRelayUrl(value: unknown): value is string;
|
|
35
|
+
export declare function signRoster(roster: Roster, key: MachineKey): SignedRoster;
|
|
36
|
+
export declare function memberOf(roster: Roster, machineKey: string): RosterMember | undefined;
|
|
37
|
+
export declare function isAdmin(roster: Roster, machineKey: string): boolean;
|
|
38
|
+
export type RosterVerdict = {
|
|
39
|
+
ok: true;
|
|
40
|
+
} | {
|
|
41
|
+
ok: false;
|
|
42
|
+
reason: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 새 명단을 받을지 정한다.
|
|
46
|
+
*
|
|
47
|
+
* - 지금 명단이 없으면 `anchor`(팀 id나 초대한 관리자 id)가 서명하고 그 키가 새 명단의
|
|
48
|
+
* 관리자여야 한다.
|
|
49
|
+
* - 지금 명단이 있으면 판이 더 높고 지금 명단의 관리자가 서명해야 한다. 같은 판은 다시
|
|
50
|
+
* 받지 않는다 — 같은 판에 다른 내용을 서명해 돌리는 걸 막는다.
|
|
51
|
+
*/
|
|
52
|
+
export declare function checkRosterUpdate(current: SignedRoster | null, incoming: unknown, expect: {
|
|
53
|
+
team: string;
|
|
54
|
+
anchor: string;
|
|
55
|
+
}): RosterVerdict;
|
|
56
|
+
/** 같은 내용을 다시 서명하지 않고 한 판 올린 새 명단을 만든다 */
|
|
57
|
+
export declare function nextRoster(current: Roster, members: RosterMember[], issuer: string, now?: number): Roster;
|
|
58
|
+
/**
|
|
59
|
+
* 초대 코드. 관리자가 만들어 사람에게 건넨다. 1회용이고 24시간 유효하다.
|
|
60
|
+
* `secret`은 관리자 데몬만 들고 있다가 join 요청의 증명을 맞춰 본다.
|
|
61
|
+
*/
|
|
62
|
+
export interface Invite {
|
|
63
|
+
v: 1;
|
|
64
|
+
team: string;
|
|
65
|
+
relay: string;
|
|
66
|
+
/** 초대한 관리자 기기 id와 X25519 공개키. join 요청을 이 키에 봉인한다 */
|
|
67
|
+
admin: string;
|
|
68
|
+
adminBox: string;
|
|
69
|
+
id: string;
|
|
70
|
+
secret: string;
|
|
71
|
+
person: string;
|
|
72
|
+
expiresAt: number;
|
|
73
|
+
}
|
|
74
|
+
export declare function encodeInvite(invite: Invite): string;
|
|
75
|
+
export declare function decodeInvite(code: string): Invite;
|
|
76
|
+
/** join 요청에 싣는 증명. 초대 코드를 가진 사람만 만든다 */
|
|
77
|
+
export declare function joinProofText(inviteId: string, machineKey: string, boxKey: string): string;
|
|
78
|
+
/**
|
|
79
|
+
* 공유 링크. `gestalt://peer/<릴레이 호스트>/<공유 id>#<공유 키>`.
|
|
80
|
+
* 공유 키는 `#` 뒤라 릴레이로 안 간다.
|
|
81
|
+
*/
|
|
82
|
+
export interface ShareLink {
|
|
83
|
+
relayHost: string;
|
|
84
|
+
shareId: string;
|
|
85
|
+
shareKey: string;
|
|
86
|
+
}
|
|
87
|
+
export declare function formatShareLink(relayUrl: string, shareId: string, shareKey: string): string;
|
|
88
|
+
export declare function parseShareLink(link: string): ShareLink;
|
|
89
|
+
//# sourceMappingURL=roster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../../src/peer/roster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { isRawKey } from './keys.js';
|
|
2
|
+
import { canonical, signText, verifyText } from './seal.js';
|
|
3
|
+
const PERSON = /^[\p{L}\p{N}._-]{1,32}$/u;
|
|
4
|
+
export function isPersonName(value) {
|
|
5
|
+
return typeof value === 'string' && PERSON.test(value);
|
|
6
|
+
}
|
|
7
|
+
export function isRelayUrl(value) {
|
|
8
|
+
if (typeof value !== 'string' || value.length > 512)
|
|
9
|
+
return false;
|
|
10
|
+
try {
|
|
11
|
+
const u = new URL(value);
|
|
12
|
+
return (u.protocol === 'ws:' || u.protocol === 'wss:') && u.host !== '';
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** 서명할 바이트. 목적 문자열을 앞에 붙여 다른 서명과 섞이지 않게 한다 */
|
|
19
|
+
function rosterSigned(roster) {
|
|
20
|
+
return `gestalt-peer-roster-v1\n${canonical(roster)}`;
|
|
21
|
+
}
|
|
22
|
+
export function signRoster(roster, key) {
|
|
23
|
+
if (roster.issuer !== key.id)
|
|
24
|
+
throw new Error('명단의 issuer와 서명하는 키가 달라요');
|
|
25
|
+
return { roster, sig: signText(key, rosterSigned(roster)) };
|
|
26
|
+
}
|
|
27
|
+
export function memberOf(roster, machineKey) {
|
|
28
|
+
return roster.members.find((m) => m.machineKey === machineKey);
|
|
29
|
+
}
|
|
30
|
+
export function isAdmin(roster, machineKey) {
|
|
31
|
+
return memberOf(roster, machineKey)?.role === 'admin';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 새 명단을 받을지 정한다.
|
|
35
|
+
*
|
|
36
|
+
* - 지금 명단이 없으면 `anchor`(팀 id나 초대한 관리자 id)가 서명하고 그 키가 새 명단의
|
|
37
|
+
* 관리자여야 한다.
|
|
38
|
+
* - 지금 명단이 있으면 판이 더 높고 지금 명단의 관리자가 서명해야 한다. 같은 판은 다시
|
|
39
|
+
* 받지 않는다 — 같은 판에 다른 내용을 서명해 돌리는 걸 막는다.
|
|
40
|
+
*/
|
|
41
|
+
export function checkRosterUpdate(current, incoming, expect) {
|
|
42
|
+
const shape = checkShape(incoming);
|
|
43
|
+
if (!shape.ok)
|
|
44
|
+
return shape;
|
|
45
|
+
const { roster, sig } = incoming;
|
|
46
|
+
if (roster.team !== expect.team)
|
|
47
|
+
return { ok: false, reason: '다른 팀의 명단이에요' };
|
|
48
|
+
if (!verifyText(roster.issuer, rosterSigned(roster), sig)) {
|
|
49
|
+
return { ok: false, reason: '명단 서명이 맞지 않아요' };
|
|
50
|
+
}
|
|
51
|
+
if (!isAdmin(roster, roster.issuer)) {
|
|
52
|
+
return { ok: false, reason: '서명한 키가 새 명단의 관리자가 아니에요' };
|
|
53
|
+
}
|
|
54
|
+
if (!current) {
|
|
55
|
+
if (roster.issuer !== expect.anchor) {
|
|
56
|
+
return { ok: false, reason: '믿을 수 있는 관리자가 서명한 명단이 아니에요' };
|
|
57
|
+
}
|
|
58
|
+
return { ok: true };
|
|
59
|
+
}
|
|
60
|
+
if (roster.epoch <= current.roster.epoch) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
reason: `판이 낮거나 같아요 (지금 ${current.roster.epoch}, 받은 것 ${roster.epoch})`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (!isAdmin(current.roster, roster.issuer)) {
|
|
67
|
+
return { ok: false, reason: '지금 명단의 관리자가 서명하지 않았어요' };
|
|
68
|
+
}
|
|
69
|
+
return { ok: true };
|
|
70
|
+
}
|
|
71
|
+
function checkShape(value) {
|
|
72
|
+
const bad = (reason) => ({ ok: false, reason: `명단 형식: ${reason}` });
|
|
73
|
+
if (typeof value !== 'object' || value === null)
|
|
74
|
+
return bad('객체가 아니에요');
|
|
75
|
+
const { roster, sig } = value;
|
|
76
|
+
if (typeof sig !== 'string')
|
|
77
|
+
return bad('서명이 없어요');
|
|
78
|
+
if (typeof roster !== 'object' || roster === null)
|
|
79
|
+
return bad('명단이 없어요');
|
|
80
|
+
if (roster.v !== 1)
|
|
81
|
+
return bad('버전');
|
|
82
|
+
if (!isRawKey(roster.team) || !isRawKey(roster.issuer))
|
|
83
|
+
return bad('키');
|
|
84
|
+
if (!Number.isSafeInteger(roster.epoch) || roster.epoch < 1)
|
|
85
|
+
return bad('판');
|
|
86
|
+
if (!Number.isSafeInteger(roster.issuedAt))
|
|
87
|
+
return bad('시각');
|
|
88
|
+
if (!isRelayUrl(roster.relay))
|
|
89
|
+
return bad('릴레이 주소');
|
|
90
|
+
if (!Array.isArray(roster.members) || roster.members.length === 0)
|
|
91
|
+
return bad('멤버');
|
|
92
|
+
if (roster.members.length > 1000)
|
|
93
|
+
return bad('멤버가 너무 많아요');
|
|
94
|
+
const seen = new Set();
|
|
95
|
+
for (const m of roster.members) {
|
|
96
|
+
if (typeof m !== 'object' || m === null)
|
|
97
|
+
return bad('멤버');
|
|
98
|
+
if (!isPersonName(m.person))
|
|
99
|
+
return bad('이름');
|
|
100
|
+
if (!isRawKey(m.machineKey) || !isRawKey(m.boxKey))
|
|
101
|
+
return bad('멤버 키');
|
|
102
|
+
if (m.role !== 'admin' && m.role !== 'member')
|
|
103
|
+
return bad('역할');
|
|
104
|
+
if (!Number.isSafeInteger(m.addedAt))
|
|
105
|
+
return bad('추가 시각');
|
|
106
|
+
if (seen.has(m.machineKey))
|
|
107
|
+
return bad('같은 기기가 두 번 있어요');
|
|
108
|
+
seen.add(m.machineKey);
|
|
109
|
+
}
|
|
110
|
+
return { ok: true };
|
|
111
|
+
}
|
|
112
|
+
/** 같은 내용을 다시 서명하지 않고 한 판 올린 새 명단을 만든다 */
|
|
113
|
+
export function nextRoster(current, members, issuer, now = Date.now()) {
|
|
114
|
+
return { ...current, epoch: current.epoch + 1, members, issuedAt: now, issuer };
|
|
115
|
+
}
|
|
116
|
+
const INVITE_PREFIX = 'gpi1.';
|
|
117
|
+
export function encodeInvite(invite) {
|
|
118
|
+
return INVITE_PREFIX + Buffer.from(JSON.stringify(invite), 'utf8').toString('base64url');
|
|
119
|
+
}
|
|
120
|
+
export function decodeInvite(code) {
|
|
121
|
+
const trimmed = code.trim();
|
|
122
|
+
if (!trimmed.startsWith(INVITE_PREFIX))
|
|
123
|
+
throw new Error('초대 코드 꼴이 아니에요');
|
|
124
|
+
let v;
|
|
125
|
+
try {
|
|
126
|
+
v = JSON.parse(Buffer.from(trimmed.slice(INVITE_PREFIX.length), 'base64url').toString('utf8'));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
throw new Error('초대 코드를 못 읽었어요');
|
|
130
|
+
}
|
|
131
|
+
if (v.v !== 1 ||
|
|
132
|
+
!isRawKey(v.team) ||
|
|
133
|
+
!isRawKey(v.admin) ||
|
|
134
|
+
!isRawKey(v.adminBox) ||
|
|
135
|
+
!isRelayUrl(v.relay) ||
|
|
136
|
+
typeof v.id !== 'string' ||
|
|
137
|
+
!/^[A-Za-z0-9_-]{8,64}$/.test(v.id) ||
|
|
138
|
+
typeof v.secret !== 'string' ||
|
|
139
|
+
!/^[A-Za-z0-9_-]{43}$/.test(v.secret) ||
|
|
140
|
+
!isPersonName(v.person) ||
|
|
141
|
+
!Number.isSafeInteger(v.expiresAt)) {
|
|
142
|
+
throw new Error('초대 코드 내용이 맞지 않아요');
|
|
143
|
+
}
|
|
144
|
+
return v;
|
|
145
|
+
}
|
|
146
|
+
/** join 요청에 싣는 증명. 초대 코드를 가진 사람만 만든다 */
|
|
147
|
+
export function joinProofText(inviteId, machineKey, boxKey) {
|
|
148
|
+
return canonical({ p: 'gestalt-peer-join-v1', invite: inviteId, key: machineKey, box: boxKey });
|
|
149
|
+
}
|
|
150
|
+
const LINK = /^gestalt:\/\/peer\/([^/#?\s]{1,255})\/([A-Za-z0-9_-]{1,64})#([A-Za-z0-9_-]{43})$/;
|
|
151
|
+
export function formatShareLink(relayUrl, shareId, shareKey) {
|
|
152
|
+
return `gestalt://peer/${new URL(relayUrl).host}/${shareId}#${shareKey}`;
|
|
153
|
+
}
|
|
154
|
+
export function parseShareLink(link) {
|
|
155
|
+
const m = LINK.exec(link.trim());
|
|
156
|
+
if (!m)
|
|
157
|
+
throw new Error('공유 링크 꼴이 아니에요 (gestalt://peer/<릴레이>/<공유 id>#<키>)');
|
|
158
|
+
return { relayHost: m[1], shareId: m[2], shareKey: m[3] };
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=roster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../../../src/peer/roster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { MachineKey } from './keys.js';
|
|
2
|
+
/**
|
|
3
|
+
* 봉인과 서명. 전부 `node:crypto`다.
|
|
4
|
+
*
|
|
5
|
+
* - box: 받는 기기의 X25519 공개키로 봉인하고 보낸 기기의 Ed25519 키로 서명한다.
|
|
6
|
+
* 보낼 때마다 임시 X25519 키를 만들어서 같은 두 기기 사이에도 키가 매번 다르다.
|
|
7
|
+
* - aead: 공유 세션 키 하나로 여는 AES-256-GCM. 공유 스트림 프레임에 쓴다.
|
|
8
|
+
*/
|
|
9
|
+
/** 키를 정렬한 JSON. 서명할 바이트를 두 쪽이 똑같이 만들려고 쓴다 */
|
|
10
|
+
export declare function canonical(value: unknown): string;
|
|
11
|
+
export declare function signText(key: MachineKey, text: string): string;
|
|
12
|
+
/** 서명이 맞는지. 키나 서명 꼴이 틀려도 던지지 않고 false */
|
|
13
|
+
export declare function verifyText(signer: string, text: string, sig: unknown): boolean;
|
|
14
|
+
export declare function deriveKey(ikm: Buffer, salt: Buffer, info: string): Buffer;
|
|
15
|
+
export declare function hmac(key: Buffer, text: string): string;
|
|
16
|
+
export declare function safeEqual(a: unknown, b: string): boolean;
|
|
17
|
+
/** nonce 12바이트 + 암호문 + 태그 16바이트를 base64url 한 줄로 */
|
|
18
|
+
export declare function aeadSeal(key: Buffer, plaintext: Buffer, aad: string): string;
|
|
19
|
+
/** 열지 못하면 null. 키가 틀렸거나 누가 바꿨거나 aad가 다르다 */
|
|
20
|
+
export declare function aeadOpen(key: Buffer, sealed: unknown, aad: string): Buffer | null;
|
|
21
|
+
export interface Box {
|
|
22
|
+
k: 'box';
|
|
23
|
+
/** 임시 X25519 공개키 */
|
|
24
|
+
e: string;
|
|
25
|
+
/** aeadSeal 결과 */
|
|
26
|
+
c: string;
|
|
27
|
+
/** 보낸 기기의 서명 */
|
|
28
|
+
s: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `to`(받는 기기 id)와 `toBox`(그 기기의 X25519 공개키)에게 봉인한다. 서명에 받는 기기
|
|
32
|
+
* id를 넣어서 다른 기기에게 간 봉인을 그대로 옮겨 보내도 서명이 안 맞는다.
|
|
33
|
+
*/
|
|
34
|
+
export declare function sealBox(from: MachineKey, to: string, toBox: string, plaintext: string): Box;
|
|
35
|
+
/** 보낸 기기 서명이 맞고 열리면 평문. 아니면 null */
|
|
36
|
+
export declare function openBox(me: MachineKey, from: string, box: unknown): string | null;
|
|
37
|
+
//# sourceMappingURL=seal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../../src/peer/seal.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;GAMG;AAEH,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQhD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAY9E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYjF;AAED,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,KAAK,CAAC;IACT,oBAAoB;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,kBAAkB;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,CAAC,EAAE,MAAM,CAAC;CACX;AAID;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAM3F;AAED,oCAAoC;AACpC,wBAAgB,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWjF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHmac, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, sign, timingSafeEqual, verify, } from 'node:crypto';
|
|
2
|
+
import { boxPublicKey, isRawKey, signPublicKey } from './keys.js';
|
|
3
|
+
/**
|
|
4
|
+
* 봉인과 서명. 전부 `node:crypto`다.
|
|
5
|
+
*
|
|
6
|
+
* - box: 받는 기기의 X25519 공개키로 봉인하고 보낸 기기의 Ed25519 키로 서명한다.
|
|
7
|
+
* 보낼 때마다 임시 X25519 키를 만들어서 같은 두 기기 사이에도 키가 매번 다르다.
|
|
8
|
+
* - aead: 공유 세션 키 하나로 여는 AES-256-GCM. 공유 스트림 프레임에 쓴다.
|
|
9
|
+
*/
|
|
10
|
+
/** 키를 정렬한 JSON. 서명할 바이트를 두 쪽이 똑같이 만들려고 쓴다 */
|
|
11
|
+
export function canonical(value) {
|
|
12
|
+
if (value === null || typeof value !== 'object')
|
|
13
|
+
return JSON.stringify(value);
|
|
14
|
+
if (Array.isArray(value))
|
|
15
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
16
|
+
const obj = value;
|
|
17
|
+
const keys = Object.keys(obj)
|
|
18
|
+
.filter((k) => obj[k] !== undefined)
|
|
19
|
+
.sort();
|
|
20
|
+
return `{${keys.map((k) => `${JSON.stringify(k)}:${canonical(obj[k])}`).join(',')}}`;
|
|
21
|
+
}
|
|
22
|
+
export function signText(key, text) {
|
|
23
|
+
return sign(null, Buffer.from(text, 'utf8'), key.signPrivate).toString('base64url');
|
|
24
|
+
}
|
|
25
|
+
/** 서명이 맞는지. 키나 서명 꼴이 틀려도 던지지 않고 false */
|
|
26
|
+
export function verifyText(signer, text, sig) {
|
|
27
|
+
if (!isRawKey(signer) || typeof sig !== 'string')
|
|
28
|
+
return false;
|
|
29
|
+
try {
|
|
30
|
+
return verify(null, Buffer.from(text, 'utf8'), signPublicKey(signer), Buffer.from(sig, 'base64url'));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function deriveKey(ikm, salt, info) {
|
|
37
|
+
return Buffer.from(hkdfSync('sha256', ikm, salt, Buffer.from(info, 'utf8'), 32));
|
|
38
|
+
}
|
|
39
|
+
export function hmac(key, text) {
|
|
40
|
+
return createHmac('sha256', key).update(text, 'utf8').digest('base64url');
|
|
41
|
+
}
|
|
42
|
+
export function safeEqual(a, b) {
|
|
43
|
+
if (typeof a !== 'string')
|
|
44
|
+
return false;
|
|
45
|
+
const x = Buffer.from(a);
|
|
46
|
+
const y = Buffer.from(b);
|
|
47
|
+
return x.length === y.length && timingSafeEqual(x, y);
|
|
48
|
+
}
|
|
49
|
+
/** nonce 12바이트 + 암호문 + 태그 16바이트를 base64url 한 줄로 */
|
|
50
|
+
export function aeadSeal(key, plaintext, aad) {
|
|
51
|
+
const nonce = randomBytes(12);
|
|
52
|
+
const cipher = createCipheriv('aes-256-gcm', key, nonce);
|
|
53
|
+
cipher.setAAD(Buffer.from(aad, 'utf8'));
|
|
54
|
+
const body = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
55
|
+
return Buffer.concat([nonce, body, cipher.getAuthTag()]).toString('base64url');
|
|
56
|
+
}
|
|
57
|
+
/** 열지 못하면 null. 키가 틀렸거나 누가 바꿨거나 aad가 다르다 */
|
|
58
|
+
export function aeadOpen(key, sealed, aad) {
|
|
59
|
+
if (typeof sealed !== 'string')
|
|
60
|
+
return null;
|
|
61
|
+
const raw = Buffer.from(sealed, 'base64url');
|
|
62
|
+
if (raw.length < 28)
|
|
63
|
+
return null;
|
|
64
|
+
try {
|
|
65
|
+
const decipher = createDecipheriv('aes-256-gcm', key, raw.subarray(0, 12));
|
|
66
|
+
decipher.setAAD(Buffer.from(aad, 'utf8'));
|
|
67
|
+
decipher.setAuthTag(raw.subarray(raw.length - 16));
|
|
68
|
+
return Buffer.concat([decipher.update(raw.subarray(12, raw.length - 16)), decipher.final()]);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const BOX_INFO = 'gestalt-peer-box-v1';
|
|
75
|
+
/**
|
|
76
|
+
* `to`(받는 기기 id)와 `toBox`(그 기기의 X25519 공개키)에게 봉인한다. 서명에 받는 기기
|
|
77
|
+
* id를 넣어서 다른 기기에게 간 봉인을 그대로 옮겨 보내도 서명이 안 맞는다.
|
|
78
|
+
*/
|
|
79
|
+
export function sealBox(from, to, toBox, plaintext) {
|
|
80
|
+
const eph = generateKeyPairSync('x25519');
|
|
81
|
+
const e = eph.publicKey.export({ format: 'jwk' }).x;
|
|
82
|
+
const key = boxKey(eph.privateKey, boxPublicKey(toBox), e, toBox);
|
|
83
|
+
const c = aeadSeal(key, Buffer.from(plaintext, 'utf8'), `${BOX_INFO}|${from.id}|${to}`);
|
|
84
|
+
return { k: 'box', e, c, s: signText(from, boxSigned(from.id, to, e, c)) };
|
|
85
|
+
}
|
|
86
|
+
/** 보낸 기기 서명이 맞고 열리면 평문. 아니면 null */
|
|
87
|
+
export function openBox(me, from, box) {
|
|
88
|
+
if (!isBox(box))
|
|
89
|
+
return null;
|
|
90
|
+
if (!verifyText(from, boxSigned(from, me.id, box.e, box.c), box.s))
|
|
91
|
+
return null;
|
|
92
|
+
let key;
|
|
93
|
+
try {
|
|
94
|
+
key = boxKey(me.boxPrivate, boxPublicKey(box.e), box.e, me.boxKey);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const plain = aeadOpen(key, box.c, `${BOX_INFO}|${from}|${me.id}`);
|
|
100
|
+
return plain ? plain.toString('utf8') : null;
|
|
101
|
+
}
|
|
102
|
+
function boxSigned(from, to, e, c) {
|
|
103
|
+
return `${BOX_INFO}\n${from}\n${to}\n${e}\n${c}`;
|
|
104
|
+
}
|
|
105
|
+
function boxKey(priv, pub, ephRaw, recipientRaw) {
|
|
106
|
+
const shared = diffieHellman({ privateKey: priv, publicKey: pub });
|
|
107
|
+
return deriveKey(shared, Buffer.from(ephRaw + recipientRaw, 'utf8'), BOX_INFO);
|
|
108
|
+
}
|
|
109
|
+
function isBox(v) {
|
|
110
|
+
if (typeof v !== 'object' || v === null)
|
|
111
|
+
return false;
|
|
112
|
+
const b = v;
|
|
113
|
+
return b.k === 'box' && isRawKey(b.e) && typeof b.c === 'string' && typeof b.s === 'string';
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=seal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal.js","sourceRoot":"","sources":["../../../src/peer/seal.ts"],"names":[],"mappings":"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"}
|
package/dist/src/peer/share.d.ts
CHANGED
|
@@ -1,36 +1,8 @@
|
|
|
1
1
|
import type { TailOptions } from './tail.js';
|
|
2
2
|
import type { RedactOptions, ToolsLevel } from './redact.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
export type ShareFrame = {
|
|
8
|
-
type: 'event';
|
|
9
|
-
seq: number;
|
|
10
|
-
json: string;
|
|
11
|
-
}
|
|
12
|
-
/** 붙은 뷰어가 받을 앞부분 중 메모리 상한에 밀려 버려진 이벤트 수 */
|
|
13
|
-
| {
|
|
14
|
-
type: 'trimmed';
|
|
15
|
-
dropped: number;
|
|
16
|
-
} | {
|
|
17
|
-
type: 'stats';
|
|
18
|
-
unknownLines: number;
|
|
19
|
-
} | {
|
|
20
|
-
type: 'state';
|
|
21
|
-
status: ShareStatus;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* 공유 종료. 앞부분을 따라잡는 중에 종료되면 아직 못 보낸 이벤트는 사라지므로 그 개수를
|
|
25
|
-
* missed에 싣는다. 붙어 있던 뷰어는 다 받은 뒤라 안 싣는다
|
|
26
|
-
*/
|
|
27
|
-
| {
|
|
28
|
-
type: 'closed';
|
|
29
|
-
reason: string;
|
|
30
|
-
missed?: number;
|
|
31
|
-
};
|
|
32
|
-
export type ShareStatus = 'live' | 'missing' | 'truncated';
|
|
33
|
-
export type ShareListener = (frame: ShareFrame) => void;
|
|
3
|
+
import { ShareFeed } from './feed.js';
|
|
4
|
+
export { DEFAULT_MAX_BACKLOG_BYTES } from './feed.js';
|
|
5
|
+
export type { BacklogSlice, ShareFrame, ShareListener, ShareStatus } from './feed.js';
|
|
34
6
|
export interface ShareStreamOptions extends RedactOptions {
|
|
35
7
|
id: string;
|
|
36
8
|
transcriptPath: string;
|
|
@@ -39,62 +11,25 @@ export interface ShareStreamOptions extends RedactOptions {
|
|
|
39
11
|
maxBacklogBytes?: number;
|
|
40
12
|
tail?: Omit<TailOptions, 'startOffset'>;
|
|
41
13
|
}
|
|
42
|
-
/**
|
|
43
|
-
* 새 뷰어에게 다시 보낼 앞부분의 상한. 넘으면 오래된 것부터 버린다. 공유는 최대 7일
|
|
44
|
-
* 열려 있고 도구 출력이 크면 events가 끝없이 는다.
|
|
45
|
-
*/
|
|
46
|
-
export declare const DEFAULT_MAX_BACKLOG_BYTES: number;
|
|
47
|
-
export interface BacklogSlice {
|
|
48
|
-
/** `afterSeq` 뒤로 상한에 밀려 버려진 이벤트 수 */
|
|
49
|
-
dropped: number;
|
|
50
|
-
items: {
|
|
51
|
-
seq: number;
|
|
52
|
-
json: string;
|
|
53
|
-
}[];
|
|
54
|
-
}
|
|
55
14
|
/**
|
|
56
15
|
* 공유 하나. 대화 기록을 따라 읽어 바꾼 이벤트를 메모리에 쌓고 붙은 뷰어에 흘린다.
|
|
57
16
|
*
|
|
58
17
|
* 바꾼 결과만 메모리에 들고 원문 줄은 들지 않는다. 디스크에는 아무것도 안 쓴다.
|
|
59
18
|
* 처음 붙는 뷰어가 앞부분을 받아야 해서 바꾼 이벤트를 직렬화한 글자로 상한까지 남긴다.
|
|
60
|
-
*
|
|
61
|
-
* seq는 공유가 연 뒤로 나온 이벤트의 번호다. 앞부분을 버려도 번호는 안 당긴다.
|
|
62
|
-
* 배열 위치로 매기면 버린 만큼 번호가 밀려 Last-Event-ID로 이어 받을 때 겹치거나 빠진다.
|
|
63
19
|
*/
|
|
64
|
-
export declare class ShareStream {
|
|
65
|
-
readonly id: string;
|
|
20
|
+
export declare class ShareStream extends ShareFeed {
|
|
66
21
|
readonly transcriptPath: string;
|
|
67
22
|
readonly tools: ToolsLevel;
|
|
68
23
|
private tail;
|
|
69
24
|
private transformer;
|
|
70
|
-
/**
|
|
71
|
-
* `events[head]`부터가 살아 있다. 앞에서 하나씩 shift하면 큰 배열에서 매번 다 옮긴다.
|
|
72
|
-
* head 앞 칸은 버릴 때 비워 둔다. 압축은 head가 1024를 넘어야 돌아서 칸에 참조를
|
|
73
|
-
* 남기면 버린 이벤트를 GC가 못 가져간다.
|
|
74
|
-
*/
|
|
75
|
-
private events;
|
|
76
|
-
private head;
|
|
77
|
-
/** `events[0]` 앞에서 잘라 낸 이벤트 수. `events[i]`의 seq는 `base + i + 1`이다 */
|
|
78
|
-
private base;
|
|
79
|
-
private backlogBytes;
|
|
80
|
-
private readonly maxBacklogBytes;
|
|
81
|
-
private listeners;
|
|
82
|
-
private status;
|
|
83
25
|
private title;
|
|
84
26
|
private lastUnknown;
|
|
85
|
-
private closedReason;
|
|
86
27
|
constructor(options: ShareStreamOptions);
|
|
87
|
-
get currentStatus(): ShareStatus;
|
|
88
28
|
get unknownLines(): number;
|
|
89
29
|
get failedLines(): number;
|
|
90
30
|
get oversizedLines(): number;
|
|
91
31
|
get claudeVersion(): string | undefined;
|
|
92
32
|
get sessionTitle(): string | undefined;
|
|
93
|
-
get eventCount(): number;
|
|
94
|
-
/** 상한에 밀려 버린 이벤트 수 */
|
|
95
|
-
get droppedEvents(): number;
|
|
96
|
-
get viewerCount(): number;
|
|
97
|
-
get isClosed(): boolean;
|
|
98
33
|
/**
|
|
99
34
|
* 새로 쓰인 줄을 읽어 흘린다. 데몬이 주기적으로 부른다.
|
|
100
35
|
* 모르는 줄 수가 늘었으면 true — 데몬이 감사 로그에 버전을 남길 때 쓴다.
|
|
@@ -102,22 +37,5 @@ export declare class ShareStream {
|
|
|
102
37
|
poll(): {
|
|
103
38
|
unknownGrew: boolean;
|
|
104
39
|
};
|
|
105
|
-
/**
|
|
106
|
-
* 쌓인 것 중 `afterSeq` 뒤를 `maxBytes`쯤까지 꺼낸다. 이벤트 하나가 상한보다 커도 하나는
|
|
107
|
-
* 꺼낸다. 뷰어가 소켓이 비는 만큼씩 앞부분을 보내려고 쓴다. 한 번에 다 넘기면 안 읽는
|
|
108
|
-
* 뷰어마다 앞부분 전체가 소켓 버퍼에 쌓인다.
|
|
109
|
-
*/
|
|
110
|
-
backlogAfter(afterSeq: number, maxBytes: number): BacklogSlice;
|
|
111
|
-
/**
|
|
112
|
-
* 뷰어를 붙인다. 지금 상태와 `afterSeq` 뒤 앞부분을 한 번에 보내고 이후는 생기는 대로.
|
|
113
|
-
* 떼어내는 함수를 돌려준다. 앞부분이 큰 뷰어는 backlogAfter로 먼저 따라잡은 뒤 이벤트
|
|
114
|
-
* 루프로 돌아가기 전에 바로 붙어야 사이에 poll이 끼어 이벤트가 빠지지 않는다.
|
|
115
|
-
*/
|
|
116
|
-
subscribe(listener: ShareListener, afterSeq?: number): () => void;
|
|
117
|
-
close(reason: string): void;
|
|
118
|
-
/** 가장 최근 이벤트 하나는 상한을 넘어도 남긴다. 다 버리면 새 뷰어가 지금 상태를 못 본다 */
|
|
119
|
-
private trim;
|
|
120
|
-
private setStatus;
|
|
121
|
-
private emit;
|
|
122
40
|
}
|
|
123
41
|
//# sourceMappingURL=share.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/peer/share.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/peer/share.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEtF,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;CACzC;AAED;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAE3B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAK;gBAEZ,OAAO,EAAE,kBAAkB;IAQvC,IAAa,YAAY,IAAI,MAAM,CAElC;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED;;;OAGG;IACH,IAAI,IAAI;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE;CAwBjC"}
|