feat: a pretty decent, tested, working SDK + CLI
[crowdnode.js/.git] / lib / cookies.js
diff --git a/lib/cookies.js b/lib/cookies.js
new file mode 100644 (file)
index 0000000..814a169
--- /dev/null
@@ -0,0 +1,47 @@
+"use strict";
+
+/** @type CookieStore */
+let Cookies = module.exports;
+
+let Cookie = require("tough-cookie");
+//@ts-ignore TODO
+//let FileCookieStore = require("@root/file-cookie-store");
+//let cookies_store = new FileCookieStore("./cookie.txt", { auto_sync: false });
+let jar = new Cookie.CookieJar(/*cookies_store*/);
+jar.setCookieAsync = require("util").promisify(jar.setCookie);
+jar.getCookiesAsync = require("util").promisify(jar.getCookies);
+//cookies_store.saveAsync = require("util").promisify(cookies_store.save);
+
+/**
+ * @param {String} url
+ * @param {import('http').IncomingMessage} resp
+ * @returns {Promise<void>}
+ */
+Cookies.set = async function _setCookie(url, resp) {
+  let cookies;
+  if (resp.headers["set-cookie"]) {
+    if (Array.isArray(resp.headers["set-cookie"])) {
+      cookies = resp.headers["set-cookie"].map(Cookie.parse);
+    } else {
+      cookies = [Cookie.parse(resp.headers["set-cookie"])];
+    }
+  }
+
+  // let Cookie = //require('set-cookie-parser');
+  // Cookie.parse(resp, { decodeValues: true });
+  await Promise.all(
+    cookies.map(async function (cookie) {
+      //console.log('DEBUG cookie:', cookie.toJSON());
+      await jar.setCookieAsync(cookie, url, { now: new Date() });
+    }),
+  );
+  //await cookies_store.saveAsync();
+};
+
+/**
+ * @param {String} url
+ * @returns {Promise<String>}
+ */
+Cookies.get = async function _getCookie(url) {
+  return (await jar.getCookiesAsync(url)).toString();
+};