chore: improve meili error handling

This commit is contained in:
Daniel Avila 2023-03-22 17:15:32 -04:00
parent 68979015c1
commit 655e7ce6d6
9 changed files with 182 additions and 64 deletions

View file

@ -26,8 +26,8 @@ BING_TOKEN=
# this is taken care of you if you use the docker-compose file. # this is taken care of you if you use the docker-compose file.
# SEARCH=TRUE # SEARCH=TRUE
SEARCH= SEARCH=
MEILI_HOST='http://localhost:7700' MEILI_HOST='http://0.0.0.0:7700'
MEILI_HTTP_ADDR='http://localhost:7700' MEILI_HTTP_ADDR='0.0.0.0:7700'
# needs a secure key, feel free to generate your own. # needs a secure key, feel free to generate your own.
MEILI_MASTER_KEY=WjRvKvpelIYHa4dlcDGsdT9c0CKRbY-4VcuCQ1iZPcc MEILI_MASTER_KEY=WjRvKvpelIYHa4dlcDGsdT9c0CKRbY-4VcuCQ1iZPcc

View file

@ -43,9 +43,22 @@ async function indexSync(req, res, next) {
await Conversation.syncWithMeili(); await Conversation.syncWithMeili();
} }
} catch (err) { } catch (err) {
// console.log('in index sync');
if (err.message.includes('not found')) {
console.log('Creating indices...');
setTimeout(async () => {
try {
await Message.syncWithMeili();
await Conversation.syncWithMeili();
} catch (err) {
console.error('Trouble creating indices, try restarting the server.');
}
}, 750);
} else {
console.error(err); console.error(err);
// res.status(500).json({ error: 'Server error' }); // res.status(500).json({ error: 'Server error' });
} }
} }
}
module.exports = indexSync; module.exports = indexSync;

View file

@ -3,11 +3,13 @@ const handleDuplicateKeyError = (err, res) => {
const field = Object.keys(err.keyValue); const field = Object.keys(err.keyValue);
const code = 409; const code = 409;
const error = `An document with that ${field} already exists.`; const error = `An document with that ${field} already exists.`;
console.log('congrats you hit the duped keys error');
res.status(code).send({ messages: error, fields: field }); res.status(code).send({ messages: error, fields: field });
}; };
//handle validation errors //handle validation errors
const handleValidationError = (err, res) => { const handleValidationError = (err, res) => {
console.log('congrats you hit the validation middleware');
let errors = Object.values(err.errors).map(el => el.message); let errors = Object.values(err.errors).map(el => el.message);
let fields = Object.values(err.errors).map(el => el.path); let fields = Object.values(err.errors).map(el => el.path);
let code = 400; let code = 400;

View file

@ -81,7 +81,7 @@ const projectPath = path.join(__dirname, '..', '..', 'client');
let messageCount = 0; let messageCount = 0;
process.on('uncaughtException', (err) => { process.on('uncaughtException', (err) => {
// console.error('There was an uncaught error:', err.message); console.error('There was an uncaught error:', err.message);
if (err.message.includes('fetch failed')) { if (err.message.includes('fetch failed')) {
if (messageCount === 0) console.error('Meilisearch error, search will be disabled'); if (messageCount === 0) console.error('Meilisearch error, search will be disabled');
messageCount++; messageCount++;

View file

@ -4,7 +4,7 @@ const { MeiliSearch } = require('meilisearch');
const { Message } = require('../../models/Message'); const { Message } = require('../../models/Message');
const { Conversation, getConvosQueried } = require('../../models/Conversation'); const { Conversation, getConvosQueried } = require('../../models/Conversation');
const { reduceHits } = require('../../lib/utils/reduceHits'); const { reduceHits } = require('../../lib/utils/reduceHits');
const { replaceSup, cleanUpPrimaryKeyValue } = require('../../lib/utils/misc'); const { cleanUpPrimaryKeyValue } = require('../../lib/utils/misc');
const cache = new Map(); const cache = new Map();
router.get('/sync', async function (req, res) { router.get('/sync', async function (req, res) {
@ -46,7 +46,7 @@ router.get('/', async function (req, res) {
return { return {
...rest, ...rest,
searchResult: true, searchResult: true,
text: replaceSup(_formatted.text) text: _formatted.text
}; };
}); });
const titles = (await Conversation.meiliSearch(q)).hits; const titles = (await Conversation.meiliSearch(q)).hits;
@ -55,8 +55,6 @@ router.get('/', async function (req, res) {
const result = await getConvosQueried(user, sortedHits, pageNumber); const result = await getConvosQueried(user, sortedHits, pageNumber);
cache.set(key, result.cache); cache.set(key, result.cache);
delete result.cache; delete result.cache;
// result.messages = messages.filter(message => { });
// !result.filter.has(message.conversationId)
const activeMessages = []; const activeMessages = [];
for (let i = 0; i < messages.length; i++) { for (let i = 0; i < messages.length; i++) {

130
client/package-lock.json generated
View file

@ -34,9 +34,9 @@
"react-transition-group": "^4.4.5", "react-transition-group": "^4.4.5",
"rehype-highlight": "^6.0.0", "rehype-highlight": "^6.0.0",
"rehype-katex": "^6.0.2", "rehype-katex": "^6.0.2",
"rehype-raw": "^6.1.1",
"remark-gfm": "^3.0.1", "remark-gfm": "^3.0.1",
"remark-math": "^5.1.1", "remark-math": "^5.1.1",
"remark-sub-super": "^1.0.20",
"remark-supersub": "^1.0.0", "remark-supersub": "^1.0.0",
"swr": "^2.0.3", "swr": "^2.0.3",
"tailwind-merge": "^1.9.1", "tailwind-merge": "^1.9.1",
@ -3187,6 +3187,11 @@
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true "dev": true
}, },
"node_modules/@types/parse5": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz",
"integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g=="
},
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
@ -6814,6 +6819,45 @@
"url": "https://opencollective.com/unified" "url": "https://opencollective.com/unified"
} }
}, },
"node_modules/hast-util-raw": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz",
"integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==",
"dependencies": {
"@types/hast": "^2.0.0",
"@types/parse5": "^6.0.0",
"hast-util-from-parse5": "^7.0.0",
"hast-util-to-parse5": "^7.0.0",
"html-void-elements": "^2.0.0",
"parse5": "^6.0.0",
"unist-util-position": "^4.0.0",
"unist-util-visit": "^4.0.0",
"vfile": "^5.0.0",
"web-namespaces": "^2.0.0",
"zwitch": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-parse5": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz",
"integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==",
"dependencies": {
"@types/hast": "^2.0.0",
"comma-separated-tokens": "^2.0.0",
"property-information": "^6.0.0",
"space-separated-tokens": "^2.0.0",
"web-namespaces": "^2.0.0",
"zwitch": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-to-text": { "node_modules/hast-util-to-text": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz",
@ -6928,6 +6972,15 @@
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
"dev": true "dev": true
}, },
"node_modules/html-void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz",
"integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/http-deceiver": { "node_modules/http-deceiver": {
"version": "1.2.7", "version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@ -10918,6 +10971,20 @@
"url": "https://opencollective.com/unified" "url": "https://opencollective.com/unified"
} }
}, },
"node_modules/rehype-raw": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz",
"integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==",
"dependencies": {
"@types/hast": "^2.0.0",
"hast-util-raw": "^7.2.0",
"unified": "^10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/remark-gfm": { "node_modules/remark-gfm": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
@ -10977,11 +11044,6 @@
"url": "https://opencollective.com/unified" "url": "https://opencollective.com/unified"
} }
}, },
"node_modules/remark-sub-super": {
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/remark-sub-super/-/remark-sub-super-1.0.20.tgz",
"integrity": "sha512-ohnGWuB8FSvod8Qp+gEo/7QRDlI2RA8d+YyY4eLuMQPD3WGwqGMCuyWdNOSW0mzDMqse82PJqeke/GGXaj795A=="
},
"node_modules/remark-supersub": { "node_modules/remark-supersub": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz", "resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz",
@ -15229,6 +15291,11 @@
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true "dev": true
}, },
"@types/parse5": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz",
"integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g=="
},
"@types/prop-types": { "@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
@ -18048,6 +18115,37 @@
"@types/hast": "^2.0.0" "@types/hast": "^2.0.0"
} }
}, },
"hast-util-raw": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz",
"integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==",
"requires": {
"@types/hast": "^2.0.0",
"@types/parse5": "^6.0.0",
"hast-util-from-parse5": "^7.0.0",
"hast-util-to-parse5": "^7.0.0",
"html-void-elements": "^2.0.0",
"parse5": "^6.0.0",
"unist-util-position": "^4.0.0",
"unist-util-visit": "^4.0.0",
"vfile": "^5.0.0",
"web-namespaces": "^2.0.0",
"zwitch": "^2.0.0"
}
},
"hast-util-to-parse5": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz",
"integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==",
"requires": {
"@types/hast": "^2.0.0",
"comma-separated-tokens": "^2.0.0",
"property-information": "^6.0.0",
"space-separated-tokens": "^2.0.0",
"web-namespaces": "^2.0.0",
"zwitch": "^2.0.0"
}
},
"hast-util-to-text": { "hast-util-to-text": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz",
@ -18149,6 +18247,11 @@
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
"dev": true "dev": true
}, },
"html-void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz",
"integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
},
"http-deceiver": { "http-deceiver": {
"version": "1.2.7", "version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@ -20742,6 +20845,16 @@
"unified": "^10.0.0" "unified": "^10.0.0"
} }
}, },
"rehype-raw": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz",
"integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==",
"requires": {
"@types/hast": "^2.0.0",
"hast-util-raw": "^7.2.0",
"unified": "^10.0.0"
}
},
"remark-gfm": { "remark-gfm": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
@ -20785,11 +20898,6 @@
"unified": "^10.0.0" "unified": "^10.0.0"
} }
}, },
"remark-sub-super": {
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/remark-sub-super/-/remark-sub-super-1.0.20.tgz",
"integrity": "sha512-ohnGWuB8FSvod8Qp+gEo/7QRDlI2RA8d+YyY4eLuMQPD3WGwqGMCuyWdNOSW0mzDMqse82PJqeke/GGXaj795A=="
},
"remark-supersub": { "remark-supersub": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz", "resolved": "https://registry.npmjs.org/remark-supersub/-/remark-supersub-1.0.0.tgz",

View file

@ -44,9 +44,9 @@
"react-transition-group": "^4.4.5", "react-transition-group": "^4.4.5",
"rehype-highlight": "^6.0.0", "rehype-highlight": "^6.0.0",
"rehype-katex": "^6.0.2", "rehype-katex": "^6.0.2",
"rehype-raw": "^6.1.1",
"remark-gfm": "^3.0.1", "remark-gfm": "^3.0.1",
"remark-math": "^5.1.1", "remark-math": "^5.1.1",
"remark-sub-super": "^1.0.20",
"remark-supersub": "^1.0.0", "remark-supersub": "^1.0.0",
"swr": "^2.0.3", "swr": "^2.0.3",
"tailwind-merge": "^1.9.1", "tailwind-merge": "^1.9.1",

View file

@ -4,17 +4,12 @@ import rehypeKatex from 'rehype-katex';
import rehypeHighlight from 'rehype-highlight'; import rehypeHighlight from 'rehype-highlight';
import remarkMath from 'remark-math'; import remarkMath from 'remark-math';
import remarkGfm from 'remark-gfm'; import remarkGfm from 'remark-gfm';
// import supersub from 'remark-supersub' import rehypeRaw from 'rehype-raw'
import remarkSubSuper from 'remark-sub-super';
import CodeBlock from './CodeBlock'; import CodeBlock from './CodeBlock';
import { langSubset } from '~/utils/languages'; import { langSubset } from '~/utils/languages';
const Content = React.memo(({ content }) => { const Content = React.memo(({ content, isCreatedByUser = false }) => {
return ( const rehypePlugins = [
<>
<ReactMarkdown
remarkPlugins={[remarkGfm, [remarkMath, { singleDollarTextMath: false }], remarkSubSuper]}
rehypePlugins={[
[rehypeKatex, { output: 'mathml' }], [rehypeKatex, { output: 'mathml' }],
[ [
rehypeHighlight, rehypeHighlight,
@ -23,12 +18,14 @@ const Content = React.memo(({ content }) => {
ignoreMissing: true, ignoreMissing: true,
subset: langSubset subset: langSubset
} }
],
[rehypeRaw],
] ]
]} return (
renderers={{ <>
sub: 'sub', <ReactMarkdown
sup: 'sup', remarkPlugins={[remarkGfm, [remarkMath, { singleDollarTextMath: false }]]}
}} rehypePlugins={isCreatedByUser ? rehypePlugins.slice(-1) : rehypePlugins}
linkTarget="_new" linkTarget="_new"
components={{ components={{
code, code,
@ -63,30 +60,30 @@ const p = React.memo((props) => {
return <span className="whitespace-pre-wrap mb-2">{props?.children}</span>; return <span className="whitespace-pre-wrap mb-2">{props?.children}</span>;
}); });
const blinker = ({ node }) => { // const blinker = ({ node }) => {
if (node.type === 'text' && node.value === '█') { // if (node.type === 'text' && node.value === '') {
return <span className="result-streaming">{node.value}</span>; // return <span className="result-streaming">{node.value}</span>;
} // }
return null; // return null;
}; // };
const em = React.memo(({ node, ...props }) => { // const em = React.memo(({ node, ...props }) => {
if ( // if (
props.children[0] && // props.children[0] &&
typeof props.children[0] === 'string' && // typeof props.children[0] === 'string' &&
props.children[0].startsWith('^') // props.children[0].startsWith('^')
) { // ) {
return <sup>{props.children[0].substring(1)}</sup>; // return <sup>{props.children[0].substring(1)}</sup>;
} // }
if ( // if (
props.children[0] && // props.children[0] &&
typeof props.children[0] === 'string' && // typeof props.children[0] === 'string' &&
props.children[0].startsWith('~') // props.children[0].startsWith('~')
) { // ) {
return <sub>{props.children[0].substring(1)}</sub>; // return <sub>{props.children[0].substring(1)}</sub>;
} // }
return <i {...props} />; // return <i {...props} />;
}); // });
export default Content; export default Content;

View file

@ -7,7 +7,7 @@ const Wrapper = React.memo(({ text, generateCursor, isCreatedByUser, searchResul
return ( return (
<Content <Content
content={text} content={text}
generateCursor={generateCursor} isCreatedByUser={isCreatedByUser}
/> />
); );
} else if (!isCreatedByUser) { } else if (!isCreatedByUser) {