URI parsing improvements (#207)
* Prevent multiple parseURI calls ## Ticket 129 ## Issue Code was shortened to use `isURIValid` during the consolidation. `isURIValid` calls `normalizeURI`, which calls another `parseURI`. `parseURI` is pretty expensive. ## Approach - Add optional parameter to `isURIValid` to skip the normalization. - Set those that were converted during the consolidation to skip the normalization. Also covered a few other instances where it is obvious to me that normalization is not required. - For the rest, I can't tell for sure if it's safe to remove the normalization, so the default `normalize=true` will leave things as is. The whole `parseURI` probably needs a refactoring, or a few lighter version for specific needs. * Simplify isURIEqual ## Issue `parseURI` is too expensive to be used in a loop, plus `normalizeURI` itself is calling `parseURI`. ## Approach Not sure if it covers all cases, but just try convert colons to hashes before comparing.
This commit is contained in:
parent
704452732a
commit
bf0aac2339
3 changed files with 16 additions and 21 deletions
|
@ -167,7 +167,7 @@ const ClaimPreview = forwardRef<any, {}>((props: Props, ref: any) => {
|
|||
</span>
|
||||
);
|
||||
}, [channelSubCount]);
|
||||
const isValid = uri && isURIValid(uri);
|
||||
const isValid = uri && isURIValid(uri, false);
|
||||
|
||||
// $FlowFixMe
|
||||
const isPlayable =
|
||||
|
|
|
@ -77,10 +77,11 @@ export const selectClaimForUri = createCachedSelector(
|
|||
(state, uri) => uri,
|
||||
(state, uri, returnRepost = true) => returnRepost,
|
||||
(byUri, byId, uri, returnRepost) => {
|
||||
const validUri = isURIValid(uri);
|
||||
const validUri = isURIValid(uri, false);
|
||||
|
||||
if (validUri && byUri) {
|
||||
const claimId = uri && byUri[normalizeURI(uri)];
|
||||
const normalizedUri = normalizeURI(uri);
|
||||
const claimId = uri && byUri[normalizedUri];
|
||||
const claim = byId[claimId];
|
||||
|
||||
// Make sure to return the claim as is so apps can check if it's been resolved before (null) or still needs to be resolved (undefined)
|
||||
|
@ -97,7 +98,7 @@ export const selectClaimForUri = createCachedSelector(
|
|||
|
||||
return {
|
||||
...repostedClaim,
|
||||
repost_url: normalizeURI(uri),
|
||||
repost_url: normalizedUri,
|
||||
repost_channel_url: channelUrl,
|
||||
repost_bid_amount: claim && claim.meta && claim.meta.effective_amount,
|
||||
};
|
||||
|
@ -108,12 +109,14 @@ export const selectClaimForUri = createCachedSelector(
|
|||
}
|
||||
)((state, uri, returnRepost = true) => `${String(uri)}:${returnRepost ? '1' : '0'}`);
|
||||
|
||||
// Note: this is deprecated. Use "selectClaimForUri(state, uri)" instead.
|
||||
export const makeSelectClaimForUri = (uri: string, returnRepost: boolean = true) =>
|
||||
createSelector(selectClaimIdsByUri, selectClaimsById, (byUri, byId) => {
|
||||
const validUri = isURIValid(uri);
|
||||
const validUri = isURIValid(uri, false);
|
||||
|
||||
if (validUri && byUri) {
|
||||
const claimId = uri && byUri[normalizeURI(uri)];
|
||||
const normalizedUri = normalizeURI(uri);
|
||||
const claimId = uri && byUri[normalizedUri];
|
||||
const claim = byId[claimId];
|
||||
|
||||
// Make sure to return the claim as is so apps can check if it's been resolved before (null) or still needs to be resolved (undefined)
|
||||
|
@ -130,7 +133,7 @@ export const makeSelectClaimForUri = (uri: string, returnRepost: boolean = true)
|
|||
|
||||
return {
|
||||
...repostedClaim,
|
||||
repost_url: normalizeURI(uri),
|
||||
repost_url: normalizedUri,
|
||||
repost_channel_url: channelUrl,
|
||||
repost_bid_amount: claim && claim.meta && claim.meta.effective_amount,
|
||||
};
|
||||
|
@ -184,7 +187,7 @@ export const makeSelectClaimIsMine = (rawUri: string) => {
|
|||
} catch (e) {}
|
||||
|
||||
return createSelector(selectClaimsByUri, selectMyActiveClaims, (claims, myClaims) => {
|
||||
if (!isURIValid(uri)) {
|
||||
if (!isURIValid(uri, false)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -265,9 +265,9 @@ export function normalizeURI(URL: string) {
|
|||
});
|
||||
}
|
||||
|
||||
export function isURIValid(URL: string): boolean {
|
||||
export function isURIValid(URL: string, normalize: boolean = true): boolean {
|
||||
try {
|
||||
parseURI(normalizeURI(URL));
|
||||
parseURI(normalize ? normalizeURI(URL) : URL);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
|
@ -323,15 +323,7 @@ export function splitBySeparator(uri: string) {
|
|||
}
|
||||
|
||||
export function isURIEqual(uriA: string, uriB: string) {
|
||||
const parseA = parseURI(normalizeURI(uriA));
|
||||
const parseB = parseURI(normalizeURI(uriB));
|
||||
if (parseA.isChannel) {
|
||||
if (parseB.isChannel && parseA.channelClaimId === parseB.channelClaimId) {
|
||||
return true;
|
||||
}
|
||||
} else if (parseA.streamClaimId === parseB.streamClaimId) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
const a = uriA && uriA.replace(/:/g, '#');
|
||||
const b = uriB && uriB.replace(/:/g, '#');
|
||||
return a === b;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue