@ledgerhq/domain-service 0.2.1-next.0 → 0.2.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/hooks/index.d.ts +10 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js +182 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/logic.d.ts +4 -0
- package/lib/hooks/logic.d.ts.map +1 -0
- package/lib/hooks/logic.js +21 -0
- package/lib/hooks/logic.js.map +1 -0
- package/lib/hooks/types.d.ts +27 -0
- package/lib/hooks/types.d.ts.map +1 -0
- package/lib/hooks/types.js +3 -0
- package/lib/hooks/types.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/resolvers/index.d.ts +5 -14
- package/lib/resolvers/index.d.ts.map +1 -1
- package/lib/resolvers/index.js +30 -7
- package/lib/resolvers/index.js.map +1 -1
- package/lib/types.d.ts +2 -1
- package/lib/types.d.ts.map +1 -1
- package/lib-es/hooks/index.d.ts +10 -0
- package/lib-es/hooks/index.d.ts.map +1 -0
- package/lib-es/hooks/index.js +154 -0
- package/lib-es/hooks/index.js.map +1 -0
- package/lib-es/hooks/logic.d.ts +4 -0
- package/lib-es/hooks/logic.d.ts.map +1 -0
- package/lib-es/hooks/logic.js +16 -0
- package/lib-es/hooks/logic.js.map +1 -0
- package/lib-es/hooks/types.d.ts +27 -0
- package/lib-es/hooks/types.d.ts.map +1 -0
- package/lib-es/hooks/types.js +2 -0
- package/lib-es/hooks/types.js.map +1 -0
- package/lib-es/index.d.ts +1 -0
- package/lib-es/index.d.ts.map +1 -1
- package/lib-es/index.js +1 -0
- package/lib-es/index.js.map +1 -1
- package/lib-es/resolvers/index.d.ts +5 -14
- package/lib-es/resolvers/index.d.ts.map +1 -1
- package/lib-es/resolvers/index.js +30 -7
- package/lib-es/resolvers/index.js.map +1 -1
- package/lib-es/types.d.ts +2 -1
- package/lib-es/types.d.ts.map +1 -1
- package/package.json +12 -3
- package/src/__tests__/functionnal/domain-service.react.test.tsx +147 -0
- package/src/__tests__/tsconfig.json +10 -0
- package/src/__tests__/unit/resolvers.unit.test.ts +19 -7
- package/src/hooks/index.tsx +131 -0
- package/src/hooks/logic.ts +22 -0
- package/src/hooks/types.ts +35 -0
- package/src/index.ts +1 -0
- package/src/resolvers/index.ts +37 -20
- package/src/types.ts +6 -2
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
49
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
50
|
+
if (!m) return o;
|
|
51
|
+
var i = m.call(o), r, ar = [], e;
|
|
52
|
+
try {
|
|
53
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
54
|
+
}
|
|
55
|
+
catch (error) { e = { error: error }; }
|
|
56
|
+
finally {
|
|
57
|
+
try {
|
|
58
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
59
|
+
}
|
|
60
|
+
finally { if (e) throw e.error; }
|
|
61
|
+
}
|
|
62
|
+
return ar;
|
|
63
|
+
};
|
|
64
|
+
import React, { createContext, useContext, useEffect, useMemo, useState, } from "react";
|
|
65
|
+
import { resolveAddress, resolveDomain } from "../resolvers";
|
|
66
|
+
import { isOutdated } from "./logic";
|
|
67
|
+
var DomainServiceContext = createContext({
|
|
68
|
+
cache: {},
|
|
69
|
+
loadDomainServiceAPI: function () { return Promise.resolve(); },
|
|
70
|
+
clearCache: function () { }
|
|
71
|
+
});
|
|
72
|
+
export var useDomain = function (addressOrDomain, registry) {
|
|
73
|
+
var addressOrDomainLC = addressOrDomain.toLowerCase();
|
|
74
|
+
var _a = useContext(DomainServiceContext), cache = _a.cache, loadDomainServiceAPI = _a.loadDomainServiceAPI;
|
|
75
|
+
var cachedData = addressOrDomain && cache[addressOrDomainLC];
|
|
76
|
+
useEffect(function () {
|
|
77
|
+
if (!cachedData || isOutdated(cachedData)) {
|
|
78
|
+
loadDomainServiceAPI(addressOrDomainLC, registry);
|
|
79
|
+
}
|
|
80
|
+
}, [loadDomainServiceAPI, addressOrDomainLC, cachedData]);
|
|
81
|
+
if (cachedData) {
|
|
82
|
+
return cachedData;
|
|
83
|
+
}
|
|
84
|
+
else if (!addressOrDomain) {
|
|
85
|
+
return {
|
|
86
|
+
status: "error",
|
|
87
|
+
error: new Error("No address or domain provided"),
|
|
88
|
+
updatedAt: Date.now()
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { status: "queued" };
|
|
92
|
+
};
|
|
93
|
+
export function DomainServiceProvider(_a) {
|
|
94
|
+
var _this = this;
|
|
95
|
+
var children = _a.children;
|
|
96
|
+
var _b = __read(useState({
|
|
97
|
+
cache: {}
|
|
98
|
+
}), 2), state = _b[0], setState = _b[1];
|
|
99
|
+
var api = useMemo(function () { return ({
|
|
100
|
+
loadDomainServiceAPI: function (addressOrDomain, registry) { return __awaiter(_this, void 0, void 0, function () {
|
|
101
|
+
var resolutions_1, error_1;
|
|
102
|
+
return __generator(this, function (_a) {
|
|
103
|
+
switch (_a.label) {
|
|
104
|
+
case 0:
|
|
105
|
+
setState(function (oldState) {
|
|
106
|
+
var _a;
|
|
107
|
+
return (__assign(__assign({}, oldState), { cache: __assign(__assign({}, oldState.cache), (_a = {}, _a[addressOrDomain] = {
|
|
108
|
+
status: "loading"
|
|
109
|
+
}, _a)) }));
|
|
110
|
+
});
|
|
111
|
+
_a.label = 1;
|
|
112
|
+
case 1:
|
|
113
|
+
_a.trys.push([1, 3, , 4]);
|
|
114
|
+
return [4 /*yield*/, Promise.all([
|
|
115
|
+
resolveDomain(addressOrDomain, registry),
|
|
116
|
+
resolveAddress(addressOrDomain, registry),
|
|
117
|
+
]).then(function (res) { return res.flat(); })];
|
|
118
|
+
case 2:
|
|
119
|
+
resolutions_1 = _a.sent();
|
|
120
|
+
if (resolutions_1.length) {
|
|
121
|
+
setState(function (oldState) {
|
|
122
|
+
var _a;
|
|
123
|
+
return (__assign(__assign({}, oldState), { cache: __assign(__assign({}, oldState.cache), (_a = {}, _a[addressOrDomain] = {
|
|
124
|
+
status: "loaded",
|
|
125
|
+
resolutions: resolutions_1,
|
|
126
|
+
updatedAt: Date.now()
|
|
127
|
+
}, _a)) }));
|
|
128
|
+
});
|
|
129
|
+
return [2 /*return*/];
|
|
130
|
+
}
|
|
131
|
+
throw new Error("no resolution for " + addressOrDomain);
|
|
132
|
+
case 3:
|
|
133
|
+
error_1 = _a.sent();
|
|
134
|
+
setState(function (oldState) {
|
|
135
|
+
var _a;
|
|
136
|
+
return (__assign(__assign({}, oldState), { cache: __assign(__assign({}, oldState.cache), (_a = {}, _a[addressOrDomain] = {
|
|
137
|
+
status: "error",
|
|
138
|
+
error: error_1,
|
|
139
|
+
updatedAt: Date.now()
|
|
140
|
+
}, _a)) }));
|
|
141
|
+
});
|
|
142
|
+
return [3 /*break*/, 4];
|
|
143
|
+
case 4: return [2 /*return*/];
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}); },
|
|
147
|
+
clearCache: function () {
|
|
148
|
+
setState(function (oldState) { return (__assign(__assign({}, oldState), { cache: {} })); });
|
|
149
|
+
}
|
|
150
|
+
}); }, []);
|
|
151
|
+
var value = __assign(__assign({}, state), api);
|
|
152
|
+
return (React.createElement(DomainServiceContext.Provider, { value: value }, children));
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DomainServiceResponseLoaded, DomainServiceStatus } from "./types";
|
|
2
|
+
export declare function isOutdated(resource: DomainServiceStatus): boolean;
|
|
3
|
+
export declare const isLoaded: (domain: DomainServiceStatus) => domain is DomainServiceResponseLoaded;
|
|
4
|
+
//# sourceMappingURL=logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../src/hooks/logic.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAG3E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAYjE;AAED,eAAO,MAAM,QAAQ,WACX,mBAAmB,0CACyC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Handle lifecycle of cached data.
|
|
2
|
+
// Expiration date depend on the resource's status.
|
|
3
|
+
export function isOutdated(resource) {
|
|
4
|
+
var now = Date.now();
|
|
5
|
+
switch (resource.status) {
|
|
6
|
+
case "loaded": {
|
|
7
|
+
return now - resource.updatedAt > 60 * 1000; // 1 minute
|
|
8
|
+
}
|
|
9
|
+
case "error": {
|
|
10
|
+
return now - resource.updatedAt > 30 * 1000; // 30 seconds
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
export var isLoaded = function (domain) { return domain.status === "loaded"; };
|
|
16
|
+
//# sourceMappingURL=logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../../src/hooks/logic.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAInC,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,QAA6B;IACtD,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,QAAQ,QAAQ,CAAC,MAAM,EAAE;QACvB,KAAK,QAAQ,CAAC,CAAC;YACb,OAAO,GAAG,GAAG,QAAQ,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;SACzD;QACD,KAAK,OAAO,CAAC,CAAC;YACZ,OAAO,GAAG,GAAG,QAAQ,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;SAC3D;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,IAAM,QAAQ,GAAG,UACtB,MAA2B,IACe,OAAA,MAAM,CAAC,MAAM,KAAK,QAAQ,EAA1B,CAA0B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { DomainServiceResolution, SupportedRegistries } from "../types";
|
|
2
|
+
export type DomainServiceResponseLoaded = {
|
|
3
|
+
status: "loaded";
|
|
4
|
+
resolutions: DomainServiceResolution[];
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
};
|
|
7
|
+
export type DomainServiceResponseQueued = {
|
|
8
|
+
status: "queued";
|
|
9
|
+
};
|
|
10
|
+
export type DomainServiceResponseLoading = {
|
|
11
|
+
status: "loading";
|
|
12
|
+
};
|
|
13
|
+
export type DomainServiceResponseError = {
|
|
14
|
+
status: "error";
|
|
15
|
+
error: any;
|
|
16
|
+
updatedAt: number;
|
|
17
|
+
};
|
|
18
|
+
export type DomainServiceStatus = DomainServiceResponseQueued | DomainServiceResponseLoading | DomainServiceResponseLoaded | DomainServiceResponseError;
|
|
19
|
+
export type DomainServiceContextState = {
|
|
20
|
+
cache: Record<string, DomainServiceStatus>;
|
|
21
|
+
};
|
|
22
|
+
export type DomainServiceContextAPI = {
|
|
23
|
+
loadDomainServiceAPI: (domainOrAddress: string, registry?: SupportedRegistries) => Promise<void>;
|
|
24
|
+
clearCache: () => void;
|
|
25
|
+
};
|
|
26
|
+
export type DomainServiceContextType = DomainServiceContextState & DomainServiceContextAPI;
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAExE,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,QAAQ,CAAC;IACjB,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,MAAM,MAAM,2BAA2B,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,4BAA4B,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AACjE,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,4BAA4B,GAC5B,2BAA2B,GAC3B,0BAA0B,CAAC;AAE/B,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,oBAAoB,EAAE,CACpB,eAAe,EAAE,MAAM,EACvB,QAAQ,CAAC,EAAE,mBAAmB,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,yBAAyB,GAC9D,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":""}
|
package/lib-es/index.d.ts
CHANGED
package/lib-es/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
|
package/lib-es/index.js
CHANGED
package/lib-es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
|
|
@@ -1,25 +1,16 @@
|
|
|
1
|
-
import { SupportedRegistries } from "../types";
|
|
2
|
-
type DomainResolutionResponse = {
|
|
3
|
-
registry: SupportedRegistries;
|
|
4
|
-
address: string;
|
|
5
|
-
};
|
|
1
|
+
import { DomainServiceResolution, SupportedRegistries } from "../types";
|
|
6
2
|
/**
|
|
7
3
|
* Get an array of addresses for a domain
|
|
8
4
|
*
|
|
9
5
|
* @param {string} domain
|
|
10
|
-
* @returns {Promise<
|
|
6
|
+
* @returns {Promise<DomainServiceResolution[]>}
|
|
11
7
|
*/
|
|
12
|
-
export declare const resolveDomain: (domain: string, registryName?: SupportedRegistries) => Promise<
|
|
13
|
-
type AddressResolutionResponse = {
|
|
14
|
-
registry: SupportedRegistries;
|
|
15
|
-
domain: string;
|
|
16
|
-
};
|
|
8
|
+
export declare const resolveDomain: (domain: string, registryName?: SupportedRegistries) => Promise<DomainServiceResolution[]>;
|
|
17
9
|
/**
|
|
18
10
|
* Get an array of domains for an address
|
|
19
11
|
*
|
|
20
12
|
* @param {string} address
|
|
21
|
-
* @returns {Promise<
|
|
13
|
+
* @returns {Promise<DomainServiceResolution[]>}
|
|
22
14
|
*/
|
|
23
|
-
export declare const resolveAddress: (address: string, registryName?: SupportedRegistries) => Promise<
|
|
24
|
-
export {};
|
|
15
|
+
export declare const resolveAddress: (address: string, registryName?: SupportedRegistries) => Promise<DomainServiceResolution[]>;
|
|
25
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOxE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,WAChB,MAAM,iBACC,mBAAmB,KACjC,QAAQ,uBAAuB,EAAE,CAoDnC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,YAChB,MAAM,iBACA,mBAAmB,KACjC,QAAQ,uBAAuB,EAAE,CAoDnC,CAAC"}
|
|
@@ -34,6 +34,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
+
import eip55 from "eip55";
|
|
37
38
|
import { log } from "@ledgerhq/logs";
|
|
38
39
|
import network from "@ledgerhq/live-common/network";
|
|
39
40
|
import { getRegistries, getRegistriesForAddress, getRegistriesForDomain, } from "../registries";
|
|
@@ -41,7 +42,7 @@ import { getRegistries, getRegistriesForAddress, getRegistriesForDomain, } from
|
|
|
41
42
|
* Get an array of addresses for a domain
|
|
42
43
|
*
|
|
43
44
|
* @param {string} domain
|
|
44
|
-
* @returns {Promise<
|
|
45
|
+
* @returns {Promise<DomainServiceResolution[]>}
|
|
45
46
|
*/
|
|
46
47
|
export var resolveDomain = function (domain, registryName) { return __awaiter(void 0, void 0, void 0, function () {
|
|
47
48
|
var registries, responses;
|
|
@@ -56,7 +57,7 @@ export var resolveDomain = function (domain, registryName) { return __awaiter(vo
|
|
|
56
57
|
return [4 /*yield*/, getRegistries()];
|
|
57
58
|
case 1:
|
|
58
59
|
registries_1 = _a.sent();
|
|
59
|
-
registry = registries_1.find(function (r) { return r.name === registryName; });
|
|
60
|
+
registry = registries_1.find(function (r) { return r.name === registryName && r.patterns.forward.test(domain); });
|
|
60
61
|
return [2 /*return*/, registry ? [registry] : []];
|
|
61
62
|
case 2: return [2 /*return*/, getRegistriesForDomain(domain)];
|
|
62
63
|
}
|
|
@@ -82,9 +83,20 @@ export var resolveDomain = function (domain, registryName) { return __awaiter(vo
|
|
|
82
83
|
}
|
|
83
84
|
return result;
|
|
84
85
|
}
|
|
86
|
+
if (!promise.value.data)
|
|
87
|
+
return result;
|
|
88
|
+
var checksummedAddress = (function () {
|
|
89
|
+
try {
|
|
90
|
+
return eip55.encode(promise.value.data);
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return promise.value.data;
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
85
96
|
result.push({
|
|
86
97
|
registry: registries[index].name,
|
|
87
|
-
address:
|
|
98
|
+
address: checksummedAddress,
|
|
99
|
+
domain: domain
|
|
88
100
|
});
|
|
89
101
|
return result;
|
|
90
102
|
}, []);
|
|
@@ -96,10 +108,10 @@ export var resolveDomain = function (domain, registryName) { return __awaiter(vo
|
|
|
96
108
|
* Get an array of domains for an address
|
|
97
109
|
*
|
|
98
110
|
* @param {string} address
|
|
99
|
-
* @returns {Promise<
|
|
111
|
+
* @returns {Promise<DomainServiceResolution[]>}
|
|
100
112
|
*/
|
|
101
113
|
export var resolveAddress = function (address, registryName) { return __awaiter(void 0, void 0, void 0, function () {
|
|
102
|
-
var registries, responses;
|
|
114
|
+
var registries, checksummedAddress, responses;
|
|
103
115
|
return __generator(this, function (_a) {
|
|
104
116
|
switch (_a.label) {
|
|
105
117
|
case 0: return [4 /*yield*/, (function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
@@ -111,7 +123,7 @@ export var resolveAddress = function (address, registryName) { return __awaiter(
|
|
|
111
123
|
return [4 /*yield*/, getRegistries()];
|
|
112
124
|
case 1:
|
|
113
125
|
registries_2 = _a.sent();
|
|
114
|
-
registry = registries_2.find(function (r) { return r.name === registryName; });
|
|
126
|
+
registry = registries_2.find(function (r) { return r.name === registryName && r.patterns.reverse.test(address); });
|
|
115
127
|
return [2 /*return*/, registry ? [registry] : []];
|
|
116
128
|
case 2: return [2 /*return*/, getRegistriesForAddress(address)];
|
|
117
129
|
}
|
|
@@ -119,6 +131,14 @@ export var resolveAddress = function (address, registryName) { return __awaiter(
|
|
|
119
131
|
}); })()];
|
|
120
132
|
case 1:
|
|
121
133
|
registries = _a.sent();
|
|
134
|
+
checksummedAddress = (function () {
|
|
135
|
+
try {
|
|
136
|
+
return eip55.encode(address);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
return address;
|
|
140
|
+
}
|
|
141
|
+
})();
|
|
122
142
|
responses = Promise.allSettled(registries.map(function (registry) {
|
|
123
143
|
return network({
|
|
124
144
|
method: "GET",
|
|
@@ -137,9 +157,12 @@ export var resolveAddress = function (address, registryName) { return __awaiter(
|
|
|
137
157
|
}
|
|
138
158
|
return result;
|
|
139
159
|
}
|
|
160
|
+
if (!promise.value.data)
|
|
161
|
+
return result;
|
|
140
162
|
result.push({
|
|
141
163
|
registry: registries[index].name,
|
|
142
|
-
domain: promise.value.data
|
|
164
|
+
domain: promise.value.data,
|
|
165
|
+
address: checksummedAddress
|
|
143
166
|
});
|
|
144
167
|
return result;
|
|
145
168
|
}, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,OAAO,MAAM,+BAA+B,CAAC;AAEpD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"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"}
|
package/lib-es/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CoinType } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
|
|
2
|
+
import type { SupportedRegistries, DomainServiceResolution } from "@ledgerhq/types-live/lib/domain";
|
|
3
3
|
export type Registry = {
|
|
4
4
|
name: SupportedRegistries;
|
|
5
5
|
resolvers: {
|
|
@@ -16,4 +16,5 @@ export type Registry = {
|
|
|
16
16
|
};
|
|
17
17
|
coinTypes: CoinType[];
|
|
18
18
|
};
|
|
19
|
+
export { SupportedRegistries, DomainServiceResolution };
|
|
19
20
|
//# sourceMappingURL=types.d.ts.map
|
package/lib-es/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/domain-service",
|
|
3
3
|
"description": "Ledger service responsible for domain handling",
|
|
4
|
-
"version": "0.2.1-next.
|
|
4
|
+
"version": "0.2.1-next.1",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -54,13 +54,21 @@
|
|
|
54
54
|
"src"
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
|
+
"eip55": "^2.1.0",
|
|
58
|
+
"react": "^17.0.2",
|
|
59
|
+
"react-dom": "^17.0.2",
|
|
57
60
|
"@ledgerhq/cryptoassets": "^9.2.0-next.0",
|
|
58
61
|
"@ledgerhq/errors": "^6.12.4-next.0",
|
|
59
|
-
"@ledgerhq/live-common": "^29.2.0-next.
|
|
60
|
-
"@ledgerhq/logs": "^6.10.1"
|
|
62
|
+
"@ledgerhq/live-common": "^29.2.0-next.1",
|
|
63
|
+
"@ledgerhq/logs": "^6.10.1",
|
|
64
|
+
"@ledgerhq/types-live": "^6.31.0"
|
|
61
65
|
},
|
|
62
66
|
"devDependencies": {
|
|
67
|
+
"@testing-library/jest-dom": "^5.16.5",
|
|
68
|
+
"@testing-library/react": "12",
|
|
69
|
+
"@testing-library/react-hooks": "^4.0.1",
|
|
63
70
|
"@types/jest": "^28.1.3",
|
|
71
|
+
"@types/testing-library__jest-dom": "^5.14.5",
|
|
64
72
|
"@typescript-eslint/eslint-plugin": "^5.46.1",
|
|
65
73
|
"@typescript-eslint/parser": "^5.46.1",
|
|
66
74
|
"cross-env": "^7.0.3",
|
|
@@ -73,6 +81,7 @@
|
|
|
73
81
|
"jest": "^28.1.3",
|
|
74
82
|
"jest-environment-jsdom": "^28.1.3",
|
|
75
83
|
"prettier": "^2.8.1",
|
|
84
|
+
"react-test-renderer": "^17.0.2",
|
|
76
85
|
"ts-jest": "^28.0.8",
|
|
77
86
|
"typescript": "^4.9.5",
|
|
78
87
|
"@ledgerhq/types-cryptoassets": "^7.0.0"
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "@testing-library/jest-dom";
|
|
3
|
+
import { renderHook } from "@testing-library/react-hooks";
|
|
4
|
+
import { render, screen, waitFor } from "@testing-library/react";
|
|
5
|
+
import { DomainServiceProvider, useDomain } from "../../hooks";
|
|
6
|
+
import { resolveAddress, resolveDomain } from "../../resolvers";
|
|
7
|
+
import { DomainServiceResolution } from "../../types";
|
|
8
|
+
|
|
9
|
+
jest.mock("../../resolvers");
|
|
10
|
+
|
|
11
|
+
const mockedResolvedDomain = jest.mocked(resolveDomain, true);
|
|
12
|
+
const mockedResolvedAddress = jest.mocked(resolveAddress, true);
|
|
13
|
+
|
|
14
|
+
const resolutionKeys: (keyof DomainServiceResolution)[] = [
|
|
15
|
+
"registry",
|
|
16
|
+
"address",
|
|
17
|
+
"domain",
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
const CustomTest = ({ str }: { str: string }) => {
|
|
21
|
+
const result = useDomain(str);
|
|
22
|
+
const { status } = result;
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div>
|
|
26
|
+
<div data-testid="status">{status}</div>
|
|
27
|
+
{status === "loaded" && (
|
|
28
|
+
<div data-testid="resolutions">
|
|
29
|
+
{result.resolutions.map((resolution, index) => (
|
|
30
|
+
<React.Fragment key={index}>
|
|
31
|
+
<div data-testid={`${index}-registry`}>{resolution.registry}</div>
|
|
32
|
+
<div data-testid={`${index}-address`}>{resolution.address}</div>
|
|
33
|
+
<div data-testid={`${index}-domain`}>{resolution.domain}</div>
|
|
34
|
+
</React.Fragment>
|
|
35
|
+
))}
|
|
36
|
+
</div>
|
|
37
|
+
)}
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
describe("useNamingService", () => {
|
|
43
|
+
test("should be an error", async () => {
|
|
44
|
+
mockedResolvedDomain.mockImplementation(async () => {
|
|
45
|
+
return [];
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
mockedResolvedAddress.mockImplementation(async () => {
|
|
49
|
+
return [];
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
render(
|
|
53
|
+
<DomainServiceProvider>
|
|
54
|
+
<CustomTest str="notavalideth" />
|
|
55
|
+
</DomainServiceProvider>
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
await waitFor(() => {
|
|
59
|
+
expect(screen.getByTestId("status").textContent).not.toBe("loading");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// this test should be first otherwise mock call will be more than 0
|
|
63
|
+
expect(screen.getByTestId("status").textContent).toBe("error");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("should be queue", () => {
|
|
67
|
+
const { result } = renderHook(useDomain, {
|
|
68
|
+
initialProps: "vitalik.eth",
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
expect(result.current.status).toBe("queued");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("success forward", async () => {
|
|
75
|
+
const resolutions: DomainServiceResolution[] = [
|
|
76
|
+
{
|
|
77
|
+
address: "forced mocked address",
|
|
78
|
+
registry: "ens",
|
|
79
|
+
domain: "vitalik.eth",
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
mockedResolvedDomain.mockImplementation(async () => resolutions);
|
|
83
|
+
|
|
84
|
+
render(
|
|
85
|
+
<DomainServiceProvider>
|
|
86
|
+
<CustomTest str="vitalik.eth" />
|
|
87
|
+
</DomainServiceProvider>
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
await waitFor(
|
|
91
|
+
() => {
|
|
92
|
+
expect(screen.getByTestId("status").textContent).toBe("loaded");
|
|
93
|
+
},
|
|
94
|
+
{ timeout: 5000 }
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
expect(screen.getByTestId("status").textContent).toBe("loaded");
|
|
98
|
+
expect(screen.getByTestId("resolutions")).toBeInTheDocument();
|
|
99
|
+
resolutions.forEach((resolution, index) => {
|
|
100
|
+
resolutionKeys.forEach((field) => {
|
|
101
|
+
expect(screen.getByTestId("resolutions")).toContainElement(
|
|
102
|
+
screen.getByTestId(`${index}-${field}`)
|
|
103
|
+
);
|
|
104
|
+
expect(screen.getByTestId(`${index}-${field}`).textContent).toBe(
|
|
105
|
+
resolution[field]
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("success reverse", async () => {
|
|
112
|
+
const reverseResolutions: DomainServiceResolution[] = [
|
|
113
|
+
{
|
|
114
|
+
domain: "vitalik.eth",
|
|
115
|
+
registry: "ens",
|
|
116
|
+
address: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
mockedResolvedDomain.mockImplementation(async () => {
|
|
120
|
+
return [];
|
|
121
|
+
});
|
|
122
|
+
mockedResolvedAddress.mockImplementation(async () => reverseResolutions);
|
|
123
|
+
|
|
124
|
+
render(
|
|
125
|
+
<DomainServiceProvider>
|
|
126
|
+
<CustomTest str="0xd8da6bf26964af9d7eed9e03e53415d37aa96045" />
|
|
127
|
+
</DomainServiceProvider>
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
await waitFor(() => {
|
|
131
|
+
expect(screen.getByTestId("status").textContent).toBe("loaded");
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
expect(screen.getByTestId("status").textContent).toBe("loaded");
|
|
135
|
+
expect(screen.getByTestId("resolutions")).toBeInTheDocument();
|
|
136
|
+
reverseResolutions.forEach((resolution, index) => {
|
|
137
|
+
resolutionKeys.forEach((field) => {
|
|
138
|
+
expect(screen.getByTestId("resolutions")).toContainElement(
|
|
139
|
+
screen.getByTestId(`${index}-${field}`)
|
|
140
|
+
);
|
|
141
|
+
expect(screen.getByTestId(`${index}-${field}`).textContent).toBe(
|
|
142
|
+
resolution[field]
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
});
|