Loading CHANGES.md +211 −0 Original line number Diff line number Diff line Loading @@ -193,6 +193,31 @@ To be released. CommonJS-based Node.js applications. [[#429], [#431]] Version 1.8.11 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.8.10 -------------- Released on Steptember 17, 2025. ### @fedify/fedify - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.8.9 ------------- Loading Loading @@ -547,6 +572,29 @@ the versioning. [iTerm]: https://iterm2.com/ Version 1.7.13 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.7.12 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.7.11 -------------- Loading Loading @@ -709,6 +757,29 @@ Released on June 25, 2025. [#252]: https://github.com/fedify-dev/fedify/pull/252 Version 1.6.12 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.6.11 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.6.10 -------------- Loading Loading @@ -874,6 +945,29 @@ the versioning. [#242]: https://github.com/fedify-dev/fedify/pull/242 Version 1.5.9 ------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.5.8 ------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.5.7 ------------- Loading Loading @@ -1085,6 +1179,29 @@ Released on March 28, 2025. [multibase]: https://github.com/multiformats/js-multibase Version 1.4.17 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.4.16 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.4.15 -------------- Loading Loading @@ -1371,6 +1488,29 @@ Released on February 5, 2025. [#195]: https://github.com/fedify-dev/fedify/issues/195 Version 1.3.24 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.3.23 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.3.22 -------------- Loading Loading @@ -1775,6 +1915,29 @@ Released on November 30, 2024. [#193]: https://github.com/fedify-dev/fedify/issues/193 Version 1.2.27 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.2.26 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.2.25 -------------- Loading Loading @@ -2212,6 +2375,29 @@ Released on October 31, 2024. [#118]: https://github.com/fedify-dev/fedify/issues/118 Version 1.1.27 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.1.26 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.1.25 -------------- Loading Loading @@ -2690,6 +2876,31 @@ Released on October 20, 2024. [#150]: https://github.com/fedify-dev/fedify/issues/150 Version 1.0.30 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.0.29 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] [#436]: https://github.com/fedify-dev/fedify/issues/436 Version 1.0.28 -------------- Loading packages/fedify/src/codegen/__snapshots__/class.test.ts.snap +140 −10 Original line number Diff line number Diff line Loading @@ -8395,7 +8395,20 @@ get urls(): ((URL | Link))[] { const decoded = typeof v === \\"object\\" && \\"@id\\" in v && typeof v[\\"@id\\"] === \\"string\\" && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? new URL(v[\\"@id\\"]) : typeof v === \\"object\\" && \\"@type\\" in v && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"]) : typeof v === \\"object\\" && \\"@type\\" in v && Array.isArray(v[\\"@type\\"])&& [\\"https://www.w3.org/ns/activitystreams#Link\\",\\"https://www.w3.org/ns/activitystreams#Hashtag\\",\\"https://www.w3.org/ns/activitystreams#Mention\\"].some( t => v[\\"@type\\"].includes(t)) ? await Link.fromJsonLd( v, options) : undefined Loading Loading @@ -14238,7 +14251,20 @@ get endpoints(): (URL)[] { : _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint__array ) { if (v == null) continue; _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint.push(new URL(v[\\"@id\\"])) _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint = _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint; Loading Loading @@ -32950,7 +32976,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl__array ) { if (v == null) continue; _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl.push(new URL(v[\\"@id\\"])) _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl = _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl; const _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint: (URL)[] = []; Loading @@ -32965,7 +33004,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint__array ) { if (v == null) continue; _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint.push(new URL(v[\\"@id\\"])) _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint = _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint; const _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint: (URL)[] = []; Loading @@ -32980,7 +33032,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint__array ) { if (v == null) continue; _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint.push(new URL(v[\\"@id\\"])) _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint = _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint; const _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey: (URL)[] = []; Loading @@ -32995,7 +33060,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey__array ) { if (v == null) continue; _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey.push(new URL(v[\\"@id\\"])) _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey = _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey; const _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey: (URL)[] = []; Loading @@ -33010,7 +33088,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey__array ) { if (v == null) continue; _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey.push(new URL(v[\\"@id\\"])) _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey = _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey; const _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox: (URL)[] = []; Loading @@ -33025,7 +33116,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox__array ) { if (v == null) continue; _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox.push(new URL(v[\\"@id\\"])) _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox = _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox; Loading Loading @@ -40970,7 +41074,20 @@ get names(): ((string | LanguageString))[] { : _pVjLsybKQdmkjuU7MHjiVmNnuj7_href__array ) { if (v == null) continue; _pVjLsybKQdmkjuU7MHjiVmNnuj7_href.push(new URL(v[\\"@id\\"])) _pVjLsybKQdmkjuU7MHjiVmNnuj7_href.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_pVjLsybKQdmkjuU7MHjiVmNnuj7_href = _pVjLsybKQdmkjuU7MHjiVmNnuj7_href; const _2a1c5GkfkQsnyyLybF8UXBQfFuHZ_rel: (string)[] = []; Loading Loading @@ -58716,7 +58833,20 @@ proofs?: (DataIntegrityProof | URL)[];accuracy?: number | null;altitude?: number typeof v === \\"object\\" && \\"@value\\" in v && (v[\\"@value\\"] == \\"cm\\" || v[\\"@value\\"] == \\"feet\\" || v[\\"@value\\"] == \\"inches\\" || v[\\"@value\\"] == \\"km\\" || v[\\"@value\\"] == \\"m\\" || v[\\"@value\\"] == \\"miles\\") ? v[\\"@value\\"] : typeof v === \\"object\\" && \\"@id\\" in v && typeof v[\\"@id\\"] === \\"string\\" && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? new URL(v[\\"@id\\"]) : undefined && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"]) : undefined ; if (typeof decoded === \\"undefined\\") continue; _oKrwxU4V8wiKhMW1QEYQibcJh8c_units.push(decoded); packages/fedify/src/codegen/type.ts +14 −1 Original line number Diff line number Diff line Loading @@ -144,7 +144,20 @@ const scalarTypes: Record<string, ScalarType> = { && ${v}["@id"] !== "" && ${v}["@id"] !== "/"`; }, decoder(v) { return `new URL(${v}["@id"])`; return `${v}["@id"].startsWith("at://") ? new URL("at://" + encodeURIComponent( ${v}["@id"].includes("/", 5) ? ${v}["@id"].slice(5, ${v}["@id"].indexOf("/", 5)) : ${v}["@id"].slice(5) ) + ( ${v}["@id"].includes("/", 5) ? ${v}["@id"].slice(${v}["@id"].indexOf("/", 5)) : "" ) ) : new URL(${v}["@id"])`; }, }, "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString": { Loading packages/fedify/src/federation/kv.test.ts +1 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ test("MemoryKvStore", async (t) => { await store.set(["foo", "baz"], "baz", { ttl: Temporal.Duration.from({ seconds: 0 }), }); await new Promise((resolve) => setTimeout(resolve, 10)); assertEquals(await store.get(["foo", "baz"]), undefined); }); Loading packages/fedify/src/runtime/key.ts +0 −1 Original line number Diff line number Diff line Loading @@ -114,7 +114,6 @@ export async function importMultibaseKey(key: string): Promise<CryptoKey> { const spki = exported instanceof Uint8Array ? exported : new Uint8Array(exported); return await crypto.subtle.importKey( "spki", new Uint8Array(spki), Loading Loading
CHANGES.md +211 −0 Original line number Diff line number Diff line Loading @@ -193,6 +193,31 @@ To be released. CommonJS-based Node.js applications. [[#429], [#431]] Version 1.8.11 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.8.10 -------------- Released on Steptember 17, 2025. ### @fedify/fedify - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.8.9 ------------- Loading Loading @@ -547,6 +572,29 @@ the versioning. [iTerm]: https://iterm2.com/ Version 1.7.13 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.7.12 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.7.11 -------------- Loading Loading @@ -709,6 +757,29 @@ Released on June 25, 2025. [#252]: https://github.com/fedify-dev/fedify/pull/252 Version 1.6.12 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.6.11 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.6.10 -------------- Loading Loading @@ -874,6 +945,29 @@ the versioning. [#242]: https://github.com/fedify-dev/fedify/pull/242 Version 1.5.9 ------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.5.8 ------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.5.7 ------------- Loading Loading @@ -1085,6 +1179,29 @@ Released on March 28, 2025. [multibase]: https://github.com/multiformats/js-multibase Version 1.4.17 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.4.16 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.4.15 -------------- Loading Loading @@ -1371,6 +1488,29 @@ Released on February 5, 2025. [#195]: https://github.com/fedify-dev/fedify/issues/195 Version 1.3.24 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.3.23 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.3.22 -------------- Loading Loading @@ -1775,6 +1915,29 @@ Released on November 30, 2024. [#193]: https://github.com/fedify-dev/fedify/issues/193 Version 1.2.27 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.2.26 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.2.25 -------------- Loading Loading @@ -2212,6 +2375,29 @@ Released on October 31, 2024. [#118]: https://github.com/fedify-dev/fedify/issues/118 Version 1.1.27 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.1.26 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] Version 1.1.25 -------------- Loading Loading @@ -2690,6 +2876,31 @@ Released on October 20, 2024. [#150]: https://github.com/fedify-dev/fedify/issues/150 Version 1.0.30 -------------- Released on September 17, 2025. - Improved the AT Protocol URI workaround to handle all DID methods and edge cases. The fix now properly percent-encodes any authority component in `at://` URIs, supporting `did:web`, `did:key`, and other DID methods beyond just `did:plc`. Also handles URIs without path components correctly. [[#436]] Version 1.0.29 -------------- Released on September 17, 2025. - Added a temporary workaround for invalid AT Protocol URIs from BridgyFed. URIs like `at://did:plc:...` that violate RFC 3986 URI syntax are now automatically URL-encoded to `at://did%3Aplc%3A...` to prevent parsing failures when processing bridged Bluesky content. [[#436]] [#436]: https://github.com/fedify-dev/fedify/issues/436 Version 1.0.28 -------------- Loading
packages/fedify/src/codegen/__snapshots__/class.test.ts.snap +140 −10 Original line number Diff line number Diff line Loading @@ -8395,7 +8395,20 @@ get urls(): ((URL | Link))[] { const decoded = typeof v === \\"object\\" && \\"@id\\" in v && typeof v[\\"@id\\"] === \\"string\\" && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? new URL(v[\\"@id\\"]) : typeof v === \\"object\\" && \\"@type\\" in v && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"]) : typeof v === \\"object\\" && \\"@type\\" in v && Array.isArray(v[\\"@type\\"])&& [\\"https://www.w3.org/ns/activitystreams#Link\\",\\"https://www.w3.org/ns/activitystreams#Hashtag\\",\\"https://www.w3.org/ns/activitystreams#Mention\\"].some( t => v[\\"@type\\"].includes(t)) ? await Link.fromJsonLd( v, options) : undefined Loading Loading @@ -14238,7 +14251,20 @@ get endpoints(): (URL)[] { : _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint__array ) { if (v == null) continue; _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint.push(new URL(v[\\"@id\\"])) _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint = _2KM4fetG6FTJ1cphj76rzJ8Dyv7p_serviceEndpoint; Loading Loading @@ -32950,7 +32976,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl__array ) { if (v == null) continue; _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl.push(new URL(v[\\"@id\\"])) _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl = _2JCYDbSxEHCCLdBYed33cCETfGyR_proxyUrl; const _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint: (URL)[] = []; Loading @@ -32965,7 +33004,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint__array ) { if (v == null) continue; _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint.push(new URL(v[\\"@id\\"])) _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint = _25S6UmgzDead8hxL5sQFezZTAusd_oauthAuthorizationEndpoint; const _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint: (URL)[] = []; Loading @@ -32980,7 +33032,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint__array ) { if (v == null) continue; _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint.push(new URL(v[\\"@id\\"])) _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint = _iAMxqrSba7yBCRB1FZ5kEVdKEZ3_oauthTokenEndpoint; const _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey: (URL)[] = []; Loading @@ -32995,7 +33060,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey__array ) { if (v == null) continue; _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey.push(new URL(v[\\"@id\\"])) _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey = _8Bx9qN8oU7Bpt2xi6khaxWp1gMr_provideClientKey; const _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey: (URL)[] = []; Loading @@ -33010,7 +33088,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey__array ) { if (v == null) continue; _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey.push(new URL(v[\\"@id\\"])) _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey = _3dU7PMVQZJpsCpo2F4RQXxBXdPmS_signClientKey; const _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox: (URL)[] = []; Loading @@ -33025,7 +33116,20 @@ proxyUrl?: URL | null;oauthAuthorizationEndpoint?: URL | null;oauthTokenEndpoint : _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox__array ) { if (v == null) continue; _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox.push(new URL(v[\\"@id\\"])) _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox = _3JprUSDLVqqX4dwHRi37qGZZCRCc_sharedInbox; Loading Loading @@ -40970,7 +41074,20 @@ get names(): ((string | LanguageString))[] { : _pVjLsybKQdmkjuU7MHjiVmNnuj7_href__array ) { if (v == null) continue; _pVjLsybKQdmkjuU7MHjiVmNnuj7_href.push(new URL(v[\\"@id\\"])) _pVjLsybKQdmkjuU7MHjiVmNnuj7_href.push(v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"])) } instance.#_pVjLsybKQdmkjuU7MHjiVmNnuj7_href = _pVjLsybKQdmkjuU7MHjiVmNnuj7_href; const _2a1c5GkfkQsnyyLybF8UXBQfFuHZ_rel: (string)[] = []; Loading Loading @@ -58716,7 +58833,20 @@ proofs?: (DataIntegrityProof | URL)[];accuracy?: number | null;altitude?: number typeof v === \\"object\\" && \\"@value\\" in v && (v[\\"@value\\"] == \\"cm\\" || v[\\"@value\\"] == \\"feet\\" || v[\\"@value\\"] == \\"inches\\" || v[\\"@value\\"] == \\"km\\" || v[\\"@value\\"] == \\"m\\" || v[\\"@value\\"] == \\"miles\\") ? v[\\"@value\\"] : typeof v === \\"object\\" && \\"@id\\" in v && typeof v[\\"@id\\"] === \\"string\\" && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? new URL(v[\\"@id\\"]) : undefined && v[\\"@id\\"] !== \\"\\" && v[\\"@id\\"] !== \\"/\\" ? v[\\"@id\\"].startsWith(\\"at://\\") ? new URL(\\"at://\\" + encodeURIComponent( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(5, v[\\"@id\\"].indexOf(\\"/\\", 5)) : v[\\"@id\\"].slice(5) ) + ( v[\\"@id\\"].includes(\\"/\\", 5) ? v[\\"@id\\"].slice(v[\\"@id\\"].indexOf(\\"/\\", 5)) : \\"\\" ) ) : new URL(v[\\"@id\\"]) : undefined ; if (typeof decoded === \\"undefined\\") continue; _oKrwxU4V8wiKhMW1QEYQibcJh8c_units.push(decoded);
packages/fedify/src/codegen/type.ts +14 −1 Original line number Diff line number Diff line Loading @@ -144,7 +144,20 @@ const scalarTypes: Record<string, ScalarType> = { && ${v}["@id"] !== "" && ${v}["@id"] !== "/"`; }, decoder(v) { return `new URL(${v}["@id"])`; return `${v}["@id"].startsWith("at://") ? new URL("at://" + encodeURIComponent( ${v}["@id"].includes("/", 5) ? ${v}["@id"].slice(5, ${v}["@id"].indexOf("/", 5)) : ${v}["@id"].slice(5) ) + ( ${v}["@id"].includes("/", 5) ? ${v}["@id"].slice(${v}["@id"].indexOf("/", 5)) : "" ) ) : new URL(${v}["@id"])`; }, }, "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString": { Loading
packages/fedify/src/federation/kv.test.ts +1 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ test("MemoryKvStore", async (t) => { await store.set(["foo", "baz"], "baz", { ttl: Temporal.Duration.from({ seconds: 0 }), }); await new Promise((resolve) => setTimeout(resolve, 10)); assertEquals(await store.get(["foo", "baz"]), undefined); }); Loading
packages/fedify/src/runtime/key.ts +0 −1 Original line number Diff line number Diff line Loading @@ -114,7 +114,6 @@ export async function importMultibaseKey(key: string): Promise<CryptoKey> { const spki = exported instanceof Uint8Array ? exported : new Uint8Array(exported); return await crypto.subtle.importKey( "spki", new Uint8Array(spki), Loading