{"id":1482,"date":"2023-05-10T15:46:29","date_gmt":"2023-05-10T14:46:29","guid":{"rendered":"https:\/\/marketaylor.synology.me\/?p=1482"},"modified":"2023-06-22T08:46:00","modified_gmt":"2023-06-22T07:46:00","slug":"nodejs-mqi-reimplementation","status":"publish","type":"post","link":"https:\/\/marketaylor.synology.me\/?p=1482","title":{"rendered":"MQI Node.js library: an experimental reimplementation"},"content":{"rendered":"\n<p>The <a href=\"https:\/\/www.npmjs.com\/package\/ibmmq\" target=\"_blank\" rel=\"noreferrer noopener\">MQI library<\/a> for Node.js applications first appeared in 2017. One of the first articles about it is <a href=\"https:\/\/marketaylor.synology.me\/?p=505\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. Regular maintenance and updates to the library ensured it kept up with newer MQ and NodeJS features. But it seemed time to do a more extensive rewrite of the package, and that&#8217;s why I&#8217;m writing this article.<s> I&#8217;ve put an <a href=\"https:\/\/github.com\/ibmmqmet\/mq-mqi-nodejs\" target=\"_blank\" rel=\"noreferrer noopener\">experimental reimplementation on GitHub<\/a> of the library for you to try out, before it goes into the mainstream release. Originally in the &#8220;napi&#8221; branch, it&#8217;s been promoted to the master branch.<\/s><\/p>\n\n\n\n<p><strong>Update<\/strong>: This new version is now on <code>npm<\/code> as the <code>ibmmq 2.0.0<\/code> release and has been merged into the main GitHub branch.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">What and Why?<\/h3>\n\n\n\n<p>Essentially, the library is now in two related pieces &#8211; one provides the Node.js API for applications, and a second C++ layer handles the link to the underlying C MQI libraries. The original implementation relied on external packages to do that C++ work; but I wanted to remove those. <\/p>\n\n\n\n<p>This new version has at least one definite benefit. And there are several further possible benefits, that will hopefully prove to be true.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>The external dependency packages (various libraries with <code>ffi<\/code> and\/or <code>ref<\/code> in their name) were collecting a number of issues on their GitHub repositories. It is clear that, although they work for now, there is not a lot of attention to their maintenance. It would not surprise me if they stop working at some point. I know I reported a bug several years ago that still exists. I could have taken a fork of those libraries to do my own updates, but decided it was cleaner to start over with something specific to MQ requirements. Reducing dependencies is always a good thing anyway, even though Node.js seems to encourage proliferation.<\/li><li>Better performance. This remains to be tested. But it feels plausible that copying values into and out of JavaScript objects and variables could be faster when we know exactly what we need to do. Generic transform methods might appear simpler, but they have a couple of layers of additional translation.<\/li><li>Support for more platforms. With the <code>libffi<\/code> approach, it was impossible to support some other platforms. In particular z\/OS, where I know there has been some interest in writing Node.js applications for MQ. Rewriting to use a core Node.js interface, known as <a href=\"https:\/\/nodejs.org\/api\/n-api.html\" target=\"_blank\" rel=\"noreferrer noopener\">Node-API<\/a> (or N-API), at least makes it plausible that we could extend platforms. <\/li><li>Truly asynchronous MQGET processing. Again, this is not in the new library today. But it was another impossible thing in the old library. The way that threads work in the Node.js engine was incompatible with the threading model for the MQCTL\/MQCB callback approach. So the current pseudo-asynchronous MQGET uses a set of polling loops and heuristics to pretend it&#8217;s using those services. These help to a) share resources fairly and b) allow other work to be done in the application. But with more complete control of the C++ work, and true multi-threading capabilities outside of the application thread, I can imagine ways in which I might be able to get rid of the polling.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to try it out<\/h2>\n\n\n\n<p>One thing I&#8217;ve been careful about is to keep the same public API as the older implementation. So if you have existing MQ applications using the <code>ibmmq<\/code>library, then they ought to continue to work unchanged. To use this trial version, all you need to do is change your <em>package.json<\/em> file to point directly at a GitHub repository and branch. So instead of<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">  \"dependencies\": {\n    \"ibmmq\": \"&gt;=1.0.5\"\n  }<\/pre>\n\n\n\n<p>you would, for now, have<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">  \"dependencies\": {\n    \"ibmmq\": \"github:ibmmqmet\/mq-mqi-nodejs\"\n  }<\/pre>\n\n\n\n<p>I&#8217;ve not put the new library into the <code>npm<\/code> repository yet, but <code>npm install<\/code> recognises this dependency format and will pull in the tree directly (albeit sometimes slowly) from the GitHub branch. <\/p>\n\n\n\n<p>Note that this style of dependency naming with a branch does not always pull in the latest version, because the current git commit level gets embedded in local meta-data. On a &#8220;reinstall&#8221;, that same commit level is reused by default. To force the newest commit to the branch to be used, you should clean out cached information:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">rm -f package-lock.json\nrm -rf node_modules\nnpm cache ls | grep ibmmq | xargs npm cache clean --force\n# And now we can do the reinstall.\nnpm install<\/pre>\n\n\n\n<p>I have tested on Linux(x64), Windows, MacOS and AIX. All work provided you have appropriate tools installed for the C++ compilations required. Using the older library <strong>probably <\/strong>required the compilers too, but not in all circumstances. The sample programs in the repository have all been tried, and they ran without change.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The future<\/h3>\n\n\n\n<p>Assuming this new version works as intended, there are a number of things I hope to do with it or collaborate on:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Release it to <code>npm<\/code>, probably as a V2.0 level even though it&#8217;s the same public API as the current V1.<\/li><li>Use something like <code>prebuildify<\/code>to reduce the need to compile C++ code during the <code>npm install<\/code>. This might be an chance to also play with GitHub Actions, so another learning opportunity.<\/li><li>More extensive testing including performance checks, and making sure there are no memory leaks. One concern with the <code>ref<\/code> packages was that they might have leakage; hard to verify but I think this new version is at least easier to debug as it does not need to provide all the generic function.<\/li><li>Test the Typescript layer &#8211; since there&#8217;s been no change to the Node.JS API, the current Typescript bindings ought to work. But it needs verification.<\/li><li>Look more at a true async MQGET &#8211; the code&#8217;s been restructured to at least make that a bit simpler to work on and replace.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Summary<\/h3>\n\n\n\n<p>I&#8217;ve released this library early in its development to encourage people to try it out, and report issues or provide enhancements. Please give it a go. Comments can be added to this post, or as issues on the <a href=\"https:\/\/github.com\/ibm-messaging\/mq-mqi-nodejs\" target=\"_blank\" rel=\"noreferrer noopener\">main library<\/a> repository.<\/p>\n\n\n\n<p>[This post also made available <a href=\"https:\/\/community.ibm.com\/community\/user\/integration\/blogs\/mark-taylor\/2023\/05\/10\/mqi-nodejs-library-experimental-reimplementation\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> on the IBM MQ Community site, for a broader audience.]<\/p>\n<p class=\"last-modified\" style=\"border:1px solid;padding: 10px;\">This post was last updated on June 22nd, 2023 at 08:46 am<\/p>","protected":false},"excerpt":{"rendered":"<p>The MQI library for Node.js applications first appeared in 2017. One of the first articles about it is here. Regular maintenance and updates to the library ensured it kept up with newer MQ and NodeJS features. But it seemed time to do a more extensive rewrite of the package, and that&#8217;s why I&#8217;m writing this &hellip; <a href=\"https:\/\/marketaylor.synology.me\/?p=1482\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;MQI Node.js library: an experimental reimplementation&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":510,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[35,20,63],"class_list":["post-1482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mq","tag-ibmmq","tag-mqseries","tag-nodejs"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MQI Node.js library: an experimental reimplementation - Mark Taylor&#039;s Blog<\/title>\n<meta name=\"description\" content=\"A redesign of the IBM MQ Node.js library has real and potential benefits. This shows how to test it before merging into the main package.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/marketaylor.synology.me\/?p=1482\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MQI Node.js library: an experimental reimplementation - Mark Taylor&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"A redesign of the IBM MQ Node.js library has real and potential benefits. This shows how to test it before merging into the main package.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marketaylor.synology.me\/?p=1482\" \/>\n<meta property=\"og:site_name\" content=\"Mark Taylor&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-10T14:46:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-22T07:46:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"256\" \/>\n\t<meta property=\"og:image:height\" content=\"156\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@marketaylor\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mark\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482\"},\"author\":{\"name\":\"Mark\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"headline\":\"MQI Node.js library: an experimental reimplementation\",\"datePublished\":\"2023-05-10T14:46:29+00:00\",\"dateModified\":\"2023-06-22T07:46:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482\"},\"wordCount\":977,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/nodejs-logo.png\",\"keywords\":[\"ibmmq\",\"mqseries\",\"nodejs\"],\"articleSection\":[\"IBM MQ\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482\",\"name\":\"MQI Node.js library: an experimental reimplementation - Mark Taylor&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/nodejs-logo.png\",\"datePublished\":\"2023-05-10T14:46:29+00:00\",\"dateModified\":\"2023-06-22T07:46:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\"},\"description\":\"A redesign of the IBM MQ Node.js library has real and potential benefits. This shows how to test it before merging into the main package.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#primaryimage\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/nodejs-logo.png\",\"contentUrl\":\"https:\\\/\\\/marketaylor.synology.me\\\/wp-content\\\/uploads\\\/Pictures\\\/2019\\\/11\\\/nodejs-logo.png\",\"width\":256,\"height\":156},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/?p=1482#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/marketaylor.synology.me\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MQI Node.js library: an experimental reimplementation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#website\",\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/\",\"name\":\"Mark Taylor&#039;s Blog\",\"description\":\"Messaging, Music and Moving Around\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/marketaylor.synology.me\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/marketaylor.synology.me\\\/#\\\/schema\\\/person\\\/2d6f4113ff54187023e20c20186bbb3c\",\"name\":\"Mark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g\",\"caption\":\"Mark\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/marketaylor\"],\"url\":\"https:\\\/\\\/marketaylor.synology.me\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MQI Node.js library: an experimental reimplementation - Mark Taylor&#039;s Blog","description":"A redesign of the IBM MQ Node.js library has real and potential benefits. This shows how to test it before merging into the main package.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/marketaylor.synology.me\/?p=1482","og_locale":"en_GB","og_type":"article","og_title":"MQI Node.js library: an experimental reimplementation - Mark Taylor&#039;s Blog","og_description":"A redesign of the IBM MQ Node.js library has real and potential benefits. This shows how to test it before merging into the main package.","og_url":"https:\/\/marketaylor.synology.me\/?p=1482","og_site_name":"Mark Taylor&#039;s Blog","article_published_time":"2023-05-10T14:46:29+00:00","article_modified_time":"2023-06-22T07:46:00+00:00","og_image":[{"width":256,"height":156,"url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png","type":"image\/png"}],"author":"Mark","twitter_card":"summary_large_image","twitter_creator":"@marketaylor","twitter_misc":{"Written by":"Mark","Estimated reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marketaylor.synology.me\/?p=1482#article","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/?p=1482"},"author":{"name":"Mark","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"headline":"MQI Node.js library: an experimental reimplementation","datePublished":"2023-05-10T14:46:29+00:00","dateModified":"2023-06-22T07:46:00+00:00","mainEntityOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1482"},"wordCount":977,"commentCount":0,"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=1482#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png","keywords":["ibmmq","mqseries","nodejs"],"articleSection":["IBM MQ"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marketaylor.synology.me\/?p=1482#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marketaylor.synology.me\/?p=1482","url":"https:\/\/marketaylor.synology.me\/?p=1482","name":"MQI Node.js library: an experimental reimplementation - Mark Taylor&#039;s Blog","isPartOf":{"@id":"https:\/\/marketaylor.synology.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/marketaylor.synology.me\/?p=1482#primaryimage"},"image":{"@id":"https:\/\/marketaylor.synology.me\/?p=1482#primaryimage"},"thumbnailUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png","datePublished":"2023-05-10T14:46:29+00:00","dateModified":"2023-06-22T07:46:00+00:00","author":{"@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c"},"description":"A redesign of the IBM MQ Node.js library has real and potential benefits. This shows how to test it before merging into the main package.","breadcrumb":{"@id":"https:\/\/marketaylor.synology.me\/?p=1482#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marketaylor.synology.me\/?p=1482"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/marketaylor.synology.me\/?p=1482#primaryimage","url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png","contentUrl":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png","width":256,"height":156},{"@type":"BreadcrumbList","@id":"https:\/\/marketaylor.synology.me\/?p=1482#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/marketaylor.synology.me\/"},{"@type":"ListItem","position":2,"name":"MQI Node.js library: an experimental reimplementation"}]},{"@type":"WebSite","@id":"https:\/\/marketaylor.synology.me\/#website","url":"https:\/\/marketaylor.synology.me\/","name":"Mark Taylor&#039;s Blog","description":"Messaging, Music and Moving Around","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/marketaylor.synology.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/marketaylor.synology.me\/#\/schema\/person\/2d6f4113ff54187023e20c20186bbb3c","name":"Mark","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9a5ae091c43730194cba7cabb5d65c1dc3f48d05caaddec6ff2319a1ce66376f?s=96&d=mm&r=g","caption":"Mark"},"sameAs":["https:\/\/x.com\/marketaylor"],"url":"https:\/\/marketaylor.synology.me\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/marketaylor.synology.me\/wp-content\/uploads\/Pictures\/2019\/11\/nodejs-logo.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1482"}],"version-history":[{"count":13,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1482\/revisions"}],"predecessor-version":[{"id":1509,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/posts\/1482\/revisions\/1509"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=\/wp\/v2\/media\/510"}],"wp:attachment":[{"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marketaylor.synology.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}