@fedify/fedify 0.9.0-dev.172 → 0.9.0-dev.173

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of @fedify/fedify might be problematic. Click here for more details.

package/CHANGES.md CHANGED
@@ -12,6 +12,17 @@ To be released.
12
12
 
13
13
  - Added `Emoji` class to Activity Vocabulary API. [[#48]]
14
14
 
15
+ - Added an actor handle normalization function.
16
+
17
+ - Added `normalizeActorHandle()` function.
18
+ - Added `NormalizeActorHandleOptions` interface.
19
+ - The `getActorHandle()` function now guarantees that the returned
20
+ actor handle is normalized.
21
+ - Added the second optional parameter to `getActorHandle()` function.
22
+ - The return type of `getActorHandle()` function became
23
+ ``Promise<`@${string}@${string}` | `${string}@${string}`>``
24
+ (was ``Promise<`@${string}@${string}`>``).
25
+
15
26
  - Added more log messages using the [LogTape] library. Currently the below
16
27
  logger categories are used:
17
28
 
@@ -1,3 +1,4 @@
1
+ import { toASCII, toUnicode } from "node:punycode";
1
2
  import { lookupWebFinger } from "../webfinger/lookup.js";
2
3
  import { Application, Group, Organization, Person, Service } from "./vocab.js";
3
4
  /**
@@ -66,13 +67,15 @@ export function getActorClassByTypeName(typeName) {
66
67
  * ```
67
68
  *
68
69
  * @param actor The actor or actor URI to get the handle from.
70
+ * @param options The options for normalizing the actor handle.
69
71
  * @returns The actor handle. It starts with `@` and is followed by the
70
- * username and domain, separated by `@`.
72
+ * username and domain, separated by `@` by default (it can be
73
+ * customized with the options).
71
74
  * @throws {TypeError} If the actor does not have enough information to get the
72
75
  * handle.
73
76
  * @since 0.4.0
74
77
  */
75
- export async function getActorHandle(actor) {
78
+ export async function getActorHandle(actor, options = {}) {
76
79
  const actorId = actor instanceof URL ? actor : actor.id;
77
80
  if (actorId != null) {
78
81
  const result = await lookupWebFinger(actorId);
@@ -82,14 +85,37 @@ export async function getActorHandle(actor) {
82
85
  aliases.unshift(result.subject);
83
86
  for (const alias of aliases) {
84
87
  const match = alias.match(/^acct:([^@]+)@([^@]+)$/);
85
- if (match != null)
86
- return `@${match[1]}@${match[2]}`;
88
+ if (match != null) {
89
+ return normalizeActorHandle(`@${match[1]}@${match[2]}`, options);
90
+ }
87
91
  }
88
92
  }
89
93
  }
90
94
  if (!(actor instanceof URL) && actor.preferredUsername != null &&
91
95
  actor.id != null) {
92
- return `@${actor.preferredUsername}@${actor.id.host}`;
96
+ return normalizeActorHandle(`@${actor.preferredUsername}@${actor.id.host}`, options);
93
97
  }
94
98
  throw new TypeError("Actor does not have enough information to get the handle.");
95
99
  }
100
+ /**
101
+ * Normalizes the given actor handle.
102
+ * @param handle The full handle of the actor to normalize.
103
+ * @param options The options for normalizing the actor handle.
104
+ * @returns The normalized actor handle.
105
+ * @throws {TypeError} If the actor handle is invalid.
106
+ */
107
+ export function normalizeActorHandle(handle, options = {}) {
108
+ handle = handle.replace(/^@/, "");
109
+ const atPos = handle.indexOf("@");
110
+ if (atPos < 1)
111
+ throw new TypeError("Invalid actor handle.");
112
+ let domain = handle.substring(atPos + 1);
113
+ if (domain.length < 1 || domain.includes("@")) {
114
+ throw new TypeError("Invalid actor handle.");
115
+ }
116
+ domain = domain.toLowerCase();
117
+ domain = options.punycode ? toASCII(domain) : toUnicode(domain);
118
+ domain = domain.toLowerCase();
119
+ const user = handle.substring(0, atPos);
120
+ return options.trimLeadingAt ? `${user}@${domain}` : `@${user}@${domain}`;
121
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "0.9.0-dev.172+738f84bf",
3
+ "version": "0.9.0-dev.173+42b64481",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -43,13 +43,39 @@ export declare function getActorClassByTypeName(typeName: ActorTypeName): typeof
43
43
  * ```
44
44
  *
45
45
  * @param actor The actor or actor URI to get the handle from.
46
+ * @param options The options for normalizing the actor handle.
46
47
  * @returns The actor handle. It starts with `@` and is followed by the
47
- * username and domain, separated by `@`.
48
+ * username and domain, separated by `@` by default (it can be
49
+ * customized with the options).
48
50
  * @throws {TypeError} If the actor does not have enough information to get the
49
51
  * handle.
50
52
  * @since 0.4.0
51
53
  */
52
- export declare function getActorHandle(actor: Actor | URL): Promise<`@${string}@${string}`>;
54
+ export declare function getActorHandle(actor: Actor | URL, options?: NormalizeActorHandleOptions): Promise<`@${string}@${string}` | `${string}@${string}`>;
55
+ /**
56
+ * Options for {@link normalizeActorHandle}.
57
+ * @since 0.9.0
58
+ */
59
+ export interface NormalizeActorHandleOptions {
60
+ /**
61
+ * Whether to trim the leading `@` from the actor handle. Turned off by
62
+ * default.
63
+ */
64
+ trimLeadingAt?: boolean;
65
+ /**
66
+ * Whether to convert the domain part of the actor handle to punycode, if it
67
+ * is an internationalized domain name. Turned off by default.
68
+ */
69
+ punycode?: boolean;
70
+ }
71
+ /**
72
+ * Normalizes the given actor handle.
73
+ * @param handle The full handle of the actor to normalize.
74
+ * @param options The options for normalizing the actor handle.
75
+ * @returns The normalized actor handle.
76
+ * @throws {TypeError} If the actor handle is invalid.
77
+ */
78
+ export declare function normalizeActorHandle(handle: string, options?: NormalizeActorHandleOptions): `@${string}@${string}` | `${string}@${string}`;
53
79
  /**
54
80
  * The object that can be a recipient of an activity.
55
81
  *
@@ -1 +1 @@
1
- {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/vocab/actor.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,KAAK,CAQxD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,OAAO,GACP,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GACX,aAAa,CAOf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,GAErB,OAAO,WAAW,GAClB,OAAO,KAAK,GACZ,OAAO,YAAY,GACnB,OAAO,MAAM,GACb,OAAO,OAAO,CAcjB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,GAAG,GAAG,GACjB,OAAO,CAAC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC,CAsBjC;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB;;WAEG;QACH,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;KACzB,GAAG,IAAI,CAAC;CACV"}
1
+ {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/vocab/actor.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,KAAK,CAQxD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,OAAO,GACP,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GACX,aAAa,CAOf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,GAErB,OAAO,WAAW,GAClB,OAAO,KAAK,GACZ,OAAO,YAAY,GACnB,OAAO,MAAM,GACb,OAAO,OAAO,CAcjB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,GAAG,GAAG,EAClB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,IAAI,MAAM,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC,CA2BzD;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,2BAAgC,GACxC,IAAI,MAAM,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAahD;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB;;WAEG;QACH,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;KACzB,GAAG,IAAI,CAAC;CACV"}