pi-courier 0.1.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/README.md +363 -0
- package/README.zh-CN.md +362 -0
- package/deploy/pi-msg-bridge.service +26 -0
- package/deploy/pi-msg-bridge.user.service +37 -0
- package/dist/auth/challenge-auth.d.ts +76 -0
- package/dist/auth/challenge-auth.d.ts.map +1 -0
- package/dist/auth/challenge-auth.js +337 -0
- package/dist/auth/challenge-auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +265 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/formatting.d.ts +22 -0
- package/dist/formatting.d.ts.map +1 -0
- package/dist/formatting.js +74 -0
- package/dist/formatting.js.map +1 -0
- package/dist/lock.d.ts +3 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +75 -0
- package/dist/lock.js.map +1 -0
- package/dist/rpc/command-map.d.ts +19 -0
- package/dist/rpc/command-map.d.ts.map +1 -0
- package/dist/rpc/command-map.js +191 -0
- package/dist/rpc/command-map.js.map +1 -0
- package/dist/rpc/message-router.d.ts +30 -0
- package/dist/rpc/message-router.d.ts.map +1 -0
- package/dist/rpc/message-router.js +110 -0
- package/dist/rpc/message-router.js.map +1 -0
- package/dist/rpc/pi-rpc.d.ts +79 -0
- package/dist/rpc/pi-rpc.d.ts.map +1 -0
- package/dist/rpc/pi-rpc.js +199 -0
- package/dist/rpc/pi-rpc.js.map +1 -0
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +159 -0
- package/dist/setup.js.map +1 -0
- package/dist/standalone.d.ts +13 -0
- package/dist/standalone.d.ts.map +1 -0
- package/dist/standalone.js +184 -0
- package/dist/standalone.js.map +1 -0
- package/dist/transports/discord.d.ts +33 -0
- package/dist/transports/discord.d.ts.map +1 -0
- package/dist/transports/discord.js +216 -0
- package/dist/transports/discord.js.map +1 -0
- package/dist/transports/interface.d.ts +42 -0
- package/dist/transports/interface.d.ts.map +1 -0
- package/dist/transports/interface.js +2 -0
- package/dist/transports/interface.js.map +1 -0
- package/dist/transports/manager.d.ts +54 -0
- package/dist/transports/manager.d.ts.map +1 -0
- package/dist/transports/manager.js +98 -0
- package/dist/transports/manager.js.map +1 -0
- package/dist/transports/matrix-utils.d.ts +31 -0
- package/dist/transports/matrix-utils.d.ts.map +1 -0
- package/dist/transports/matrix-utils.js +99 -0
- package/dist/transports/matrix-utils.js.map +1 -0
- package/dist/transports/matrix-utils.test.d.ts +2 -0
- package/dist/transports/matrix-utils.test.d.ts.map +1 -0
- package/dist/transports/matrix-utils.test.js +246 -0
- package/dist/transports/matrix-utils.test.js.map +1 -0
- package/dist/transports/matrix.d.ts +34 -0
- package/dist/transports/matrix.d.ts.map +1 -0
- package/dist/transports/matrix.js +240 -0
- package/dist/transports/matrix.js.map +1 -0
- package/dist/transports/slack.d.ts +31 -0
- package/dist/transports/slack.d.ts.map +1 -0
- package/dist/transports/slack.js +203 -0
- package/dist/transports/slack.js.map +1 -0
- package/dist/transports/telegram.d.ts +38 -0
- package/dist/transports/telegram.d.ts.map +1 -0
- package/dist/transports/telegram.js +167 -0
- package/dist/transports/telegram.js.map +1 -0
- package/dist/transports/whatsapp.d.ts +31 -0
- package/dist/transports/whatsapp.d.ts.map +1 -0
- package/dist/transports/whatsapp.js +235 -0
- package/dist/transports/whatsapp.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/extensions/index.ts +42 -0
- package/package.json +71 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages multiple transport providers and routes messages
|
|
3
|
+
*/
|
|
4
|
+
export class TransportManager {
|
|
5
|
+
transports = new Map();
|
|
6
|
+
messageHandler;
|
|
7
|
+
errorHandler;
|
|
8
|
+
/**
|
|
9
|
+
* Register a transport provider
|
|
10
|
+
*/
|
|
11
|
+
addTransport(transport) {
|
|
12
|
+
this.transports.set(transport.type, transport);
|
|
13
|
+
// Forward messages from this transport
|
|
14
|
+
transport.onMessage((msg) => {
|
|
15
|
+
if (this.messageHandler) {
|
|
16
|
+
this.messageHandler(msg);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
// Forward errors from this transport
|
|
20
|
+
transport.onError((err) => {
|
|
21
|
+
if (this.errorHandler) {
|
|
22
|
+
this.errorHandler(err, transport.type);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get a specific transport by type
|
|
28
|
+
*/
|
|
29
|
+
getTransport(type) {
|
|
30
|
+
return this.transports.get(type);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get all registered transports
|
|
34
|
+
*/
|
|
35
|
+
getAllTransports() {
|
|
36
|
+
return Array.from(this.transports.values());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Connect all registered transports
|
|
40
|
+
*/
|
|
41
|
+
async connectAll() {
|
|
42
|
+
const connections = Array.from(this.transports.values()).map((t) => t.connect().catch((err) => {
|
|
43
|
+
throw new Error(`${t.type} connection failed: ${err.message}`);
|
|
44
|
+
}));
|
|
45
|
+
await Promise.all(connections);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Disconnect all transports
|
|
49
|
+
*/
|
|
50
|
+
async disconnectAll() {
|
|
51
|
+
const disconnections = Array.from(this.transports.values()).map((t) => t.disconnect());
|
|
52
|
+
await Promise.allSettled(disconnections);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Send a message to a specific chat via a specific transport
|
|
56
|
+
*/
|
|
57
|
+
async sendMessage(chatId, transportType, text) {
|
|
58
|
+
const transport = this.transports.get(transportType);
|
|
59
|
+
if (!transport) {
|
|
60
|
+
throw new Error(`Transport ${transportType} not found`);
|
|
61
|
+
}
|
|
62
|
+
if (!transport.isConnected) {
|
|
63
|
+
throw new Error(`Transport ${transportType} not connected`);
|
|
64
|
+
}
|
|
65
|
+
await transport.sendMessage(chatId, text);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Send typing indicator to a chat via a specific transport
|
|
69
|
+
*/
|
|
70
|
+
async sendTyping(chatId, transportType) {
|
|
71
|
+
const transport = this.transports.get(transportType);
|
|
72
|
+
if (transport?.isConnected) {
|
|
73
|
+
await transport.sendTyping(chatId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Register handler for incoming messages from all transports
|
|
78
|
+
*/
|
|
79
|
+
onMessage(handler) {
|
|
80
|
+
this.messageHandler = handler;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register handler for errors from all transports
|
|
84
|
+
*/
|
|
85
|
+
onError(handler) {
|
|
86
|
+
this.errorHandler = handler;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get connection status for all transports
|
|
90
|
+
*/
|
|
91
|
+
getStatus() {
|
|
92
|
+
return Array.from(this.transports.values()).map((t) => ({
|
|
93
|
+
type: t.type,
|
|
94
|
+
connected: t.isConnected,
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure utility functions for Matrix transport.
|
|
3
|
+
* Extracted for testability — no SDK or network dependencies.
|
|
4
|
+
*/
|
|
5
|
+
/** Escape HTML special characters */
|
|
6
|
+
export declare function escapeHtml(text: string): string;
|
|
7
|
+
/** Convert markdown to Matrix HTML. Returns plain body + optional formatted HTML. */
|
|
8
|
+
export declare function formatForMatrix(text: string): {
|
|
9
|
+
body: string;
|
|
10
|
+
formattedBody?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Determine whether to skip a Matrix room event before processing.
|
|
14
|
+
* Returns a reason string if the event should be skipped, or null if it should be processed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function shouldSkipEvent(event: {
|
|
17
|
+
sender?: string;
|
|
18
|
+
origin_server_ts?: number;
|
|
19
|
+
content?: any;
|
|
20
|
+
}, botUserId: string, connectedAt: number, joinedRooms: Set<string>, roomId: string): string | null;
|
|
21
|
+
/** Extract Matrix username (localpart) from a full MXID like @user:matrix.org */
|
|
22
|
+
export declare function extractUsername(userId: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Check if bot was mentioned, matching either:
|
|
25
|
+
* - the full MXID `@user:server`
|
|
26
|
+
* - `@localpart` as a leading-@ word (avoids false-positives on bare names)
|
|
27
|
+
*/
|
|
28
|
+
export declare function wasBotMentioned(messageText: string, botUserId: string): boolean;
|
|
29
|
+
/** Strip bot mention from message text — symmetric with wasBotMentioned */
|
|
30
|
+
export declare function stripBotMention(text: string, botUserId: string): string;
|
|
31
|
+
//# sourceMappingURL=matrix-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-utils.d.ts","sourceRoot":"","sources":["../../src/transports/matrix-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCtF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,EACpE,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAmBf;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAM/E;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAOvE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure utility functions for Matrix transport.
|
|
3
|
+
* Extracted for testability — no SDK or network dependencies.
|
|
4
|
+
*/
|
|
5
|
+
/** Escape HTML special characters */
|
|
6
|
+
export function escapeHtml(text) {
|
|
7
|
+
return text
|
|
8
|
+
.replace(/&/g, "&")
|
|
9
|
+
.replace(/</g, "<")
|
|
10
|
+
.replace(/>/g, ">")
|
|
11
|
+
.replace(/"/g, """);
|
|
12
|
+
}
|
|
13
|
+
/** Convert markdown to Matrix HTML. Returns plain body + optional formatted HTML. */
|
|
14
|
+
export function formatForMatrix(text) {
|
|
15
|
+
const hasMarkdown = /[*_`#[]/.test(text);
|
|
16
|
+
if (!hasMarkdown) {
|
|
17
|
+
return { body: text };
|
|
18
|
+
}
|
|
19
|
+
let html = text;
|
|
20
|
+
// Protect code blocks
|
|
21
|
+
const codeBlocks = [];
|
|
22
|
+
html = html.replace(/```(\w*)\n?([\s\S]*?)```/g, (_, lang, code) => {
|
|
23
|
+
codeBlocks.push(`<pre><code${lang ? ` class="language-${lang}"` : ""}>${escapeHtml(code.trimEnd())}</code></pre>`);
|
|
24
|
+
return `__CODEBLOCK_${codeBlocks.length - 1}__`;
|
|
25
|
+
});
|
|
26
|
+
// Protect inline code
|
|
27
|
+
const inlineCodes = [];
|
|
28
|
+
html = html.replace(/`([^`]+)`/g, (_, code) => {
|
|
29
|
+
inlineCodes.push(`<code>${escapeHtml(code)}</code>`);
|
|
30
|
+
return `__INLINECODE_${inlineCodes.length - 1}__`;
|
|
31
|
+
});
|
|
32
|
+
// Bold
|
|
33
|
+
html = html.replace(/\*\*([^*]+?)\*\*/g, "<strong>$1</strong>");
|
|
34
|
+
// Italic
|
|
35
|
+
html = html.replace(/(?<!\*)\*(?!\*)([^*]+?)(?<!\*)\*(?!\*)/g, "<em>$1</em>");
|
|
36
|
+
// Links
|
|
37
|
+
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
38
|
+
// Newlines to <br>
|
|
39
|
+
html = html.replace(/\n/g, "<br>");
|
|
40
|
+
// Restore code blocks and inline code
|
|
41
|
+
html = html.replace(/__CODEBLOCK_(\d+)__/g, (_, idx) => codeBlocks[parseInt(idx, 10)]);
|
|
42
|
+
html = html.replace(/__INLINECODE_(\d+)__/g, (_, idx) => inlineCodes[parseInt(idx, 10)]);
|
|
43
|
+
return { body: text, formattedBody: html };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Determine whether to skip a Matrix room event before processing.
|
|
47
|
+
* Returns a reason string if the event should be skipped, or null if it should be processed.
|
|
48
|
+
*/
|
|
49
|
+
export function shouldSkipEvent(event, botUserId, connectedAt, joinedRooms, roomId) {
|
|
50
|
+
// Ignore own messages
|
|
51
|
+
if (event.sender === botUserId)
|
|
52
|
+
return "own_message";
|
|
53
|
+
// Skip events from before this connection (stale replay from initial sync)
|
|
54
|
+
const eventTs = event.origin_server_ts || 0;
|
|
55
|
+
if (eventTs < connectedAt)
|
|
56
|
+
return "stale";
|
|
57
|
+
// Only process text messages
|
|
58
|
+
const content = event.content;
|
|
59
|
+
if (!content || content.msgtype !== "m.text" || !content.body)
|
|
60
|
+
return "not_text";
|
|
61
|
+
// Ignore edits (we only process original messages)
|
|
62
|
+
if (content["m.new_content"])
|
|
63
|
+
return "edit";
|
|
64
|
+
// Skip events from rooms we're not in (cached, no API call)
|
|
65
|
+
if (!joinedRooms.has(roomId))
|
|
66
|
+
return "not_joined";
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/** Extract Matrix username (localpart) from a full MXID like @user:matrix.org */
|
|
70
|
+
export function extractUsername(userId) {
|
|
71
|
+
return userId.replace(/^@/, "").replace(/:.*$/, "");
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if bot was mentioned, matching either:
|
|
75
|
+
* - the full MXID `@user:server`
|
|
76
|
+
* - `@localpart` as a leading-@ word (avoids false-positives on bare names)
|
|
77
|
+
*/
|
|
78
|
+
export function wasBotMentioned(messageText, botUserId) {
|
|
79
|
+
if (messageText.includes(botUserId))
|
|
80
|
+
return true;
|
|
81
|
+
const localpart = extractUsername(botUserId);
|
|
82
|
+
if (!localpart)
|
|
83
|
+
return false;
|
|
84
|
+
const re = new RegExp(`@${escapeRegExp(localpart)}\\b`, "i");
|
|
85
|
+
return re.test(messageText);
|
|
86
|
+
}
|
|
87
|
+
/** Strip bot mention from message text — symmetric with wasBotMentioned */
|
|
88
|
+
export function stripBotMention(text, botUserId) {
|
|
89
|
+
const localpart = extractUsername(botUserId);
|
|
90
|
+
let out = text.replace(new RegExp(escapeRegExp(botUserId), "g"), "");
|
|
91
|
+
if (localpart) {
|
|
92
|
+
out = out.replace(new RegExp(`@${escapeRegExp(localpart)}\\b`, "gi"), "");
|
|
93
|
+
}
|
|
94
|
+
return out.trim();
|
|
95
|
+
}
|
|
96
|
+
function escapeRegExp(s) {
|
|
97
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=matrix-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-utils.js","sourceRoot":"","sources":["../../src/transports/matrix-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-utils.test.d.ts","sourceRoot":"","sources":["../../src/transports/matrix-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import * as fc from "fast-check";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { escapeHtml, extractUsername, formatForMatrix, shouldSkipEvent, stripBotMention, wasBotMentioned, } from "./matrix-utils.js";
|
|
4
|
+
// ─── escapeHtml ───────────────────────────────────────────────
|
|
5
|
+
describe("escapeHtml", () => {
|
|
6
|
+
it("escapes ampersand", () => {
|
|
7
|
+
expect(escapeHtml("a & b")).toBe("a & b");
|
|
8
|
+
});
|
|
9
|
+
it("escapes angle brackets", () => {
|
|
10
|
+
expect(escapeHtml("<script>")).toBe("<script>");
|
|
11
|
+
});
|
|
12
|
+
it("escapes double quotes", () => {
|
|
13
|
+
expect(escapeHtml('say "hello"')).toBe("say "hello"");
|
|
14
|
+
});
|
|
15
|
+
it("handles all special chars together", () => {
|
|
16
|
+
expect(escapeHtml('<a href="x">&')).toBe("<a href="x">&");
|
|
17
|
+
});
|
|
18
|
+
it("returns plain text unchanged", () => {
|
|
19
|
+
expect(escapeHtml("hello world")).toBe("hello world");
|
|
20
|
+
});
|
|
21
|
+
it("handles empty string", () => {
|
|
22
|
+
expect(escapeHtml("")).toBe("");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
// ─── formatForMatrix ──────────────────────────────────────────
|
|
26
|
+
describe("formatForMatrix", () => {
|
|
27
|
+
it("returns plain body only for text without markdown", () => {
|
|
28
|
+
const result = formatForMatrix("hello world");
|
|
29
|
+
expect(result).toEqual({ body: "hello world" });
|
|
30
|
+
expect(result.formattedBody).toBeUndefined();
|
|
31
|
+
});
|
|
32
|
+
it("converts **bold** to <strong>", () => {
|
|
33
|
+
const result = formatForMatrix("this is **bold** text");
|
|
34
|
+
expect(result.body).toBe("this is **bold** text");
|
|
35
|
+
expect(result.formattedBody).toContain("<strong>bold</strong>");
|
|
36
|
+
});
|
|
37
|
+
it("converts *italic* to <em>", () => {
|
|
38
|
+
const result = formatForMatrix("this is *italic* text");
|
|
39
|
+
expect(result.formattedBody).toContain("<em>italic</em>");
|
|
40
|
+
});
|
|
41
|
+
it("does not confuse **bold** with *italic*", () => {
|
|
42
|
+
const result = formatForMatrix("**bold** and *italic*");
|
|
43
|
+
expect(result.formattedBody).toContain("<strong>bold</strong>");
|
|
44
|
+
expect(result.formattedBody).toContain("<em>italic</em>");
|
|
45
|
+
});
|
|
46
|
+
it("converts [text](url) to <a href>", () => {
|
|
47
|
+
const result = formatForMatrix("click [here](https://example.com)");
|
|
48
|
+
expect(result.formattedBody).toContain('<a href="https://example.com">here</a>');
|
|
49
|
+
});
|
|
50
|
+
it("converts newlines to <br>", () => {
|
|
51
|
+
const result = formatForMatrix("line *one*\nline two");
|
|
52
|
+
expect(result.formattedBody).toContain("<br>");
|
|
53
|
+
});
|
|
54
|
+
it("protects inline code from markdown conversion", () => {
|
|
55
|
+
const result = formatForMatrix("use `**not bold**` here");
|
|
56
|
+
expect(result.formattedBody).toContain("<code>");
|
|
57
|
+
expect(result.formattedBody).not.toContain("<strong>not bold</strong>");
|
|
58
|
+
});
|
|
59
|
+
it("protects code blocks from markdown conversion", () => {
|
|
60
|
+
const result = formatForMatrix("```\n**not bold**\n```");
|
|
61
|
+
expect(result.formattedBody).toContain("<pre><code>");
|
|
62
|
+
expect(result.formattedBody).not.toContain("<strong>");
|
|
63
|
+
});
|
|
64
|
+
it("adds language class to code blocks", () => {
|
|
65
|
+
const result = formatForMatrix("```typescript\nconst x = 1;\n```");
|
|
66
|
+
expect(result.formattedBody).toContain('class="language-typescript"');
|
|
67
|
+
});
|
|
68
|
+
it("escapes HTML inside code blocks", () => {
|
|
69
|
+
const result = formatForMatrix("```\n<script>alert('xss')</script>\n```");
|
|
70
|
+
expect(result.formattedBody).toContain("<script>");
|
|
71
|
+
expect(result.formattedBody).not.toContain("<script>");
|
|
72
|
+
});
|
|
73
|
+
it("escapes HTML inside inline code", () => {
|
|
74
|
+
const result = formatForMatrix("use `<div>` tag");
|
|
75
|
+
expect(result.formattedBody).toContain("<div>");
|
|
76
|
+
});
|
|
77
|
+
it("preserves original text as body even when formatted", () => {
|
|
78
|
+
const original = "**bold** and `code`";
|
|
79
|
+
const result = formatForMatrix(original);
|
|
80
|
+
expect(result.body).toBe(original);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// ─── shouldSkipEvent ──────────────────────────────────────────
|
|
84
|
+
describe("shouldSkipEvent", () => {
|
|
85
|
+
const botUserId = "@bot:matrix.org";
|
|
86
|
+
const connectedAt = 1000;
|
|
87
|
+
const joinedRooms = new Set(["!room1:matrix.org", "!room2:matrix.org"]);
|
|
88
|
+
function makeEvent(overrides = {}) {
|
|
89
|
+
return {
|
|
90
|
+
sender: "@user:matrix.org",
|
|
91
|
+
origin_server_ts: 2000,
|
|
92
|
+
content: { msgtype: "m.text", body: "hello" },
|
|
93
|
+
...overrides,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
it("returns null for a valid message", () => {
|
|
97
|
+
expect(shouldSkipEvent(makeEvent(), botUserId, connectedAt, joinedRooms, "!room1:matrix.org")).toBeNull();
|
|
98
|
+
});
|
|
99
|
+
it("skips own messages", () => {
|
|
100
|
+
expect(shouldSkipEvent(makeEvent({ sender: botUserId }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
101
|
+
.toBe("own_message");
|
|
102
|
+
});
|
|
103
|
+
it("skips stale events (before connectedAt)", () => {
|
|
104
|
+
expect(shouldSkipEvent(makeEvent({ origin_server_ts: 500 }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
105
|
+
.toBe("stale");
|
|
106
|
+
});
|
|
107
|
+
it("skips events at exactly connectedAt (boundary: < not <=)", () => {
|
|
108
|
+
// connectedAt=1000, event ts=1000 → NOT stale (< is strict)
|
|
109
|
+
expect(shouldSkipEvent(makeEvent({ origin_server_ts: 1000 }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
110
|
+
.toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it("skips events with ts=999 (one below connectedAt)", () => {
|
|
113
|
+
expect(shouldSkipEvent(makeEvent({ origin_server_ts: 999 }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
114
|
+
.toBe("stale");
|
|
115
|
+
});
|
|
116
|
+
it("skips non-text messages", () => {
|
|
117
|
+
expect(shouldSkipEvent(makeEvent({ content: { msgtype: "m.image", body: "photo" } }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
118
|
+
.toBe("not_text");
|
|
119
|
+
});
|
|
120
|
+
it("skips messages with no content", () => {
|
|
121
|
+
expect(shouldSkipEvent(makeEvent({ content: undefined }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
122
|
+
.toBe("not_text");
|
|
123
|
+
});
|
|
124
|
+
it("skips messages with no body", () => {
|
|
125
|
+
expect(shouldSkipEvent(makeEvent({ content: { msgtype: "m.text" } }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
126
|
+
.toBe("not_text");
|
|
127
|
+
});
|
|
128
|
+
it("skips edits (m.new_content present)", () => {
|
|
129
|
+
expect(shouldSkipEvent(makeEvent({ content: { msgtype: "m.text", body: "edited", "m.new_content": { body: "new" } } }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org")).toBe("edit");
|
|
130
|
+
});
|
|
131
|
+
it("skips events from rooms not in joinedRooms", () => {
|
|
132
|
+
expect(shouldSkipEvent(makeEvent(), botUserId, connectedAt, joinedRooms, "!unknown:matrix.org"))
|
|
133
|
+
.toBe("not_joined");
|
|
134
|
+
});
|
|
135
|
+
it("handles missing origin_server_ts (defaults to 0, always stale)", () => {
|
|
136
|
+
expect(shouldSkipEvent(makeEvent({ origin_server_ts: undefined }), botUserId, connectedAt, joinedRooms, "!room1:matrix.org"))
|
|
137
|
+
.toBe("stale");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// ─── extractUsername ──────────────────────────────────────────
|
|
141
|
+
describe("extractUsername", () => {
|
|
142
|
+
it("extracts localpart from full MXID", () => {
|
|
143
|
+
expect(extractUsername("@alice:matrix.org")).toBe("alice");
|
|
144
|
+
});
|
|
145
|
+
it("handles homeserver with port", () => {
|
|
146
|
+
expect(extractUsername("@bob:localhost:8448")).toBe("bob");
|
|
147
|
+
});
|
|
148
|
+
it("handles already plain username", () => {
|
|
149
|
+
expect(extractUsername("charlie")).toBe("charlie");
|
|
150
|
+
});
|
|
151
|
+
it("handles MXID without @ prefix", () => {
|
|
152
|
+
expect(extractUsername("dave:matrix.org")).toBe("dave");
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
// ─── wasBotMentioned ─────────────────────────────────────────
|
|
156
|
+
describe("wasBotMentioned", () => {
|
|
157
|
+
const botUserId = "@pibot:matrix.org";
|
|
158
|
+
it("detects full MXID mention", () => {
|
|
159
|
+
expect(wasBotMentioned("hey @pibot:matrix.org do this", botUserId)).toBe(true);
|
|
160
|
+
});
|
|
161
|
+
it("detects @localpart mention (case-insensitive)", () => {
|
|
162
|
+
expect(wasBotMentioned("hey @Pibot do this", botUserId)).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
it("detects lowercase @localpart", () => {
|
|
165
|
+
expect(wasBotMentioned("@pibot help", botUserId)).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
it("returns false when not mentioned", () => {
|
|
168
|
+
expect(wasBotMentioned("hello world", botUserId)).toBe(false);
|
|
169
|
+
});
|
|
170
|
+
it("returns false for bare localpart without @ (avoids false positives on names)", () => {
|
|
171
|
+
// "pibot" appearing in casual chat without @ shouldn't be a mention
|
|
172
|
+
expect(wasBotMentioned("pibot help", botUserId)).toBe(false);
|
|
173
|
+
});
|
|
174
|
+
it("returns false for partial match that isn't the localpart", () => {
|
|
175
|
+
expect(wasBotMentioned("pi is great", botUserId)).toBe(false);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
// ─── stripBotMention ─────────────────────────────────────────
|
|
179
|
+
describe("stripBotMention", () => {
|
|
180
|
+
const botUserId = "@pibot:matrix.org";
|
|
181
|
+
it("strips full MXID mention", () => {
|
|
182
|
+
expect(stripBotMention("@pibot:matrix.org help me", botUserId)).toBe("help me");
|
|
183
|
+
});
|
|
184
|
+
it("strips multiple mentions", () => {
|
|
185
|
+
expect(stripBotMention("@pibot:matrix.org hey @pibot:matrix.org", botUserId)).toBe("hey");
|
|
186
|
+
});
|
|
187
|
+
it("returns original text when no mention present", () => {
|
|
188
|
+
expect(stripBotMention("hello world", botUserId)).toBe("hello world");
|
|
189
|
+
});
|
|
190
|
+
it("handles mention at end of message", () => {
|
|
191
|
+
expect(stripBotMention("help @pibot:matrix.org", botUserId)).toBe("help");
|
|
192
|
+
});
|
|
193
|
+
it("handles message that is only the mention", () => {
|
|
194
|
+
expect(stripBotMention("@pibot:matrix.org", botUserId)).toBe("");
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
// ─── Property tests ───────────────────────────────────────────
|
|
198
|
+
describe("formatForMatrix properties", () => {
|
|
199
|
+
it("body always equals original input (preservation)", () => {
|
|
200
|
+
fc.assert(fc.property(fc.string(), (text) => {
|
|
201
|
+
const result = formatForMatrix(text);
|
|
202
|
+
expect(result.body).toBe(text);
|
|
203
|
+
}));
|
|
204
|
+
});
|
|
205
|
+
it("formattedBody is undefined when no markdown chars present", () => {
|
|
206
|
+
// Generate strings that don't contain markdown-triggering chars
|
|
207
|
+
const noMarkdown = fc.string().filter((s) => !/[*_`#[]/.test(s));
|
|
208
|
+
fc.assert(fc.property(noMarkdown, (text) => {
|
|
209
|
+
const result = formatForMatrix(text);
|
|
210
|
+
expect(result.formattedBody).toBeUndefined();
|
|
211
|
+
}));
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
describe("stripBotMention properties", () => {
|
|
215
|
+
it("result never contains the bot MXID (verification)", () => {
|
|
216
|
+
// Generate valid-ish MXIDs: @localpart:server
|
|
217
|
+
const localpart = fc.string({ minLength: 1, maxLength: 10 }).filter((s) => !/[@: ]/.test(s) && s.length > 0);
|
|
218
|
+
const server = fc.string({ minLength: 1, maxLength: 10 }).filter((s) => !/[@: ]/.test(s) && s.length > 0);
|
|
219
|
+
const mxid = fc.tuple(localpart, server).map(([user, host]) => `@${user}:${host}`);
|
|
220
|
+
fc.assert(fc.property(mxid, fc.string(), (botId, prefix) => {
|
|
221
|
+
const text = `${prefix} ${botId} some text`;
|
|
222
|
+
const result = stripBotMention(text, botId);
|
|
223
|
+
expect(result).not.toContain(botId);
|
|
224
|
+
}));
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe("escapeHtml properties", () => {
|
|
228
|
+
it("output never contains raw <, >, &, or \" (except as entities)", () => {
|
|
229
|
+
fc.assert(fc.property(fc.string(), (text) => {
|
|
230
|
+
const result = escapeHtml(text);
|
|
231
|
+
// After escaping, the only < > & " should be inside entity sequences
|
|
232
|
+
const withoutEntities = result
|
|
233
|
+
.replace(/&/g, "")
|
|
234
|
+
.replace(/</g, "")
|
|
235
|
+
.replace(/>/g, "")
|
|
236
|
+
.replace(/"/g, "");
|
|
237
|
+
expect(withoutEntities).not.toMatch(/[<>"&]/);
|
|
238
|
+
}));
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
// Excluded from testing (design decisions / integration-only, verified by inspection):
|
|
242
|
+
// - connect()/disconnect() lifecycle (requires real MatrixClient)
|
|
243
|
+
// - sendMessage()/sendTyping() (thin SDK wrappers)
|
|
244
|
+
// - index.ts wiring (env var reading, command handler plumbing)
|
|
245
|
+
// - Widget abbreviation (mx)
|
|
246
|
+
//# sourceMappingURL=matrix-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-utils.test.js","sourceRoot":"","sources":["../../src/transports/matrix-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ChallengeAuth } from "../auth/challenge-auth.js";
|
|
2
|
+
import type { ExternalMessage } from "../types.js";
|
|
3
|
+
import type { ITransportProvider } from "./interface.js";
|
|
4
|
+
/**
|
|
5
|
+
* Matrix transport provider using matrix-bot-sdk
|
|
6
|
+
* Works with any Matrix homeserver — Element X, Element Web, FluffyChat, etc.
|
|
7
|
+
*/
|
|
8
|
+
export declare class MatrixProvider implements ITransportProvider {
|
|
9
|
+
private config;
|
|
10
|
+
private auth;
|
|
11
|
+
readonly type = "matrix";
|
|
12
|
+
private client?;
|
|
13
|
+
private _isConnected;
|
|
14
|
+
private messageHandler?;
|
|
15
|
+
private errorHandler?;
|
|
16
|
+
private botUserId?;
|
|
17
|
+
private joinedRooms;
|
|
18
|
+
private roomMemberCount;
|
|
19
|
+
private connectedAt;
|
|
20
|
+
constructor(config: {
|
|
21
|
+
homeserverUrl: string;
|
|
22
|
+
accessToken: string;
|
|
23
|
+
encryption?: boolean;
|
|
24
|
+
}, auth: ChallengeAuth);
|
|
25
|
+
get isConnected(): boolean;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
disconnect(): Promise<void>;
|
|
28
|
+
sendMessage(chatId: string, text: string): Promise<void>;
|
|
29
|
+
sendTyping(chatId: string): Promise<void>;
|
|
30
|
+
onMessage(handler: (message: ExternalMessage) => void): void;
|
|
31
|
+
onError(handler: (error: Error) => void): void;
|
|
32
|
+
private handleMessage;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=matrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../../src/transports/matrix.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASzD;;;GAGG;AACH,qBAAa,cAAe,YAAW,kBAAkB;IAYrD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IAZd,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAC,CAAe;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAC,CAAqC;IAC5D,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,WAAW,CAAK;gBAGd,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,EAC5E,IAAI,EAAE,aAAa;IAG7B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAIK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6HxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAI5D,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;YAIhC,aAAa;CAkF5B"}
|