@moxxy/plugin-channel-imessage 0.37.0 → 0.37.2
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/bluebubbles-client.js +7 -1
- package/dist/bluebubbles-client.js.map +1 -1
- package/dist/keys.d.ts +6 -2
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +15 -2
- package/dist/keys.js.map +1 -1
- package/package.json +7 -7
- package/src/bluebubbles-client.ts +7 -1
- package/src/keys.ts +13 -2
|
@@ -11,7 +11,7 @@ export class BlueBubblesClient {
|
|
|
11
11
|
constructor(opts) {
|
|
12
12
|
this.opts = opts;
|
|
13
13
|
// Normalize the base URL once (strip a trailing slash) so path joins are clean.
|
|
14
|
-
this.base = opts.serverUrl.trim()
|
|
14
|
+
this.base = trimTrailingSlashes(opts.serverUrl.trim());
|
|
15
15
|
}
|
|
16
16
|
async ping() {
|
|
17
17
|
const doFetch = this.opts.fetchImpl ?? fetch;
|
|
@@ -88,6 +88,12 @@ export class BlueBubblesClient {
|
|
|
88
88
|
return url.toString();
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
function trimTrailingSlashes(value) {
|
|
92
|
+
let end = value.length;
|
|
93
|
+
while (end > 0 && value[end - 1] === '/')
|
|
94
|
+
end -= 1;
|
|
95
|
+
return value.slice(0, end);
|
|
96
|
+
}
|
|
91
97
|
/** Read the sent message's permanent guid from the send response, if present. */
|
|
92
98
|
async function extractGuid(res) {
|
|
93
99
|
const body = await res.json().catch(() => null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bluebubbles-client.js","sourceRoot":"","sources":["../src/bluebubbles-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2DzC,gFAAgF;AAChF,MAAM,UAAU,YAAY;IAC1B,OAAO,QAAQ,UAAU,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,iBAAiB;IACX,IAAI,CAA2B;IAC/B,IAAI,CAAS;IACtB,MAAM,GAAsB,IAAI,CAAC;IACxB,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEtE,YAAY,IAA8B;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,gFAAgF;QAChF,IAAI,CAAC,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"bluebubbles-client.js","sourceRoot":"","sources":["../src/bluebubbles-client.ts"],"names":[],"mappings":"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"}
|
package/dist/keys.d.ts
CHANGED
|
@@ -39,10 +39,13 @@ export declare const IMESSAGE_ALLOWED_HANDLES_KEY = "imessage_allowed_handles";
|
|
|
39
39
|
export declare const IMESSAGE_OWNER_HANDLES_KEY = "imessage_owner_handles";
|
|
40
40
|
/** E.164 shape: `+` then 7–15 digits, no leading zero. */
|
|
41
41
|
export declare const E164_RE: RegExp;
|
|
42
|
-
/** Pragmatic email
|
|
43
|
-
export declare const EMAIL_RE:
|
|
42
|
+
/** Pragmatic email matcher (Apple-ID handles), implemented as a linear scan. */
|
|
43
|
+
export declare const EMAIL_RE: Readonly<{
|
|
44
|
+
test: typeof isEmail;
|
|
45
|
+
}>;
|
|
44
46
|
/** Whether a normalized string is a plausible iMessage handle. */
|
|
45
47
|
export declare function isHandle(value: string): boolean;
|
|
48
|
+
declare function isEmail(value: string): boolean;
|
|
46
49
|
/**
|
|
47
50
|
* Canonical handle for allow-list comparisons: trimmed, and lowercased when it
|
|
48
51
|
* is an email (Apple-ID handles are case-insensitive). Phone numbers are left
|
|
@@ -67,4 +70,5 @@ export declare function parseDmChatGuid(guid: string | null | undefined): {
|
|
|
67
70
|
readonly service: string;
|
|
68
71
|
readonly handle: string;
|
|
69
72
|
} | null;
|
|
73
|
+
export {};
|
|
70
74
|
//# sourceMappingURL=keys.d.ts.map
|
package/dist/keys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAC7D,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,qDAAqD;AACrD,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,mCAAmC,CAAC;AAC7E;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAEnE,0DAA0D;AAC1D,eAAO,MAAM,OAAO,QAAsB,CAAC;AAE3C,
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAC7D,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,qDAAqD;AACrD,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,mCAAmC,CAAC;AAC7E;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAEnE,0DAA0D;AAC1D,eAAO,MAAM,OAAO,QAAsB,CAAC;AAE3C,gFAAgF;AAChF,eAAO,MAAM,QAAQ;;EAAmC,CAAC;AAEzD,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,iBAAS,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASvC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAgBxE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa9D"}
|
package/dist/keys.js
CHANGED
|
@@ -39,12 +39,25 @@ export const IMESSAGE_ALLOWED_HANDLES_KEY = 'imessage_allowed_handles';
|
|
|
39
39
|
export const IMESSAGE_OWNER_HANDLES_KEY = 'imessage_owner_handles';
|
|
40
40
|
/** E.164 shape: `+` then 7–15 digits, no leading zero. */
|
|
41
41
|
export const E164_RE = /^\+[1-9]\d{6,14}$/;
|
|
42
|
-
/** Pragmatic email
|
|
43
|
-
export const EMAIL_RE =
|
|
42
|
+
/** Pragmatic email matcher (Apple-ID handles), implemented as a linear scan. */
|
|
43
|
+
export const EMAIL_RE = Object.freeze({ test: isEmail });
|
|
44
44
|
/** Whether a normalized string is a plausible iMessage handle. */
|
|
45
45
|
export function isHandle(value) {
|
|
46
46
|
return E164_RE.test(value) || EMAIL_RE.test(value);
|
|
47
47
|
}
|
|
48
|
+
function isEmail(value) {
|
|
49
|
+
const at = value.indexOf('@');
|
|
50
|
+
if (at <= 0 || at !== value.lastIndexOf('@'))
|
|
51
|
+
return false;
|
|
52
|
+
const dot = value.indexOf('.', at + 1);
|
|
53
|
+
if (dot <= at + 1 || dot === value.length - 1)
|
|
54
|
+
return false;
|
|
55
|
+
for (const char of value) {
|
|
56
|
+
if (/\s/u.test(char))
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
48
61
|
/**
|
|
49
62
|
* Canonical handle for allow-list comparisons: trimmed, and lowercased when it
|
|
50
63
|
* is an email (Apple-ID handles are case-insensitive). Phone numbers are left
|
package/dist/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAC7D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AACnE,qDAAqD;AACrD,MAAM,CAAC,MAAM,4BAA4B,GAAG,0BAA0B,CAAC;AACvE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,4BAA4B,GAAG,gCAAgC,CAAC;AAC7E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,0BAA0B,CAAC;AACvE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAEnE,0DAA0D;AAC1D,MAAM,CAAC,MAAM,OAAO,GAAG,mBAAmB,CAAC;AAE3C,
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-channel-imessage",
|
|
3
|
-
"version": "0.37.
|
|
3
|
+
"version": "0.37.2",
|
|
4
4
|
"description": "iMessage channel for moxxy via a localhost BlueBubbles server (macOS only). Sends text with the apple-script method and receives via the BlueBubbles socket.io feed, driving the Session from allow-listed handles (your own self-chat by default). Immutable chunked replies; autonomous allow-list permission model.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -74,16 +74,16 @@
|
|
|
74
74
|
"dependencies": {
|
|
75
75
|
"@clack/prompts": "^1.4.0",
|
|
76
76
|
"socket.io-client": "^4.8.1",
|
|
77
|
-
"zod": "^3.
|
|
78
|
-
"@moxxy/
|
|
79
|
-
"@moxxy/core": "0.37.
|
|
80
|
-
"@moxxy/
|
|
81
|
-
"@moxxy/sdk": "0.37.
|
|
77
|
+
"zod": "^3.25.76",
|
|
78
|
+
"@moxxy/channel-kit": "0.37.2",
|
|
79
|
+
"@moxxy/core": "0.37.2",
|
|
80
|
+
"@moxxy/plugin-vault": "0.37.2",
|
|
81
|
+
"@moxxy/sdk": "0.37.2"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
84
|
"@types/node": "^22.10.0",
|
|
85
85
|
"typescript": "^5.7.3",
|
|
86
|
-
"vitest": "^2.
|
|
86
|
+
"vitest": "^3.2.6",
|
|
87
87
|
"@moxxy/tsconfig": "0.0.0",
|
|
88
88
|
"@moxxy/vitest-preset": "0.0.0"
|
|
89
89
|
},
|
|
@@ -71,7 +71,7 @@ export class BlueBubblesClient implements BlueBubblesClientLike {
|
|
|
71
71
|
constructor(opts: BlueBubblesClientOptions) {
|
|
72
72
|
this.opts = opts;
|
|
73
73
|
// Normalize the base URL once (strip a trailing slash) so path joins are clean.
|
|
74
|
-
this.base = opts.serverUrl.trim()
|
|
74
|
+
this.base = trimTrailingSlashes(opts.serverUrl.trim());
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
async ping(): Promise<void> {
|
|
@@ -159,6 +159,12 @@ export class BlueBubblesClient implements BlueBubblesClientLike {
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
+
function trimTrailingSlashes(value: string): string {
|
|
163
|
+
let end = value.length;
|
|
164
|
+
while (end > 0 && value[end - 1] === '/') end -= 1;
|
|
165
|
+
return value.slice(0, end);
|
|
166
|
+
}
|
|
167
|
+
|
|
162
168
|
/** Read the sent message's permanent guid from the send response, if present. */
|
|
163
169
|
async function extractGuid(res: Response): Promise<string | null> {
|
|
164
170
|
const body: unknown = await res.json().catch(() => null);
|
package/src/keys.ts
CHANGED
|
@@ -42,14 +42,25 @@ export const IMESSAGE_OWNER_HANDLES_KEY = 'imessage_owner_handles';
|
|
|
42
42
|
/** E.164 shape: `+` then 7–15 digits, no leading zero. */
|
|
43
43
|
export const E164_RE = /^\+[1-9]\d{6,14}$/;
|
|
44
44
|
|
|
45
|
-
/** Pragmatic email
|
|
46
|
-
export const EMAIL_RE =
|
|
45
|
+
/** Pragmatic email matcher (Apple-ID handles), implemented as a linear scan. */
|
|
46
|
+
export const EMAIL_RE = Object.freeze({ test: isEmail });
|
|
47
47
|
|
|
48
48
|
/** Whether a normalized string is a plausible iMessage handle. */
|
|
49
49
|
export function isHandle(value: string): boolean {
|
|
50
50
|
return E164_RE.test(value) || EMAIL_RE.test(value);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
function isEmail(value: string): boolean {
|
|
54
|
+
const at = value.indexOf('@');
|
|
55
|
+
if (at <= 0 || at !== value.lastIndexOf('@')) return false;
|
|
56
|
+
const dot = value.indexOf('.', at + 1);
|
|
57
|
+
if (dot <= at + 1 || dot === value.length - 1) return false;
|
|
58
|
+
for (const char of value) {
|
|
59
|
+
if (/\s/u.test(char)) return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
53
64
|
/**
|
|
54
65
|
* Canonical handle for allow-list comparisons: trimmed, and lowercased when it
|
|
55
66
|
* is an email (Apple-ID handles are case-insensitive). Phone numbers are left
|