UNPKG

@iktos-oss/rdkit-provider

Version:

exports an initialized RDKit instance, with helper functions

1 lines 8.72 kB
(()=>{"use strict";const r=(r,e,o)=>{globalThis.rdkitWorkerGlobals.jsMolCacheEnabled&&globalThis.rdkitWorkerGlobals.jsMolCache&&globalThis.rdkitWorkerGlobals.jsQMolCache&&("mol"===o&&(globalThis.rdkitWorkerGlobals.jsMolCache[r]=e),"qmol"===o&&(globalThis.rdkitWorkerGlobals.jsQMolCache[r]=e))},e=({nbMols:r,nbQmols:e})=>{const o=globalThis.rdkitWorkerGlobals.jsMolCache?Object.keys(globalThis.rdkitWorkerGlobals.jsMolCache).length:0,l=globalThis.rdkitWorkerGlobals.jsQMolCache?Object.keys(globalThis.rdkitWorkerGlobals.jsQMolCache).length:0,a=globalThis.rdkitWorkerGlobals.maxJsMolsCached,i=l+e>a;o+r>a&&s(),i&&t()},o=e=>{if(globalThis.rdkitWorkerGlobals.jsMolCacheEnabled&&(globalThis.rdkitWorkerGlobals.jsMolCache||globalThis.rdkitWorkerGlobals.jsQMolCache))for(const{structure:o,jsMol:l,molType:a}of e)if(l)try{r(o,l,a)}catch(r){console.error("@iktos-oss/rdkit-provider: failed while storing molecules in cahce",r),console.info("@iktos-oss/rdkit-provider: clearing cache"),"mol"===a?s():t()}},l=(r,e)=>r.map((r=>((r,e)=>{if(!globalThis.rdkitWorkerGlobals.jsMolCacheEnabled||!globalThis.rdkitWorkerGlobals.jsMolCache&&!globalThis.rdkitWorkerGlobals.jsQMolCache)return null;if("mol"===e)return globalThis.rdkitWorkerGlobals.jsMolCache?globalThis.rdkitWorkerGlobals.jsMolCache[r]:null;if("qmol"===e)return globalThis.rdkitWorkerGlobals.jsQMolCache?globalThis.rdkitWorkerGlobals.jsQMolCache[r]:null;throw new Error(`@iktos-oss/rdkit-provider unkown molType=${e} passed to getJSMolFromCache`)})(r,e))),s=()=>{if(globalThis.rdkitWorkerGlobals?.jsMolCache)for(const[r,e]of Object.entries(globalThis.rdkitWorkerGlobals.jsMolCache))try{e.delete(),delete globalThis.rdkitWorkerGlobals.jsMolCache[r]}catch{}},t=()=>{if(globalThis.rdkitWorkerGlobals?.jsQMolCache)for(const[r,e]of Object.entries(globalThis.rdkitWorkerGlobals.jsQMolCache))try{e.delete(),delete globalThis.rdkitWorkerGlobals.jsQMolCache[r]}catch{}},a=()=>{s(),t()},i=(r,s)=>{if(!s)return[];e({nbMols:r.length,nbQmols:0});const t=l(r,"mol").map(((e,o)=>e||((r,e)=>{const o={removeHs:globalThis.rdkitWorkerGlobals.removeHs,kekulize:globalThis.rdkitWorkerGlobals.kekulize};return e.get_mol(r,JSON.stringify(o))||(console.error("@iktos-oss/rdkit-provider: failed to get mol for smiles = ",r),null)})(r[o],s)));return o(t.map(((e,o)=>({structure:r[o],jsMol:e,molType:"mol"})))),t},n=(r,e)=>{try{return i(r,e)}catch(o){return console.error("@iktos-oss/rdkit-provider: caught error during get_molecules",o),console.info("@iktos-oss/rdkit-provider: clearing cache"),a(),i(r,e)}},c=(r,s)=>{if(!s)return[];e({nbMols:0,nbQmols:r.length});const t=l(r,"qmol").map(((e,o)=>e||((r,e)=>e.get_qmol(r)||(console.error("@iktos-oss/rdkit-provider: failed to get qmol for structure =",r),null))(r[o],s)));return o(t.map(((e,o)=>({structure:r[o],jsMol:e,molType:"qmol"})))),t},d=(r,e)=>{try{return c(r,e)}catch(o){return console.error(o),a(),c(r,e)}},k=r=>{if(!globalThis.rdkitWorkerGlobals.jsMolCacheEnabled)for(const e of r)e?.delete()},u=({smiles:r,drawingDetails:e,alignmentDetails:o})=>{const l=n(o?[r,o.molBlock]:[r],globalThis.workerRDKit),[s]=l;if(!s)return null;if(o){const[r,e]=l;if(!e)return null;s.generate_aligned_coords(e,JSON.stringify({useCoordGen:globalThis.rdkitWorkerGlobals.preferCoordgen}))}const t=e?JSON.stringify(e):"",a=s.get_svg_with_highlights(t);return o&&s.set_new_coords(globalThis.rdkitWorkerGlobals.preferCoordgen),k(l),a},h=({smarts:r,width:e,height:o})=>{const[l]=d([r],globalThis.workerRDKit);if(!l)return null;const s=l.get_svg(e,o);return k([l]),s};function b({smiles:r,returnFullDetails:e}){const[o]=n([r],globalThis.workerRDKit);if(!o)return null;const l=JSON.parse(o.get_descriptors());return k([o]),e?l:{numAtoms:l.NumHeavyAtoms,numRings:l.NumRings}}const g=({structure:r,useQMol:e=!1})=>p({moleculeString:r,targetNotation:e?"smarts":"smiles",useQMol:e,sourceNotation:void 0}),m=r=>{if(!r)return!1;const[e]=n([r],globalThis.workerRDKit);if(!e)return!1;const o=e.is_valid();return k([e]),o},T=r=>{if(!r)return!1;const[e]=d([r],globalThis.workerRDKit);if(!e)return!1;const o=e.is_valid();return k([e]),o},f=({smiles:r,substructure:e})=>{const[o]=n([r],globalThis.workerRDKit),[l]=d([e],globalThis.workerRDKit);if(!o||!l)return!1;const s=JSON.parse(o.get_substruct_match(l)),t=!!s&&!!Object.keys(s).length;return k([o,l]),t},_=r=>{if(!r.includes("M END"))return!1;const[e]=n([r],globalThis.workerRDKit);if(!e)return!1;try{return e.is_valid()}finally{k([e])}},p=({moleculeString:r,targetNotation:e,sourceNotation:o,useQMol:l})=>{const s=!!l||void 0===l&&"smarts"===o;if(null!=o){if(o===e)throw new Error("@iktos-oss/rdkit-provider: source and target notations must differ");if(!E(r,o))throw new Error("@iktos-oss/rdkit-provider: molecule string not valid")}const[t]=s?d([r],globalThis.workerRDKit):n([r],globalThis.workerRDKit);if(!t)return null;try{return t[`get_${e}`]()}catch(r){throw console.error(r),new Error("@iktos-oss/rdkit-provider: target notation not implemented")}finally{k([t])}},y=(r,e)=>{const[o]=n([r],globalThis.workerRDKit);if(!o)return null;try{return void 0!==e?o.get_new_coords(e):o.get_new_coords()}finally{k([o])}},C=r=>{const[e]=n([r],globalThis.workerRDKit);if(!e)return null;try{const r=e.remove_hs();return y(r,!1)}finally{k([e])}},M=r=>{const[e]=n([r],globalThis.workerRDKit);if(!e)return null;try{let r=e.add_hs();return r=y(r,!1),r}finally{k([e])}},w=r=>{const[e]=n([r],globalThis.workerRDKit);if(!e)throw new Error("@iktos-oss/rdkit-provider: mol is null");try{const r=e.get_stereo_tags(),{CIP_atoms:o,CIP_bonds:l}=JSON.parse(r);return{CIP_atoms:o,CIP_bonds:l}}catch(r){throw console.error(r),new Error("@iktos-oss/rdkit-provider: could not get stereo tags")}finally{k([e])}},E=(r,e)=>{switch(e){case"molblock":return _(r);case"smiles":return m(r);case"smarts":return T(r);default:throw new Error(`@iktos-oss/rdkit-provider: validate ${e} not implemented`)}};addEventListener("message",(async({data:r})=>{let e;switch(r.actionType){case"INIT_RDKIT_MODULE":await(async({rdkitPath:r,preferCoordgen:e,removeHs:o,kekulize:l,cache:s={}})=>{if((({cache:r,preferCoordgen:e,removeHs:o,kekulize:l})=>{const{enableJsMolCaching:s,maxJsMolsCached:t}=r;globalThis.rdkitWorkerGlobals={jsMolCacheEnabled:!!s,jsMolCache:s?{}:null,jsQMolCache:s?{}:null,maxJsMolsCached:t??150,preferCoordgen:e,removeHs:o,kekulize:l}})({cache:s,preferCoordgen:e,removeHs:o,kekulize:l}),globalThis.workerRDKit)return;const t=new URL(r||"/RDKit_minimal.js",globalThis.origin);importScripts(t),globalThis.initRDKitModule&&(globalThis.workerRDKit=await globalThis.initRDKitModule(),globalThis.workerRDKit.prefer_coordgen(e))})(r.payload);break;case"GET_MOLECULE_DETAILS":e=b({smiles:r.payload.smiles,returnFullDetails:!0});break;case"DEPRECATED_GET_MOLECULE_DETAILS":console.warn("[DEPRECATED] Using deprecated molecule details retrieval. Please update to the full details API by passing returnFullDetails=true, careful numAtom is now NumHeavyAtom and not NumAtom."),e=b({smiles:r.payload.smiles,returnFullDetails:!1});break;case"GET_CANONICAL_FORM_FOR_STRUCTURE":e={canonicalForm:g(r.payload)};break;case"IS_CHIRAL":e=(r=>{const[e]=n([r],globalThis.workerRDKit);if(!e)throw new Error("@iktos-oss/rdkit-provider: Failed to instanciate molecule");try{return e.get_smiles(JSON.stringify({doIsomericSmiles:!1}))!==e.get_smiles(JSON.stringify({doIsomericSmiles:!0}))}finally{k([e])}})(r.payload.smiles);break;case"GET_MORGAN_FP":e=(({smiles:r,options:e})=>{const[o]=n([r],globalThis.workerRDKit);if(!o)throw new Error("@iktos-oss/rdkit-provider: Failed to instanciate molecule");try{return e?o.get_morgan_fp(JSON.stringify(e)):o.get_morgan_fp()}finally{k([o])}})(r.payload);break;case"GET_SVG":e={svg:u(r.payload)};break;case"GET_SVG_FROM_SMARTS":e={svg:h(r.payload)};break;case"IS_VALID_SMILES":e={isValid:m(r.payload.smiles)};break;case"IS_VALID_SMARTS":e={isValid:T(r.payload.smarts)};break;case"HAS_MATCHING_SUBSTRUCTURE":e={matching:f(r.payload)};break;case"GET_SUBSTRUCTURE_MATCH":e=(({structure:r,substructure:e})=>{const[o]=n([r],globalThis.workerRDKit),[l]=d([e],globalThis.workerRDKit);if(!o||!l)return null;const{atoms:s,bonds:t}=JSON.parse(o.get_substruct_match(l));return k([o,l]),{matchingAtoms:s,matchingBonds:t}})(r.payload);break;case"IS_VALID_MOLBLOCK":e={isValid:_(r.payload.mdl)};break;case"CONVERT_MOL_NOTATION":e={structure:p(r.payload)};break;case"ADD_HS":e={mdl:M(r.payload.structure)};break;case"REMOVE_HS":e={mdl:C(r.payload.structure)};break;case"GET_NEW_COORDS":e={mdl:y(r.payload.structure,r.payload.useCoordGen)};break;case"GET_STEREO_TAGS":e={...w(r.payload.structure)};break;case"TERMINATE":a(),self.close();break;default:return}var o;postMessage({actionType:(o=r.actionType,o+"_LOCAL_RESPONSE"),payload:e,key:r.key})}))})();