Skip to content

Commit 5b76aa6

Browse files
committed
fix: skip parsing error messages from embed server.
1 parent 24a9566 commit 5b76aa6

File tree

1 file changed

+58
-46
lines changed

1 file changed

+58
-46
lines changed

src/lib/utils/markdown.ts

Lines changed: 58 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import sanitizeHtml from 'sanitize-html';
33
import type { EmbedV1 } from '$lib/types/embed-sdk';
44

55
// Embed Service types https://github.com/Lantern-chat/embed-service/blob/master/embed-sdk/index.d.ts
6-
type Data = EmbedV1
6+
type Data = EmbedV1;
77

88
/** conditional render */
9-
const cr = (value: string | undefined, seperator = ''): string => value !== undefined ? ` ${seperator} ${value}` : ''
10-
const linkCardTemplate = ({ data: d, url }: { data: Data, url: string }) => `
9+
const cr = (value: string | undefined, seperator = ''): string =>
10+
value !== undefined ? ` ${seperator} ${value}` : '';
11+
const linkCardTemplate = ({ data: d, url }: { data: Data; url: string }) => `
1112
<div class="flex flex-col flex-wrap justify-stretch gap-4 min-[500px]:flex-row">
1213
<div class="min-w-0 flex-1 px-3 py-2 flex flex-col">
1314
<p class="mb-1 mt-0 text-sm leading-none opacity-70">${cr(d.p?.n)} ${cr(d.au?.n, '-')}</p>
@@ -22,84 +23,95 @@ const linkCardTemplate = ({ data: d, url }: { data: Data, url: string }) => `
2223
<div class="text-sm leading-tight underline text-blue-400">${url}</div>
2324
</a >
2425
</div>
25-
${d.imgs && d.imgs.length ? `
26+
${
27+
d.imgs && d.imgs.length
28+
? `
2629
<div class=" w-full flex-shrink-0 p-2 min-[500px]:max-w-40">
2730
<img class="my-0 h-full w-full rounded object-cover" src=${d.imgs[0].u}>
28-
</div>` : ''}
29-
${d.vid ? `
31+
</div>`
32+
: ''
33+
}
34+
${
35+
d.vid
36+
? `
3037
<div class=" w-full flex-shrink-0 p-2 min-[500px]:max-w-40">
3138
<video class="my-0 h-full w-full rounded object-cover" poster="${d.thumb?.u}" src="${d.vid.u}" ></video>
32-
</div>` : ''}
39+
</div>`
40+
: ''
41+
}
3342
</div>
3443
`;
3544

3645
export const previewLinks = async (html: string) => {
37-
let document: Document
46+
let document: Document;
3847
if (import.meta.env.SSR) {
39-
const { parseHTML } = await import('linkedom')
40-
const dom = parseHTML(html, 'text/html')
41-
document = dom.document
48+
const { parseHTML } = await import('linkedom');
49+
const dom = parseHTML(html, 'text/html');
50+
document = dom.document;
4251
} else {
43-
document = new DOMParser().parseFromString(html, 'text/html')
52+
document = new DOMParser().parseFromString(html, 'text/html');
4453
}
45-
const fragment = document.createDocumentFragment()
54+
const fragment = document.createDocumentFragment();
4655

47-
const links: Array<HTMLAnchorElement> = []
56+
const links: Array<HTMLAnchorElement> = [];
4857
document.childNodes.forEach((node) => {
49-
fragment.append(node)
58+
fragment.append(node);
5059
if ('tagName' in node && node.tagName === 'P') {
5160
// get a list of all anchor tags in their own paragraph with the href as inner
5261
// should be equivalent to \n\n<markdown-link>\n\n
53-
const child = node.firstChild
54-
if (child
55-
&& node.childNodes.length === 1
56-
&& child.nodeName === 'A'
57-
&& 'href' in child
58-
&& child.href === child.innerHTML) {
59-
links.push(child)
62+
const child = node.firstChild;
63+
if (
64+
child &&
65+
node.childNodes.length === 1 &&
66+
child.nodeName === 'A' &&
67+
'href' in child &&
68+
child.href === child.innerHTML
69+
) {
70+
links.push(child);
6071
}
6172
}
62-
})
73+
});
6374

6475
// cache data for identical url within the same request
65-
const cache = new Map<string, Data>()
76+
const cache = new Map<string, Data>();
6677
return Promise.all(
6778
links.map(async (a) => {
68-
let data = cache.get(a.href)
79+
let data = cache.get(a.href);
6980
if (!data) {
7081
try {
7182
const res = await fetch('https://embed.internal.weird.one?lang=en', {
7283
method: 'POST',
7384
headers: {
74-
'Content-Type': 'text/plain',
85+
'Content-Type': 'text/plain'
7586
},
7687
body: a.href
77-
})
78-
if (!res.ok)
79-
console.error(`${res.status} ${res.statusText}: for url ${a.href}`)
80-
const json = await res.json()
81-
data = cache.set(a.href, json[1]).get(a.href)
82-
88+
});
89+
if (res.ok) {
90+
const json = await res.json();
91+
data = cache.set(a.href, json[1]).get(a.href);
92+
} else {
93+
console.error(`Embed server error: ${res.status} ${res.statusText}: for url ${a.href}`);
94+
}
8395
} catch (err) {
84-
if (err instanceof TypeError)
85-
console.error(`${err.message}. ${err.cause}`)
86-
else throw err
96+
if (err instanceof TypeError) console.error(`${err.message}. ${err.cause}`);
97+
else throw err;
8798
}
8899
}
89-
if (!data) return
90-
const linkCard = document.createElement('div')
91-
linkCard.className = "unfurl overflow-hidden rounded-r border-l-4 border-gray-200 bg-gray-200 bg-opacity-10"
92-
linkCard.innerHTML = linkCardTemplate({ data, url: a.href })
93-
a.replaceWith(linkCard)
100+
if (!data) return;
101+
const linkCard = document.createElement('div');
102+
linkCard.className =
103+
'unfurl overflow-hidden rounded-r border-l-4 border-gray-200 bg-gray-200 bg-opacity-10';
104+
linkCard.innerHTML = linkCardTemplate({ data, url: a.href });
105+
a.replaceWith(linkCard);
94106
})
95107
).then(() => {
96-
const container = document.createElement('div')
97-
container.appendChild(fragment.cloneNode(true))
98-
return container.innerHTML
99-
})
100-
}
108+
const container = document.createElement('div');
109+
container.appendChild(fragment.cloneNode(true));
110+
return container.innerHTML;
111+
});
112+
};
101113

102114
/** Render the markdown string to sanitized HTML, ready for display in the app. */
103115
export function renderMarkdownSanitized(markdown: string) {
104-
return sanitizeHtml(marked.parse(markdown) as string)
116+
return sanitizeHtml(marked.parse(markdown) as string);
105117
}

0 commit comments

Comments
 (0)