diff --git a/lib/document_stores/googledatastore.js b/lib/document_stores/googledatastore.js new file mode 100644 index 0000000..331b047 --- /dev/null +++ b/lib/document_stores/googledatastore.js @@ -0,0 +1,92 @@ +/*global require,module,process*/ + +const datastore = require('@google-cloud/datastore'); +const winston = require('winston'); + +class GoogleDatastoreDocumentStore { + + // Create a new store with options + constructor(options) { + this.kind = "Haste"; + this.expire = options.expire; + this.datastore = new Datastore(); + } + + // Save file in a key + set(key, data, callback, skipExpire) { + var now = new Date(); + var expireTime = skipExpire ? null : new Date(now.getTime() + this.expire * 1000; + + var taskKey = this.datastore.key([this.kind, key]) + var task = { + key: taskKey, + data: [ + { + name: 'value', + value: data, + excludeFromIndexes: true + }, + { + name: 'expiration', + value: expireTime + } + ] + }; + + this.datastore.insert(task).then(() => { + callback(true); + }) + .catch(err => { + callback(false); + }); + } + + // Get a file from a key + get(key, callback, skipExpire) { + var taskKey = this.datastore.key([this.kind, key]) + + this.datastore.get(taskKey).then((entity) => { + + if (skipExpire) { + callback(entity[0]["value"]); + } + else { + // check for expiry + if (entity[0]["expiration"] != null && entity[0]["expiration"] < new Date()) { + winston.info("document expired", {key: key}); + callback(false); + } + else { + + // update expiry + var now = new Date(); + var task = { + key: taskKey, + data: [ + { + name: 'value', + value: entity[0]["value"], + excludeFromIndexes: true + }, + { + name: 'expiration', + value: new Date(now.getTime() + this.expire * 1000; + } + ] + }; + this.datastore.update(task).then(() => { + }) + .catch(err => { + winston.error("failed to update expiration", {error: err}); + }); + callback(entity[0]["value"]); + } + } + }) + .catch(err => { + winston.error("Error retrieving value from Google Datastore", {error: err}); + callback(false); + }); +} + +module.exports = GoogleDatastoreDocumentStore;