function evaluate(): AtomicPromise<Either<Error, HTMLScriptElement>> { if (script.matches('[type="module"][src]')) { return AtomicPromise.resolve(import(script.src)) .catch((reason: Error) => reason.message.startsWith('Failed to load ') && script.matches('[src][async]') ? retry(script).catch(() => AtomicPromise.reject(reason)) : AtomicPromise.reject(reason)) .then( () => ( void script.dispatchEvent(new Event('load')), Right(script)), reason => ( void script.dispatchEvent(new Event('error')), Left(new FatalError(reason instanceof Error ? reason.message : reason + '')))); } else { try { if (new URL(standardize(window.location.href)).path !== new URL(standardize(window.location.href)).path) throw new FatalError('Expired.'); if (skip.has(new URL(standardize(window.location.href)).reference)) throw new FatalError('Expired.'); void (0, eval)(code); script.hasAttribute('src') && void script.dispatchEvent(new Event('load')); return AtomicPromise.resolve(Right(script)); } catch (reason) { script.hasAttribute('src') && void script.dispatchEvent(new Event('error')); return AtomicPromise.resolve(Left(new FatalError(reason instanceof Error ? reason.message : reason + ''))); } } }
m.bind(link => !link.has(dst) && compare(src, dst) ? ( void link.set(dst, concat(link.get(null) || [], [src])), void link.delete(null), Left(link)) : Right(link))
async res => res.ok ? Right<FetchData>([script, await res.text()]) : script.matches('[src][async]') ? retry(script) .then( () => Right<FetchData>([script, '']), () => Left(new Error(`${script.src}: ${res.statusText}`))) : Left(new Error(res.statusText)),
.bind(xhr => { const url = new URL(standardize(xhr.responseURL)); switch (true) { case !xhr.responseURL: return Left(new Error(`Failed to get the response URL.`)); case url.origin !== new URL(window.location.origin).origin: return Left(new Error(`Redirected to another origin.`)); case !/2..|304/.test(`${xhr.status}`): return Left(new Error(`Failed to validate the status of response.`)); case !xhr.responseXML: return method === 'GET' && xhr.status === 304 && caches.has(url.path) ? Right(caches.get(url.path)!.xhr) : Left(new Error(`Failed to get the response body.`)); case !match(xhr.getResponseHeader('Content-Type'), 'text/html'): return Left(new Error(`Failed to validate the content type of response.`)); default: return Right(xhr); } });
err => void resolve(Left(err)),
void xhr.addEventListener("timeout", () => void resolve(Left(new Error(`Failed to request a page by timeout.`))));
void xhr.addEventListener("error", () => void resolve(Left(new Error(`Failed to request a page by error.`))));
evaluate: (script, code) => { assert(cnt === 1 && ++cnt); assert(script.className === 'test'); assert(script.text === code); return Left(AtomicPromise.resolve(Right(script))); },
() => Left(new Error(`Failed to separate the areas.`)),
evaluate: script => { assert(++cnt === NaN); return Left(AtomicPromise.resolve(Right(script))); },