@ledgerhq/domain-service
Version:
Ledger service responsible for domain handling
152 lines • 6.15 kB
JavaScript
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
;