diff --git a/.config/example.yml b/.config/example.yml index 70c096baa..b9500ee3a 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -113,3 +113,6 @@ autoAdmin: true # Clustering #clusterLimit: 1 + +# IP address family used for outgoing request (ipv4, ipv6 or dual) +#outgoingAddressFamily: ipv4 diff --git a/src/config/types.ts b/src/config/types.ts index 5f30d410c..9fcc4f6cc 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -42,6 +42,8 @@ export type Source = { accesslog?: string; clusterLimit?: number; + + outgoingAddressFamily?: 'ipv4' | 'ipv6' | 'dual'; }; /** diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index df6058d6b..d2cd1f7ca 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -96,11 +96,18 @@ export default async (user: ILocalUser, url: string, object: any) => { * Resolve host (with cached, asynchrony) */ async function resolveAddr(domain: string) { + const af = config.outgoingAddressFamily || 'ipv4'; + const useV4 = af == 'ipv4' || af == 'dual'; + const useV6 = af == 'ipv6' || af == 'dual'; + + const promises = []; + + if (!useV4 && !useV6) throw 'No usable address family available'; + if (useV4) promises.push(resolveAddrInner(domain, { family: 4 })); + if (useV6) promises.push(resolveAddrInner(domain, { family: 6 })); + // v4/v6で先に取得できた方を採用する - return await promiseAny([ - resolveAddrInner(domain, { family: 4 }), - resolveAddrInner(domain, { family: 6 }) - ]); + return await promiseAny(promises); } function resolveAddrInner(domain: string, options: IRunOptions = {}): Promise {