Skip to content

Commit 68934ac

Browse files
committed
fix: add baseUrl when relative urls are given
1 parent 09a99df commit 68934ac

5 files changed

Lines changed: 31 additions & 10 deletions

File tree

packages/fedify/src/codegen/class.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ async function* generateClass(
5151
readonly #documentLoader?: DocumentLoader;
5252
readonly #contextLoader?: DocumentLoader;
5353
readonly #tracerProvider?: TracerProvider;
54+
protected readonly _baseUrl?: URL;
5455
readonly #warning?: {
5556
category: string[];
5657
message: string;
@@ -95,6 +96,13 @@ async function* generateClass(
9596
static ${emitOverride(typeUri, types)} get typeId(): URL {
9697
return new URL(${JSON.stringify(typeUri)});
9798
}
99+
100+
/**
101+
* The base URL used for resolving relative URLs in this object.
102+
*/
103+
${emitOverride(typeUri, types)} get baseUrl(): URL | undefined {
104+
return this._baseUrl;
105+
}
98106
`;
99107
for await (const code of generateFields(typeUri, types)) yield code;
100108
for await (const code of generateConstructor(typeUri, types)) yield code;

packages/fedify/src/codegen/codec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ export async function* generateDecoder(
287287
documentLoader?: DocumentLoader,
288288
contextLoader?: DocumentLoader,
289289
tracerProvider?: TracerProvider,
290+
baseUrl?: URL,
290291
} = {},
291292
): Promise<${type.name}> {
292293
const tracerProvider = options.tracerProvider ?? trace.getTracerProvider();
@@ -324,6 +325,7 @@ export async function* generateDecoder(
324325
documentLoader?: DocumentLoader,
325326
contextLoader?: DocumentLoader,
326327
tracerProvider?: TracerProvider,
328+
baseUrl?: URL,
327329
} = {},
328330
): Promise<${type.name}> {
329331
if (typeof json === "undefined") {

packages/fedify/src/codegen/constructor.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ export async function* generateConstructor(
8989
documentLoader?: DocumentLoader,
9090
contextLoader?: DocumentLoader,
9191
tracerProvider?: TracerProvider,
92+
baseUrl?: URL,
9293
} = {},
9394
) {
9495
`;
@@ -97,6 +98,7 @@ export async function* generateConstructor(
9798
this.#documentLoader = options.documentLoader;
9899
this.#contextLoader = options.contextLoader;
99100
this.#tracerProvider = options.tracerProvider;
101+
this._baseUrl = options.baseUrl;
100102
if ("$warning" in options) {
101103
this.#warning = options.$warning as unknown as {
102104
category: string[];

packages/fedify/src/codegen/property.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ async function* generateProperty(
6464
contextLoader?: DocumentLoader,
6565
suppressError?: boolean,
6666
tracerProvider?: TracerProvider,
67-
} = {}
67+
baseUrl?: URL
68+
} = {},
6869
): Promise<${getTypeNames(property.range, types)} | null> {
6970
const documentLoader =
7071
options.documentLoader ?? this._documentLoader ?? getDocumentLoader();
@@ -76,6 +77,7 @@ async function* generateProperty(
7677
${JSON.stringify(metadata.name)},
7778
${JSON.stringify(metadata.version)},
7879
);
80+
const baseUrl = options.baseUrl;
7981
return await tracer.startActiveSpan("activitypub.lookup_object", async (span) => {
8082
let fetchResult: RemoteDocument;
8183
try {
@@ -99,7 +101,7 @@ async function* generateProperty(
99101
try {
100102
const obj = await this.#${property.singularName}_fromJsonLd(
101103
document,
102-
{ documentLoader, contextLoader, tracerProvider }
104+
{ documentLoader, contextLoader, tracerProvider, baseUrl }
103105
);
104106
span.setAttribute("activitypub.object.id", (obj.id ?? url).href);
105107
span.setAttribute(
@@ -133,6 +135,7 @@ async function* generateProperty(
133135
documentLoader?: DocumentLoader,
134136
contextLoader?: DocumentLoader,
135137
tracerProvider?: TracerProvider,
138+
baseUrl?: URL
136139
}
137140
): Promise<${getTypeNames(property.range, types)}> {
138141
const documentLoader =
@@ -141,6 +144,7 @@ async function* generateProperty(
141144
options.contextLoader ?? this._contextLoader ?? getDocumentLoader();
142145
const tracerProvider = options.tracerProvider ??
143146
this._tracerProvider ?? trace.getTracerProvider();
147+
const baseUrl = options.baseUrl;
144148
`;
145149
for (const range of property.range) {
146150
if (!(range in types)) continue;
@@ -149,7 +153,7 @@ async function* generateProperty(
149153
try {
150154
return await ${rangeType.name}.fromJsonLd(
151155
jsonLd,
152-
{ documentLoader, contextLoader, tracerProvider },
156+
{ documentLoader, contextLoader, tracerProvider, baseUrl },
153157
);
154158
} catch (e) {
155159
if (!(e instanceof TypeError)) throw e;
@@ -190,6 +194,7 @@ async function* generateProperty(
190194
contextLoader?: DocumentLoader,
191195
suppressError?: boolean,
192196
tracerProvider?: TracerProvider,
197+
baseUrl?: URL
193198
} = {}
194199
): Promise<${getTypeNames(property.range, types)} | null> {
195200
if (this._warning != null) {
@@ -221,7 +226,7 @@ async function* generateProperty(
221226
${JSON.stringify(property.compactName)}];
222227
const obj = Array.isArray(prop) ? prop[0] : prop;
223228
if (obj != null && typeof obj === "object" && "@context" in obj) {
224-
return await this.#${property.singularName}_fromJsonLd(obj, options);
229+
return await this.#${property.singularName}_fromJsonLd(obj, {...options, baseUrl: options.baseUrl});
225230
}
226231
}
227232
`;
@@ -258,6 +263,7 @@ async function* generateProperty(
258263
contextLoader?: DocumentLoader,
259264
suppressError?: boolean,
260265
tracerProvider?: TracerProvider,
266+
baseUrl?: URL
261267
} = {}
262268
): AsyncIterable<${getTypeNames(property.range, types)}> {
263269
if (this._warning != null) {
@@ -272,7 +278,7 @@ async function* generateProperty(
272278
if (v instanceof URL) {
273279
const fetched =
274280
await this.#fetch${pascalCase(property.singularName)}(
275-
v, options);
281+
v, {...options, baseUrl: options.baseUrl});
276282
if (fetched == null) continue;
277283
vs[i] = fetched;
278284
this._cachedJsonLd = undefined;
@@ -292,7 +298,8 @@ async function* generateProperty(
292298
${JSON.stringify(property.compactName)}];
293299
const obj = Array.isArray(prop) ? prop[i] : prop;
294300
if (obj != null && typeof obj === "object" && "@context" in obj) {
295-
yield await this.#${property.singularName}_fromJsonLd(obj, options);
301+
yield await this.#${property.singularName}_fromJsonLd(obj, {...options, baseUrl: options.baseUrl
302+
});
296303
continue;
297304
}
298305
}

packages/fedify/src/codegen/type.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ const scalarTypes: Record<string, ScalarType> = {
141141
dataCheck(v) {
142142
return `typeof ${v} === "object" && "@id" in ${v}
143143
&& typeof ${v}["@id"] === "string"
144-
&& ${v}["@id"] !== "" && ${v}["@id"] !== "/"`;
144+
&& ${v}["@id"] !== ""`;
145145
},
146146
decoder(v) {
147147
return `${v}["@id"].startsWith("at://")
@@ -157,7 +157,9 @@ const scalarTypes: Record<string, ScalarType> = {
157157
: ""
158158
)
159159
)
160-
: new URL(${v}["@id"])`;
160+
: ${v}["@id"].startsWith("/") && options.baseUrl
161+
? new URL(options.baseUrl + ${v}["@id"])
162+
: new URL(${v}["@id"])`;
161163
},
162164
},
163165
"http://www.w3.org/1999/02/22-rdf-syntax-ns#langString": {
@@ -307,10 +309,10 @@ const scalarTypes: Record<string, ScalarType> = {
307309
dataCheck(v) {
308310
return `typeof ${v} === "object" && "@value" in ${v}
309311
&& typeof ${v}["@value"] === "string"
310-
&& ${v}["@value"] !== "" && ${v}["@value"] !== "/"`;
312+
&& ${v}["@value"] !== ""`;
311313
},
312314
decoder(v) {
313-
return `new URL(${v}["@value"])`;
315+
return `${v}["@value"].startsWith("/") && options.baseUrl ? new URL(options.baseUrl + ${v}["@value"]) : new URL(${v}["@value"])`;
314316
},
315317
},
316318
"fedify:publicKey": {

0 commit comments

Comments
 (0)