UNPKG

@ledgerhq/domain-service

Version:
152 lines 6.15 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DomainServiceProvider = exports.useDomain = void 0; const react_1 = __importStar(require("react")); const resolvers_1 = require("../resolvers"); const registries_1 = require("../registries"); const registries_2 = require("../registries"); const utils_1 = require("../utils"); const logic_1 = require("./logic"); const errors_1 = require("../errors"); const DomainServiceContext = (0, react_1.createContext)({ cache: {}, loadDomainServiceAPI: () => Promise.resolve(), clearCache: /* istanbul ignore next: don't test default state because it's gonna be overriden */ () => { }, }); const useDomain = (addressOrDomain, registry) => { const [state, setState] = (0, react_1.useState)({ status: "queued" }); const addressOrDomainLC = addressOrDomain.toLowerCase(); const { cache, loadDomainServiceAPI } = (0, react_1.useContext)(DomainServiceContext); const cachedData = addressOrDomain && cache[addressOrDomainLC]; (0, react_1.useEffect)(() => { (async () => { // serve data from the context API if (cachedData && !(0, logic_1.isOutdated)(cachedData)) return; // no input if (!addressOrDomainLC) { setState({ status: "error", error: new errors_1.DomainEmpty(), updatedAt: Date.now(), }); return; } // checking if any registry is compatible with the provided string const [forwardRegistries, reverseRegistries] = await Promise.all([ (0, registries_2.getRegistriesForDomain)(addressOrDomainLC), (0, registries_1.getRegistriesForAddress)(addressOrDomainLC), ]); // if no registry is found at all if (!forwardRegistries.length && !reverseRegistries.length) { setState({ status: "error", error: new errors_1.UnsupportedDomainOrAddress(), updatedAt: Date.now(), }); return; } // if it's a domain but the domain is not respecting our security rules if (forwardRegistries.length && !(0, utils_1.validateDomain)(addressOrDomainLC)) { setState({ status: "error", error: new errors_1.InvalidDomain(), updatedAt: Date.now(), }); return; } // otherwise let the resolution happen by the backend await loadDomainServiceAPI(addressOrDomainLC, registry); })(); }, [loadDomainServiceAPI, addressOrDomainLC, cachedData]); if (cachedData) { return cachedData; } return state; }; exports.useDomain = useDomain; function DomainServiceProvider({ children, }) { const [state, setState] = (0, react_1.useState)({ cache: {}, }); const api = (0, react_1.useMemo)(() => ({ loadDomainServiceAPI: async (addressOrDomain, registry) => { setState(oldState => ({ ...oldState, cache: { ...oldState.cache, [addressOrDomain]: { status: "loading", }, }, })); const resolutions = await Promise.all([ (0, resolvers_1.resolveDomain)(addressOrDomain, registry), (0, resolvers_1.resolveAddress)(addressOrDomain, registry), ]) .then(res => res.flat()) .catch((e) => e); const newEntry = (() => { if (Array.isArray(resolutions)) { return resolutions.length ? { status: "loaded", resolutions, updatedAt: Date.now(), } : { status: "error", error: new errors_1.NoResolution(`No resolution found for ${addressOrDomain}`), updatedAt: Date.now(), }; } return { status: "error", error: resolutions, updatedAt: Date.now(), }; })(); setState(oldState => ({ ...oldState, cache: { ...oldState.cache, [addressOrDomain]: newEntry, }, })); }, clearCache: () => { setState(oldState => ({ ...oldState, cache: {}, })); }, }), []); const value = { ...state, ...api }; return react_1.default.createElement(DomainServiceContext.Provider, { value: value }, children); } exports.DomainServiceProvider = DomainServiceProvider; //# sourceMappingURL=index.js.map