wowok 2.1.20 → 2.1.22
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/cjs/w/local/account.d.ts +1 -1
- package/dist/cjs/w/local/account.js +15 -47
- package/dist/cjs/w/local/account.js.map +1 -1
- package/dist/cjs/w/messenger/crypto.js +31 -0
- package/dist/cjs/w/messenger/crypto.js.map +1 -1
- package/dist/cjs/w/messenger/messenger-api.d.ts +27 -4
- package/dist/cjs/w/messenger/messenger-api.js +191 -256
- package/dist/cjs/w/messenger/messenger-api.js.map +1 -1
- package/dist/cjs/w/messenger/messenger-manager.d.ts +39 -3
- package/dist/cjs/w/messenger/messenger-manager.js +194 -107
- package/dist/cjs/w/messenger/messenger-manager.js.map +1 -1
- package/dist/cjs/w/messenger/messenger.d.ts +9 -1
- package/dist/cjs/w/messenger/messenger.js +33 -0
- package/dist/cjs/w/messenger/messenger.js.map +1 -1
- package/dist/cjs/w/messenger/server.d.ts +2 -2
- package/dist/cjs/w/messenger/server.js.map +1 -1
- package/dist/cjs/w/messenger/session.d.ts +15 -0
- package/dist/cjs/w/messenger/session.js +83 -35
- package/dist/cjs/w/messenger/session.js.map +1 -1
- package/dist/cjs/w/messenger/storage.d.ts +12 -0
- package/dist/cjs/w/messenger/storage.js +51 -2
- package/dist/cjs/w/messenger/storage.js.map +1 -1
- package/dist/cjs/w/messenger/templates/wts-html-template.d.ts +61 -0
- package/dist/cjs/w/messenger/templates/wts-html-template.js +414 -0
- package/dist/cjs/w/messenger/templates/wts-html-template.js.map +1 -0
- package/dist/cjs/w/messenger/types.d.ts +9 -5
- package/dist/cjs/w/messenger/types.js +3 -2
- package/dist/cjs/w/messenger/types.js.map +1 -1
- package/dist/esm/w/local/account.d.ts +1 -1
- package/dist/esm/w/local/account.js +15 -47
- package/dist/esm/w/local/account.js.map +1 -1
- package/dist/esm/w/messenger/crypto.js +31 -0
- package/dist/esm/w/messenger/crypto.js.map +1 -1
- package/dist/esm/w/messenger/messenger-api.d.ts +27 -4
- package/dist/esm/w/messenger/messenger-api.js +191 -256
- package/dist/esm/w/messenger/messenger-api.js.map +1 -1
- package/dist/esm/w/messenger/messenger-manager.d.ts +39 -3
- package/dist/esm/w/messenger/messenger-manager.js +194 -107
- package/dist/esm/w/messenger/messenger-manager.js.map +1 -1
- package/dist/esm/w/messenger/messenger.d.ts +9 -1
- package/dist/esm/w/messenger/messenger.js +33 -0
- package/dist/esm/w/messenger/messenger.js.map +1 -1
- package/dist/esm/w/messenger/server.d.ts +2 -2
- package/dist/esm/w/messenger/server.js.map +1 -1
- package/dist/esm/w/messenger/session.d.ts +15 -0
- package/dist/esm/w/messenger/session.js +83 -35
- package/dist/esm/w/messenger/session.js.map +1 -1
- package/dist/esm/w/messenger/storage.d.ts +12 -0
- package/dist/esm/w/messenger/storage.js +51 -2
- package/dist/esm/w/messenger/storage.js.map +1 -1
- package/dist/esm/w/messenger/templates/wts-html-template.d.ts +61 -0
- package/dist/esm/w/messenger/templates/wts-html-template.js +414 -0
- package/dist/esm/w/messenger/templates/wts-html-template.js.map +1 -0
- package/dist/esm/w/messenger/types.d.ts +9 -5
- package/dist/esm/w/messenger/types.js +3 -2
- package/dist/esm/w/messenger/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WTS to HTML 模板
|
|
3
|
+
* 将 HTML 模板独立出来,便于维护和定制
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* HTML 转义函数
|
|
7
|
+
*/
|
|
8
|
+
export function escapeHtml(text) {
|
|
9
|
+
if (!text)
|
|
10
|
+
return "";
|
|
11
|
+
return text
|
|
12
|
+
.replace(/&/g, "&")
|
|
13
|
+
.replace(/</g, "<")
|
|
14
|
+
.replace(/>/g, ">")
|
|
15
|
+
.replace(/"/g, """)
|
|
16
|
+
.replace(/'/g, "'");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 格式化文件大小
|
|
20
|
+
*/
|
|
21
|
+
export function formatFileSize(bytes) {
|
|
22
|
+
if (bytes < 1024)
|
|
23
|
+
return bytes + " B";
|
|
24
|
+
if (bytes < 1024 * 1024)
|
|
25
|
+
return (bytes / 1024).toFixed(1) + " KB";
|
|
26
|
+
return (bytes / (1024 * 1024)).toFixed(1) + " MB";
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 判断是否为非文本消息
|
|
30
|
+
*/
|
|
31
|
+
export function isNonTextMessage(msg) {
|
|
32
|
+
// 如果有 zipMetadata,说明是非文本消息(ZIP文件)
|
|
33
|
+
return !!msg.zipMetadata;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 获取文件类型标签
|
|
37
|
+
*/
|
|
38
|
+
export function getFileTypeLabel(msg) {
|
|
39
|
+
// 首先检查 zipMetadata 中的 contentType
|
|
40
|
+
if (msg.zipMetadata?.contentType) {
|
|
41
|
+
return msg.zipMetadata.contentType.toUpperCase();
|
|
42
|
+
}
|
|
43
|
+
// 根据文件名推断类型
|
|
44
|
+
const fileName = msg.zipMetadata?.fileName || "";
|
|
45
|
+
if (fileName.endsWith(".wts"))
|
|
46
|
+
return "WTS";
|
|
47
|
+
if (fileName.endsWith(".wip"))
|
|
48
|
+
return "WIP";
|
|
49
|
+
if (fileName.endsWith(".zip"))
|
|
50
|
+
return "ZIP";
|
|
51
|
+
if (fileName.endsWith(".json"))
|
|
52
|
+
return "JSON";
|
|
53
|
+
if (fileName.endsWith(".txt"))
|
|
54
|
+
return "TXT";
|
|
55
|
+
// 根据 zipMetadata 推断
|
|
56
|
+
if (msg.zipMetadata)
|
|
57
|
+
return "ZIP";
|
|
58
|
+
return "FILE";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 获取主题颜色配置
|
|
62
|
+
*/
|
|
63
|
+
export function getThemeColors(theme) {
|
|
64
|
+
return {
|
|
65
|
+
bgColor: theme === "dark" ? "#1a1a1a" : "#ffffff",
|
|
66
|
+
textColor: theme === "dark" ? "#e0e0e0" : "#333333",
|
|
67
|
+
borderColor: theme === "dark" ? "#444444" : "#e0e0e0",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取消息颜色配置
|
|
72
|
+
*/
|
|
73
|
+
export function getMessageColors(theme, isMyMessage) {
|
|
74
|
+
if (isMyMessage) {
|
|
75
|
+
// 发送的消息 - 蓝色系
|
|
76
|
+
return {
|
|
77
|
+
bgColor: theme === "dark" ? "#1a365d" : "#e3f2fd",
|
|
78
|
+
borderColor: theme === "dark" ? "#3b82f6" : "#90caf9",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// 接收的消息 - 绿色系
|
|
83
|
+
return {
|
|
84
|
+
bgColor: theme === "dark" ? "#1e3a2f" : "#e8f5e9",
|
|
85
|
+
borderColor: theme === "dark" ? "#10b981" : "#a5d6a7",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 生成文件保存按钮 HTML
|
|
91
|
+
*/
|
|
92
|
+
export function generateFileButton(msg, index, theme) {
|
|
93
|
+
if (!msg.plaintext || !msg.zipMetadata?.fileName)
|
|
94
|
+
return "";
|
|
95
|
+
const fileName = msg.zipMetadata.fileName;
|
|
96
|
+
const fileData = msg.plaintext;
|
|
97
|
+
const fileSize = msg.zipMetadata.fileSize || 0;
|
|
98
|
+
const fileType = getFileTypeLabel(msg);
|
|
99
|
+
// 根据主题调整颜色
|
|
100
|
+
const bgColor = theme === "dark" ? "#2a3f2a" : "#e8f5e9";
|
|
101
|
+
const borderColor = theme === "dark" ? "#4caf50" : "#4caf50";
|
|
102
|
+
const textColor = theme === "dark" ? "#81c784" : "#2e7d32";
|
|
103
|
+
const buttonBg = "#4caf50";
|
|
104
|
+
const buttonHover = "#45a049";
|
|
105
|
+
return `
|
|
106
|
+
<div style="margin: 12px 0; padding: 16px; background: ${bgColor}; border: 1px solid ${borderColor}; border-radius: 8px; text-align: center;">
|
|
107
|
+
<div style="font-size: 14px; color: ${textColor}; margin-bottom: 8px;">
|
|
108
|
+
📎 ${escapeHtml(fileType)} File
|
|
109
|
+
<span style="font-size: 12px; color: #666;">(${formatFileSize(fileSize)})</span>
|
|
110
|
+
</div>
|
|
111
|
+
<button
|
|
112
|
+
onclick="saveFile${index}()"
|
|
113
|
+
style="padding: 10px 24px; background: ${buttonBg}; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 14px;"
|
|
114
|
+
onmouseover="this.style.background='${buttonHover}'"
|
|
115
|
+
onmouseout="this.style.background='${buttonBg}'"
|
|
116
|
+
>
|
|
117
|
+
💾 Save ${escapeHtml(fileName)}
|
|
118
|
+
</button>
|
|
119
|
+
</div>
|
|
120
|
+
<script>
|
|
121
|
+
function saveFile${index}() {
|
|
122
|
+
try {
|
|
123
|
+
const base64Data = "${escapeHtml(fileData)}";
|
|
124
|
+
const byteCharacters = atob(base64Data);
|
|
125
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
126
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
127
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
128
|
+
}
|
|
129
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
130
|
+
|
|
131
|
+
let mimeType = "application/octet-stream";
|
|
132
|
+
const fileName = "${escapeHtml(fileName)}";
|
|
133
|
+
if (fileName.endsWith('.json')) mimeType = "application/json";
|
|
134
|
+
else if (fileName.endsWith('.zip')) mimeType = "application/zip";
|
|
135
|
+
else if (fileName.endsWith('.txt')) mimeType = "text/plain";
|
|
136
|
+
|
|
137
|
+
const blob = new Blob([byteArray], { type: mimeType });
|
|
138
|
+
const url = URL.createObjectURL(blob);
|
|
139
|
+
const a = document.createElement("a");
|
|
140
|
+
a.href = url;
|
|
141
|
+
a.download = fileName;
|
|
142
|
+
document.body.appendChild(a);
|
|
143
|
+
a.click();
|
|
144
|
+
document.body.removeChild(a);
|
|
145
|
+
URL.revokeObjectURL(url);
|
|
146
|
+
} catch (e) {
|
|
147
|
+
alert('保存文件失败: ' + e.message);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
<\/script>
|
|
151
|
+
`;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 生成单条消息 HTML
|
|
155
|
+
*/
|
|
156
|
+
export function generateMessageHtml(msg, index, data) {
|
|
157
|
+
const { theme, borderColor, myAddress, maxLastReceivedLeafIndex } = data;
|
|
158
|
+
const isNonText = isNonTextMessage(msg);
|
|
159
|
+
const isMyMessage = msg.from.toLowerCase() === myAddress.toLowerCase();
|
|
160
|
+
const isDeliveredAndDecrypted = isMyMessage &&
|
|
161
|
+
maxLastReceivedLeafIndex >= 0 &&
|
|
162
|
+
msg.leafIndex <= maxLastReceivedLeafIndex;
|
|
163
|
+
const colors = getMessageColors(theme, isMyMessage);
|
|
164
|
+
const contentBgColor = theme === "dark" ? "#333333" : "#ffffff";
|
|
165
|
+
let contentHtml = "";
|
|
166
|
+
if (isNonText) {
|
|
167
|
+
contentHtml = generateFileButton(msg, index, theme);
|
|
168
|
+
}
|
|
169
|
+
else if (msg.plaintext) {
|
|
170
|
+
contentHtml = `<div style="margin: 12px 0; padding: 12px; background: ${contentBgColor}; border: 1px solid ${borderColor}; border-radius: 4px; font-size: 14px; line-height: 1.6; max-height: calc(1.6em * 6); overflow-y: auto; white-space: pre-wrap; word-break: break-word;">${escapeHtml(msg.plaintext)}</div>`;
|
|
171
|
+
}
|
|
172
|
+
const metaHtml = [
|
|
173
|
+
`<div>Merkle Root: ${escapeHtml(msg.merkleRoot)}</div>`,
|
|
174
|
+
msg.arkConfirmed
|
|
175
|
+
? `<div>ARK Confirmed: ${escapeHtml(msg.arkConfirmed.recipient)} at ${new Date(msg.arkConfirmed.timestamp).toLocaleString()}</div>`
|
|
176
|
+
: "",
|
|
177
|
+
msg.guardAddress
|
|
178
|
+
? `<div>Guard: ${escapeHtml(msg.guardAddress)}</div>`
|
|
179
|
+
: "",
|
|
180
|
+
msg.passportAddress
|
|
181
|
+
? `<div>Passport: ${escapeHtml(msg.passportAddress)}</div>`
|
|
182
|
+
: "",
|
|
183
|
+
]
|
|
184
|
+
.filter(Boolean)
|
|
185
|
+
.join("");
|
|
186
|
+
return `
|
|
187
|
+
<div style="margin: 16px 0; padding: 16px; border: 1px solid ${colors.borderColor}; border-radius: 8px; background: ${colors.bgColor};">
|
|
188
|
+
<div style="display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 12px; color: #666;">
|
|
189
|
+
<span>From: ${escapeHtml(msg.from.slice(0, 6))}...${escapeHtml(msg.from.slice(-3))} To: ${escapeHtml(msg.to.slice(0, 6))}...${escapeHtml(msg.to.slice(-3))}</span>
|
|
190
|
+
<span>${new Date(msg.timestamp).toLocaleString()}</span>
|
|
191
|
+
</div>
|
|
192
|
+
${contentHtml}
|
|
193
|
+
<div style="margin: 8px 0; font-size: 11px; color: #666;">
|
|
194
|
+
${metaHtml}
|
|
195
|
+
</div>
|
|
196
|
+
<div style="font-size: 11px; color: #888; margin-top: 8px; padding-top: 8px; border-top: 1px solid ${borderColor}; display: flex; justify-content: space-between; align-items: center;">
|
|
197
|
+
<div>Leaf Index: ${msg.leafIndex}</div>
|
|
198
|
+
${isDeliveredAndDecrypted ? `<span style="color: #4caf50;">Delivered & Decrypted</span>` : ""}
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 生成签名验证信息 HTML
|
|
205
|
+
*/
|
|
206
|
+
export function generateSignatureHtml(verifyResult, theme, textColor) {
|
|
207
|
+
if (!verifyResult.signatures || verifyResult.signatures.length === 0) {
|
|
208
|
+
return "";
|
|
209
|
+
}
|
|
210
|
+
const bgColor = theme === "dark" ? "#2a3f2a" : "#e8f5e9";
|
|
211
|
+
const headerColor = theme === "dark" ? "#81c784" : "#2e7d32";
|
|
212
|
+
const signaturesHtml = verifyResult.signatures
|
|
213
|
+
.map((s, idx) => `
|
|
214
|
+
<div style="font-size: 10px; color: ${textColor}; margin-left: 8px;">
|
|
215
|
+
${idx + 1}. ${s.address ? escapeHtml(s.address.slice(0, 6)) + "..." + escapeHtml(s.address.slice(-3)) : "Unknown"}:
|
|
216
|
+
${s.valid ? '<span style="color: #4caf50;">✓ Valid</span>' : '<span style="color: #f44336;">✗ Invalid</span>'}
|
|
217
|
+
</div>
|
|
218
|
+
`)
|
|
219
|
+
.join("");
|
|
220
|
+
return `
|
|
221
|
+
<div style="margin-top: 8px; padding: 8px; background: ${bgColor}; border-radius: 4px;">
|
|
222
|
+
<div style="font-size: 11px; color: ${headerColor}; margin-bottom: 4px;">
|
|
223
|
+
✓ Signature Verification (${verifyResult.signatures.length} signature${verifyResult.signatures.length > 1 ? "s" : ""})
|
|
224
|
+
</div>
|
|
225
|
+
${signaturesHtml}
|
|
226
|
+
</div>
|
|
227
|
+
`;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* 生成完整 HTML 页面
|
|
231
|
+
*/
|
|
232
|
+
const MESSAGES_PER_PAGE = 100;
|
|
233
|
+
export function generateHtmlPage(data) {
|
|
234
|
+
const { title, theme, bgColor, textColor, borderColor, meta, payload, verifyResult, maxLastReceivedLeafIndex, } = data;
|
|
235
|
+
const totalMessages = payload.messages.length;
|
|
236
|
+
const totalPages = Math.ceil(totalMessages / MESSAGES_PER_PAGE);
|
|
237
|
+
// 生成所有页面的消息 HTML
|
|
238
|
+
const pagesHtml = [];
|
|
239
|
+
for (let page = 0; page < totalPages; page++) {
|
|
240
|
+
const start = page * MESSAGES_PER_PAGE;
|
|
241
|
+
const end = Math.min(start + MESSAGES_PER_PAGE, totalMessages);
|
|
242
|
+
const pageMessages = payload.messages.slice(start, end);
|
|
243
|
+
const pageMessagesHtml = pageMessages
|
|
244
|
+
.map((msg, index) => generateMessageHtml(msg, start + index, data))
|
|
245
|
+
.join("");
|
|
246
|
+
pagesHtml.push({
|
|
247
|
+
pageNum: page + 1,
|
|
248
|
+
html: `<div class="page" data-page="${page + 1}" style="display: ${page === 0 ? "block" : "none"};">${pageMessagesHtml}</div>`,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const paginationHtml = totalPages > 1
|
|
252
|
+
? generatePaginationHtml(totalPages, theme, textColor)
|
|
253
|
+
: "";
|
|
254
|
+
const allPagesHtml = pagesHtml.map((p) => p.html).join("");
|
|
255
|
+
const signatureHtml = generateSignatureHtml(verifyResult, theme, textColor);
|
|
256
|
+
const verificationStatus = verifyResult.valid
|
|
257
|
+
? `<span style="color: #4caf50; margin-left: 8px;">✓ The accuracy, sequentiality, and integrity of the messages are verified without tampering</span>`
|
|
258
|
+
: `<span style="color: #ff9800; margin-left: 8px;">⚠ ${verifyResult.error || "Hash mismatch - content has been tampered"}</span>`;
|
|
259
|
+
const lastReceivedHtml = maxLastReceivedLeafIndex >= 0
|
|
260
|
+
? `<div>Delivered & Decrypted Leaf Index: ${maxLastReceivedLeafIndex} (sent messages are only confirmed as decrypted after receiving a reply from the other party)</div>`
|
|
261
|
+
: "";
|
|
262
|
+
return `<!DOCTYPE html>
|
|
263
|
+
<html lang="en">
|
|
264
|
+
<head>
|
|
265
|
+
<meta charset="UTF-8">
|
|
266
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
267
|
+
<title>${escapeHtml(title)}</title>
|
|
268
|
+
<style>
|
|
269
|
+
body {
|
|
270
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
271
|
+
max-width: 800px;
|
|
272
|
+
margin: 0 auto;
|
|
273
|
+
padding: 20px;
|
|
274
|
+
background: ${bgColor};
|
|
275
|
+
color: ${textColor};
|
|
276
|
+
}
|
|
277
|
+
.header {
|
|
278
|
+
border-bottom: 2px solid ${borderColor};
|
|
279
|
+
padding-bottom: 16px;
|
|
280
|
+
margin-bottom: 24px;
|
|
281
|
+
}
|
|
282
|
+
.meta {
|
|
283
|
+
font-size: 12px;
|
|
284
|
+
color: #666;
|
|
285
|
+
margin-top: 8px;
|
|
286
|
+
}
|
|
287
|
+
.note {
|
|
288
|
+
font-size: 11px;
|
|
289
|
+
color: #999;
|
|
290
|
+
margin-top: 12px;
|
|
291
|
+
padding: 8px;
|
|
292
|
+
background: ${theme === "dark" ? "#2a2a2a" : "#f5f5f5"};
|
|
293
|
+
border-radius: 4px;
|
|
294
|
+
font-style: italic;
|
|
295
|
+
}
|
|
296
|
+
.pagination {
|
|
297
|
+
display: flex;
|
|
298
|
+
justify-content: center;
|
|
299
|
+
align-items: center;
|
|
300
|
+
gap: 8px;
|
|
301
|
+
margin-top: 24px;
|
|
302
|
+
padding: 16px;
|
|
303
|
+
border-top: 1px solid ${borderColor};
|
|
304
|
+
}
|
|
305
|
+
.pagination button {
|
|
306
|
+
padding: 8px 16px;
|
|
307
|
+
border: 1px solid ${borderColor};
|
|
308
|
+
background: ${theme === "dark" ? "#333" : "#fff"};
|
|
309
|
+
color: ${textColor};
|
|
310
|
+
cursor: pointer;
|
|
311
|
+
border-radius: 4px;
|
|
312
|
+
font-size: 14px;
|
|
313
|
+
}
|
|
314
|
+
.pagination button:hover:not(:disabled) {
|
|
315
|
+
background: ${theme === "dark" ? "#444" : "#f0f0f0"};
|
|
316
|
+
}
|
|
317
|
+
.pagination button:disabled {
|
|
318
|
+
opacity: 0.5;
|
|
319
|
+
cursor: not-allowed;
|
|
320
|
+
}
|
|
321
|
+
.pagination .page-info {
|
|
322
|
+
font-size: 14px;
|
|
323
|
+
color: #666;
|
|
324
|
+
}
|
|
325
|
+
.page {
|
|
326
|
+
animation: fadeIn 0.3s ease-in;
|
|
327
|
+
}
|
|
328
|
+
@keyframes fadeIn {
|
|
329
|
+
from { opacity: 0; }
|
|
330
|
+
to { opacity: 1; }
|
|
331
|
+
}
|
|
332
|
+
</style>
|
|
333
|
+
</head>
|
|
334
|
+
<body>
|
|
335
|
+
<div class="header">
|
|
336
|
+
<h1>Witness Timestamped Sequence</h1>
|
|
337
|
+
<div class="note">
|
|
338
|
+
Important Note: This page is for message browsing and verification reference only. Please verify whether the message sequence has been tampered with through the 'verify_wts' API using the WTS file.
|
|
339
|
+
</div>
|
|
340
|
+
<div style="font-size: 14px; color: #666; margin-top: 4px;">
|
|
341
|
+
${new Date(meta.startTime).toLocaleDateString()} - ${new Date(meta.endTime).toLocaleDateString()}
|
|
342
|
+
${verificationStatus}
|
|
343
|
+
</div>
|
|
344
|
+
<div class="meta">
|
|
345
|
+
<div>Messages: ${meta.messageCount} | Time: ${new Date(meta.startTime).toLocaleString()} - ${new Date(meta.endTime).toLocaleString()}</div>
|
|
346
|
+
<div style="word-break: break-all;">Merkle Root: ${escapeHtml(meta.merkleRoot)}</div>
|
|
347
|
+
${lastReceivedHtml}
|
|
348
|
+
<div style="color: ${theme === "dark" ? "#3b82f6" : "#1976d2"};">Creator: ${escapeHtml(meta.creator)}</div>
|
|
349
|
+
<div style="color: ${theme === "dark" ? "#10b981" : "#2e7d32"};">Participant: ${escapeHtml(meta.participant)}</div>
|
|
350
|
+
${signatureHtml}
|
|
351
|
+
</div>
|
|
352
|
+
</div>
|
|
353
|
+
<div id="messages-container">
|
|
354
|
+
${allPagesHtml}
|
|
355
|
+
</div>
|
|
356
|
+
${paginationHtml}
|
|
357
|
+
<script>
|
|
358
|
+
(function() {
|
|
359
|
+
let currentPage = 1;
|
|
360
|
+
const totalPages = ${totalPages};
|
|
361
|
+
|
|
362
|
+
function showPage(pageNum) {
|
|
363
|
+
// 隐藏所有页面
|
|
364
|
+
document.querySelectorAll('.page').forEach(page => {
|
|
365
|
+
page.style.display = 'none';
|
|
366
|
+
});
|
|
367
|
+
// 显示目标页面
|
|
368
|
+
const targetPage = document.querySelector('.page[data-page="' + pageNum + '"]');
|
|
369
|
+
if (targetPage) {
|
|
370
|
+
targetPage.style.display = 'block';
|
|
371
|
+
}
|
|
372
|
+
currentPage = pageNum;
|
|
373
|
+
updatePaginationButtons();
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function updatePaginationButtons() {
|
|
377
|
+
const prevBtn = document.getElementById('prev-btn');
|
|
378
|
+
const nextBtn = document.getElementById('next-btn');
|
|
379
|
+
const pageInfo = document.getElementById('page-info');
|
|
380
|
+
if (prevBtn) prevBtn.disabled = currentPage === 1;
|
|
381
|
+
if (nextBtn) nextBtn.disabled = currentPage === totalPages;
|
|
382
|
+
if (pageInfo) pageInfo.textContent = 'Page ' + currentPage + ' of ' + totalPages;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// 绑定按钮事件
|
|
386
|
+
const prevBtn = document.getElementById('prev-btn');
|
|
387
|
+
const nextBtn = document.getElementById('next-btn');
|
|
388
|
+
if (prevBtn) {
|
|
389
|
+
prevBtn.addEventListener('click', function() {
|
|
390
|
+
if (currentPage > 1) showPage(currentPage - 1);
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
if (nextBtn) {
|
|
394
|
+
nextBtn.addEventListener('click', function() {
|
|
395
|
+
if (currentPage < totalPages) showPage(currentPage + 1);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// 初始化
|
|
400
|
+
updatePaginationButtons();
|
|
401
|
+
})();
|
|
402
|
+
<\/script>
|
|
403
|
+
</body>
|
|
404
|
+
</html>`;
|
|
405
|
+
}
|
|
406
|
+
function generatePaginationHtml(totalPages, theme, textColor) {
|
|
407
|
+
return `
|
|
408
|
+
<div class="pagination">
|
|
409
|
+
<button id="prev-btn" disabled>← Previous</button>
|
|
410
|
+
<span class="page-info" id="page-info">Page 1 of ${totalPages}</span>
|
|
411
|
+
<button id="next-btn" ${totalPages <= 1 ? "disabled" : ""}>Next →</button>
|
|
412
|
+
</div>`;
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=wts-html-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wts-html-template.js","sourceRoot":"","sources":["../../../../../src/w/messenger/templates/wts-html-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -256,7 +256,7 @@ export interface ChainProofResponse {
|
|
|
256
256
|
blockTimestamp: number;
|
|
257
257
|
}
|
|
258
258
|
export declare const WTS_FILE_BYTES_LIMIT: number;
|
|
259
|
-
export declare const WTS_MAX_MESSAGE_COUNT =
|
|
259
|
+
export declare const WTS_MAX_MESSAGE_COUNT = 500;
|
|
260
260
|
export declare const NORMAL_MESSAGE_BYTES_LIMIT: number;
|
|
261
261
|
export declare const DEFAULT_QUERY_LIMIT = 50;
|
|
262
262
|
export declare const MAX_QUERY_LIMIT = 1000;
|
|
@@ -358,6 +358,7 @@ export interface SendMessageResult {
|
|
|
358
358
|
serverPublicKey: string;
|
|
359
359
|
};
|
|
360
360
|
guardList?: string[];
|
|
361
|
+
lastReceivedLeafIndex?: number;
|
|
361
362
|
}
|
|
362
363
|
export interface DecryptedMessage {
|
|
363
364
|
id: string;
|
|
@@ -667,12 +668,15 @@ export interface WtsMeta {
|
|
|
667
668
|
endTime: number;
|
|
668
669
|
messageCount: number;
|
|
669
670
|
merkleRoot: string;
|
|
671
|
+
/** WTS 生成者地址 */
|
|
672
|
+
creator: string;
|
|
673
|
+
/** 参与者地址(对方) */
|
|
674
|
+
participant: string;
|
|
670
675
|
serverPublicKeys?: WtsServerPublicKey[];
|
|
671
676
|
signature?: WtsSignature | WtsSignature[];
|
|
672
677
|
}
|
|
673
678
|
/** WTS 文件结构 */
|
|
674
679
|
export interface WtsFile {
|
|
675
|
-
wts: string;
|
|
676
680
|
payload: WtsPayload;
|
|
677
681
|
meta: WtsMeta;
|
|
678
682
|
}
|
|
@@ -736,7 +740,7 @@ export interface GetSettingsRequest extends SignedRequestBase {
|
|
|
736
740
|
export interface GetSettingsResponse {
|
|
737
741
|
allowStrangerMessages?: boolean;
|
|
738
742
|
maxInboxSize?: number;
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
743
|
+
serverMinInboxSizeLimit: number;
|
|
744
|
+
serverMaxInboxSizeLimit: number;
|
|
745
|
+
serverDefaultAllowStrangerMessages: boolean;
|
|
742
746
|
}
|
|
@@ -34,12 +34,13 @@ export var MessageStatus;
|
|
|
34
34
|
})(MessageStatus || (MessageStatus = {}));
|
|
35
35
|
// ========== 配置类型 ==========
|
|
36
36
|
export const WTS_FILE_BYTES_LIMIT = 5 * 1024 * 1024; // 5M
|
|
37
|
-
export const WTS_MAX_MESSAGE_COUNT =
|
|
37
|
+
export const WTS_MAX_MESSAGE_COUNT = 500; // 500条消息最大
|
|
38
38
|
export const NORMAL_MESSAGE_BYTES_LIMIT = 10 * 1024; // 10KB 普通消息大小限制
|
|
39
39
|
export const DEFAULT_QUERY_LIMIT = 50; // 默认查询返回50条
|
|
40
40
|
export const MAX_QUERY_LIMIT = 1000; // 最大查询返回1000条
|
|
41
41
|
export const DEFAULT_DEVICE_ID = 1;
|
|
42
|
-
export const SERVER_URL =
|
|
42
|
+
export const SERVER_URL =
|
|
43
|
+
/* "http://127.0.0.1:3000*/ "https://messenger.wowok.net";
|
|
43
44
|
export const CHAIN_PROOF_TYPE = 1;
|
|
44
45
|
export const CURRENT_NETWORK = ENTRYPOINT.Testnet;
|
|
45
46
|
export const DEFAULT_MESSENGER_CONFIG = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/w/messenger/types.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAIrD;;;;;;;GAOG;AAEH,6BAA6B;AAE7B,MAAM,CAAN,IAAY,WAKX;AALD,WAAY,WAAW;IACtB,iEAAkB,CAAA;IAClB,iEAAkB,CAAA;IAClB,sDAAsD;IACtD,mCAAmC;AACpC,CAAC,EALW,WAAW,KAAX,WAAW,QAKtB;AAED,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC3B,iCAAa,CAAA;IACb,yCAAqB,CAAA;AACtB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,MAAM,CAAN,IAAY,aAQX;AARD,WAAY,aAAa;IACxB,oCAAmB,CAAA;IACnB,wCAAuB,CAAA;IACvB,8BAAa,CAAA;IACb,kCAAiB,CAAA;IACjB,sCAAqB,CAAA;IACrB,wCAAuB,CAAA;IACvB,kDAAiC,CAAA;AAClC,CAAC,EARW,aAAa,KAAb,aAAa,QAQxB;AAsSD,6BAA6B;AAC7B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/w/messenger/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export interface IAccountStorage {
|
|
|
9
9
|
clear(): Promise<void>;
|
|
10
10
|
}
|
|
11
11
|
export declare const DEFAULT_ACCOUNT_NAME = "";
|
|
12
|
-
export declare const MAX_MESSENGER_ACCOUNTS =
|
|
12
|
+
export declare const MAX_MESSENGER_ACCOUNTS = 30;
|
|
13
13
|
export type FaucetCoinInfo = {
|
|
14
14
|
amount: number;
|
|
15
15
|
id: string;
|
|
@@ -14,7 +14,7 @@ import { Config } from "./config.js";
|
|
|
14
14
|
import { SQLiteAccountStorage } from "./storage.js";
|
|
15
15
|
import { isValidWowAddress } from "../../utils/sui-types.js";
|
|
16
16
|
export const DEFAULT_ACCOUNT_NAME = "";
|
|
17
|
-
export const MAX_MESSENGER_ACCOUNTS =
|
|
17
|
+
export const MAX_MESSENGER_ACCOUNTS = 30;
|
|
18
18
|
export class Account {
|
|
19
19
|
static _instance;
|
|
20
20
|
static storage;
|
|
@@ -89,7 +89,8 @@ export class Account {
|
|
|
89
89
|
else {
|
|
90
90
|
await storage.put(JSON.stringify([ret]));
|
|
91
91
|
}
|
|
92
|
-
// 如果指定了 messenger
|
|
92
|
+
// 如果指定了 messenger 名称,保存到账号数据
|
|
93
|
+
// Messenger 的初始化由 MessengerManager 在首次使用时自动完成
|
|
93
94
|
if (m) {
|
|
94
95
|
const storage2 = await this.getStorage();
|
|
95
96
|
const value2 = await storage2.get();
|
|
@@ -100,32 +101,19 @@ export class Account {
|
|
|
100
101
|
W_ERROR(WErrors.InvalidParam, `Maximum ${MAX_MESSENGER_ACCOUNTS} messenger accounts allowed, current count: ${messengerCount}`);
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (value3) {
|
|
115
|
-
const data = JSON.parse(value3);
|
|
116
|
-
const account = data.find((d) => d.address === address);
|
|
117
|
-
if (account) {
|
|
118
|
-
account.m = m;
|
|
119
|
-
account.updatedAt = Date.now();
|
|
120
|
-
await storage3.put(JSON.stringify(data));
|
|
121
|
-
}
|
|
104
|
+
// 保存 m 字段到账号数据
|
|
105
|
+
ret.m = m;
|
|
106
|
+
const storage3 = await this.getStorage();
|
|
107
|
+
const value3 = await storage3.get();
|
|
108
|
+
if (value3) {
|
|
109
|
+
const data = JSON.parse(value3);
|
|
110
|
+
const account = data.find((d) => d.address === address);
|
|
111
|
+
if (account) {
|
|
112
|
+
account.m = m;
|
|
113
|
+
account.updatedAt = Date.now();
|
|
114
|
+
await storage3.put(JSON.stringify(data));
|
|
122
115
|
}
|
|
123
116
|
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
// 注册失败,不回滚账户,只提示用户稍后手动开通
|
|
126
|
-
console.warn(`[Account] Messenger registration failed for ${address}:`, error);
|
|
127
|
-
W_ERROR(WErrors.InvalidParam, `Account created successfully! But messenger registration failed, please try enabling messenger later.`);
|
|
128
|
-
}
|
|
129
117
|
}
|
|
130
118
|
return this.accountData(ret);
|
|
131
119
|
}
|
|
@@ -711,27 +699,7 @@ export class Account {
|
|
|
711
699
|
if (currentCount >= MAX_MESSENGER_ACCOUNTS) {
|
|
712
700
|
W_ERROR(WErrors.InvalidParam, `Maximum ${MAX_MESSENGER_ACCOUNTS} messenger accounts allowed, current count: ${currentCount}`);
|
|
713
701
|
}
|
|
714
|
-
//
|
|
715
|
-
try {
|
|
716
|
-
// 动态导入 Messenger 以避免循环依赖
|
|
717
|
-
// eslint-disable-next-line import/no-cycle
|
|
718
|
-
const { Messenger } = await import("../messenger/messenger.js");
|
|
719
|
-
const messenger = new Messenger(f.address);
|
|
720
|
-
await messenger.initialize();
|
|
721
|
-
//console.log(`Messenger initialized and registered for ${f.address.slice(0, 30)}...`);
|
|
722
|
-
}
|
|
723
|
-
catch (error) {
|
|
724
|
-
// 如果注册失败,先打印详细错误信息,再报错
|
|
725
|
-
console.error(`[Account Debug] 原始错误详情:`, error);
|
|
726
|
-
if (error instanceof Error) {
|
|
727
|
-
console.error(`[Account Debug] 错误名称:`, error.name);
|
|
728
|
-
console.error(`[Account Debug] 错误消息:`, error.message);
|
|
729
|
-
console.error(`[Account Debug] 错误堆栈:`, error.stack);
|
|
730
|
-
}
|
|
731
|
-
// 如果注册失败,直接报错,不保存任何本地更改
|
|
732
|
-
W_ERROR(WErrors.InvalidParam, `Failed to initialize messenger: ${error instanceof Error ? error.message : String(error)}`);
|
|
733
|
-
}
|
|
734
|
-
// 【关键修复】只有服务器注册成功后,才保存 f.m 到本地
|
|
702
|
+
// 【修改】直接保存 m 字段,Messenger 的初始化由 MessengerManager 在首次使用时自动完成
|
|
735
703
|
const now = Date.now();
|
|
736
704
|
f.m = m;
|
|
737
705
|
f.updatedAt = now;
|