You've already forked hastebin-ansi
mirror of
https://github.com/armbian/hastebin-ansi.git
synced 2026-01-06 12:30:55 -08:00
remove old javascript codebase
This commit is contained in:
committed by
M. Efe Çetin
parent
df51a4a6f3
commit
30c44c211b
@@ -1,2 +0,0 @@
|
|||||||
**/*.min.js
|
|
||||||
config.json
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"es6": true,
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"rules": {
|
|
||||||
"indent": [
|
|
||||||
"error",
|
|
||||||
2
|
|
||||||
],
|
|
||||||
"linebreak-style": [
|
|
||||||
"error",
|
|
||||||
"unix"
|
|
||||||
],
|
|
||||||
"quotes": [
|
|
||||||
"error",
|
|
||||||
"single"
|
|
||||||
],
|
|
||||||
"semi": [
|
|
||||||
"error",
|
|
||||||
"always"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
53
Dockerfile
53
Dockerfile
@@ -1,53 +0,0 @@
|
|||||||
FROM node:16
|
|
||||||
|
|
||||||
RUN mkdir -p /usr/src/app && \
|
|
||||||
chown node:node /usr/src/app
|
|
||||||
|
|
||||||
USER node:node
|
|
||||||
|
|
||||||
WORKDIR /usr/src/app
|
|
||||||
|
|
||||||
COPY --chown=node:node package*.json .
|
|
||||||
|
|
||||||
RUN npm ci
|
|
||||||
|
|
||||||
COPY --chown=node:node . .
|
|
||||||
|
|
||||||
ENV LOGGING_LEVEL=verbose \
|
|
||||||
LOGGING_TYPE=Console \
|
|
||||||
LOGGING_COLORIZE=true
|
|
||||||
|
|
||||||
ENV HOST=0.0.0.0\
|
|
||||||
PORT=7777\
|
|
||||||
KEY_LENGTH=10\
|
|
||||||
MAX_LENGTH=10000000\
|
|
||||||
STATIC_MAX_AGE=3
|
|
||||||
|
|
||||||
ENV KEYGENERATOR_TYPE=phonetic \
|
|
||||||
KEYGENERATOR_KEYSPACE=""
|
|
||||||
|
|
||||||
ENV RATELIMITS_NORMAL_TOTAL_REQUESTS=500\
|
|
||||||
RATELIMITS_NORMAL_EVERY_MILLISECONDS=60000 \
|
|
||||||
RATELIMITS_WHITELIST_TOTAL_REQUESTS="" \
|
|
||||||
RATELIMITS_WHITELIST_EVERY_MILLISECONDS="" \
|
|
||||||
# comma separated list for the whitelisted \
|
|
||||||
RATELIMITS_WHITELIST=example1.whitelist,example2.whitelist \
|
|
||||||
\
|
|
||||||
RATELIMITS_BLACKLIST_TOTAL_REQUESTS="" \
|
|
||||||
RATELIMITS_BLACKLIST_EVERY_MILLISECONDS="" \
|
|
||||||
# comma separated list for the blacklisted \
|
|
||||||
RATELIMITS_BLACKLIST=example1.blacklist,example2.blacklist
|
|
||||||
ENV DOCUMENTS="about=./about.md"
|
|
||||||
|
|
||||||
EXPOSE ${PORT}
|
|
||||||
STOPSIGNAL SIGINT
|
|
||||||
ENTRYPOINT [ "bash", "docker-entrypoint.sh" ]
|
|
||||||
|
|
||||||
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s \
|
|
||||||
--retries=3 CMD [ "sh", "-c", "echo -n 'curl localhost:7777... '; \
|
|
||||||
(\
|
|
||||||
curl -sf localhost:7777 > /dev/null\
|
|
||||||
) && echo OK || (\
|
|
||||||
echo Fail && exit 2\
|
|
||||||
)"]
|
|
||||||
CMD ["npm", "start"]
|
|
||||||
32
config.json
32
config.json
@@ -1,32 +0,0 @@
|
|||||||
{
|
|
||||||
"host": "0.0.0.0",
|
|
||||||
"port": 7777,
|
|
||||||
"keyLength": 10,
|
|
||||||
"maxLength": 4000000,
|
|
||||||
"staticMaxAge": 3,
|
|
||||||
"recompressStaticAssets": true,
|
|
||||||
"logging": [
|
|
||||||
{
|
|
||||||
"level": "verbose",
|
|
||||||
"type": "Console",
|
|
||||||
"colorize": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"keyGenerator": {
|
|
||||||
"type": "phonetic"
|
|
||||||
},
|
|
||||||
"rateLimits": {
|
|
||||||
"categories": {
|
|
||||||
"normal": {
|
|
||||||
"totalRequests": 500,
|
|
||||||
"every": 60000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"storage": {
|
|
||||||
"type": "file"
|
|
||||||
},
|
|
||||||
"documents": {
|
|
||||||
"about": "./about.md"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
const {
|
|
||||||
HOST,
|
|
||||||
PORT,
|
|
||||||
KEY_LENGTH,
|
|
||||||
MAX_LENGTH,
|
|
||||||
STATIC_MAX_AGE,
|
|
||||||
RECOMPRESS_STATIC_ASSETS,
|
|
||||||
STORAGE_TYPE,
|
|
||||||
STORAGE_HOST,
|
|
||||||
STORAGE_PORT,
|
|
||||||
STORAGE_EXPIRE_SECONDS,
|
|
||||||
STORAGE_DB,
|
|
||||||
STORAGE_AWS_BUCKET,
|
|
||||||
STORAGE_AWS_REGION,
|
|
||||||
STORAGE_PASSWORD,
|
|
||||||
STORAGE_USERNAME,
|
|
||||||
STORAGE_FILEPATH,
|
|
||||||
LOGGING_LEVEL,
|
|
||||||
LOGGING_TYPE,
|
|
||||||
LOGGING_COLORIZE,
|
|
||||||
KEYGENERATOR_TYPE,
|
|
||||||
KEY_GENERATOR_KEYSPACE,
|
|
||||||
RATE_LIMITS_NORMAL_TOTAL_REQUESTS,
|
|
||||||
RATE_LIMITS_NORMAL_EVERY_MILLISECONDS,
|
|
||||||
RATE_LIMITS_WHITELIST_TOTAL_REQUESTS,
|
|
||||||
RATE_LIMITS_WHITELIST_EVERY_MILLISECONDS,
|
|
||||||
RATE_LIMITS_WHITELIST,
|
|
||||||
RATE_LIMITS_BLACKLIST_TOTAL_REQUESTS,
|
|
||||||
RATE_LIMITS_BLACKLIST_EVERY_MILLISECONDS,
|
|
||||||
RATE_LIMITS_BLACKLIST,
|
|
||||||
DOCUMENTS,
|
|
||||||
} = process.env;
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
host: HOST,
|
|
||||||
port: Number(PORT),
|
|
||||||
|
|
||||||
keyLength: Number(KEY_LENGTH),
|
|
||||||
|
|
||||||
maxLength: Number(MAX_LENGTH),
|
|
||||||
|
|
||||||
staticMaxAge: Number(STATIC_MAX_AGE),
|
|
||||||
|
|
||||||
recompressStaticAssets: RECOMPRESS_STATIC_ASSETS,
|
|
||||||
|
|
||||||
logging: [
|
|
||||||
{
|
|
||||||
level: LOGGING_LEVEL,
|
|
||||||
type: LOGGING_TYPE,
|
|
||||||
colorize: LOGGING_COLORIZE,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
keyGenerator: {
|
|
||||||
type: KEYGENERATOR_TYPE,
|
|
||||||
keyspace: KEY_GENERATOR_KEYSPACE,
|
|
||||||
},
|
|
||||||
|
|
||||||
rateLimits: {
|
|
||||||
whitelist: RATE_LIMITS_WHITELIST ? RATE_LIMITS_WHITELIST.split(",") : [],
|
|
||||||
blacklist: RATE_LIMITS_BLACKLIST ? RATE_LIMITS_BLACKLIST.split(",") : [],
|
|
||||||
categories: {
|
|
||||||
normal: {
|
|
||||||
totalRequests: RATE_LIMITS_NORMAL_TOTAL_REQUESTS,
|
|
||||||
every: RATE_LIMITS_NORMAL_EVERY_MILLISECONDS,
|
|
||||||
},
|
|
||||||
whitelist:
|
|
||||||
RATE_LIMITS_WHITELIST_EVERY_MILLISECONDS ||
|
|
||||||
RATE_LIMITS_WHITELIST_TOTAL_REQUESTS
|
|
||||||
? {
|
|
||||||
totalRequests: RATE_LIMITS_WHITELIST_TOTAL_REQUESTS,
|
|
||||||
every: RATE_LIMITS_WHITELIST_EVERY_MILLISECONDS,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
blacklist:
|
|
||||||
RATE_LIMITS_BLACKLIST_EVERY_MILLISECONDS ||
|
|
||||||
RATE_LIMITS_BLACKLIST_TOTAL_REQUESTS
|
|
||||||
? {
|
|
||||||
totalRequests: RATE_LIMITS_WHITELIST_TOTAL_REQUESTS,
|
|
||||||
every: RATE_LIMITS_BLACKLIST_EVERY_MILLISECONDS,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
storage: {
|
|
||||||
type: STORAGE_TYPE,
|
|
||||||
host: STORAGE_HOST,
|
|
||||||
port: Number(STORAGE_PORT),
|
|
||||||
expire: Number(STORAGE_EXPIRE_SECONDS),
|
|
||||||
bucket: STORAGE_AWS_BUCKET,
|
|
||||||
region: STORAGE_AWS_REGION,
|
|
||||||
connectionUrl: `postgres://${STORAGE_USERNAME}:${STORAGE_PASSWORD}@${STORAGE_HOST}:${STORAGE_PORT}/${STORAGE_DB}`,
|
|
||||||
db: STORAGE_DB,
|
|
||||||
user: STORAGE_USERNAME,
|
|
||||||
password: STORAGE_PASSWORD,
|
|
||||||
path: STORAGE_FILEPATH,
|
|
||||||
},
|
|
||||||
|
|
||||||
documents: DOCUMENTS
|
|
||||||
? DOCUMENTS.split(",").reduce((acc, item) => {
|
|
||||||
const keyAndValueArray = item.replace(/\s/g, "").split("=");
|
|
||||||
return {...acc, [keyAndValueArray[0]]: keyAndValueArray[1]};
|
|
||||||
}, {})
|
|
||||||
: null,
|
|
||||||
};
|
|
||||||
|
|
||||||
console.log(JSON.stringify(config));
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# We use this file to translate environmental variables to .env files used by the application
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
node ./docker-entrypoint.js > ./config.json
|
|
||||||
|
|
||||||
exec "$@"
|
|
||||||
2
go.mod
2
go.mod
@@ -10,6 +10,7 @@ require (
|
|||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2
|
||||||
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874
|
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874
|
||||||
github.com/go-chi/chi/v5 v5.2.1
|
github.com/go-chi/chi/v5 v5.2.1
|
||||||
|
github.com/go-chi/httprate v0.14.1
|
||||||
github.com/jackc/pgx/v5 v5.7.2
|
github.com/jackc/pgx/v5 v5.7.2
|
||||||
github.com/prometheus/client_golang v1.21.1
|
github.com/prometheus/client_golang v1.21.1
|
||||||
github.com/redis/go-redis/v9 v9.7.1
|
github.com/redis/go-redis/v9 v9.7.1
|
||||||
@@ -54,7 +55,6 @@ require (
|
|||||||
github.com/docker/go-connections v0.5.0 // indirect
|
github.com/docker/go-connections v0.5.0 // indirect
|
||||||
github.com/docker/go-units v0.5.0 // indirect
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
github.com/go-chi/httprate v0.14.1 // indirect
|
|
||||||
github.com/go-logr/logr v1.4.1 // indirect
|
github.com/go-logr/logr v1.4.1 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
|
|||||||
@@ -1,218 +0,0 @@
|
|||||||
const winston = require('winston');
|
|
||||||
const Busboy = require('busboy');
|
|
||||||
|
|
||||||
// For handling serving stored documents
|
|
||||||
|
|
||||||
const DocumentHandler = function (options) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
this.keyLength = options.keyLength || DocumentHandler.defaultKeyLength;
|
|
||||||
this.maxLength = options.maxLength; // none by default
|
|
||||||
this.store = options.store;
|
|
||||||
this.keyGenerator = options.keyGenerator;
|
|
||||||
};
|
|
||||||
|
|
||||||
DocumentHandler.defaultKeyLength = 10;
|
|
||||||
|
|
||||||
// Handle retrieving a document
|
|
||||||
DocumentHandler.prototype.handleGet = function (request, response, config) {
|
|
||||||
const key = request.params.id.split('.')[0];
|
|
||||||
const skipExpire = !!config.documents[key];
|
|
||||||
|
|
||||||
this.store.get(key, function (ret) {
|
|
||||||
if (ret) {
|
|
||||||
winston.verbose('retrieved document', {key: key});
|
|
||||||
response.writeHead(200, {'content-type': 'application/json'});
|
|
||||||
if (request.method === 'HEAD') {
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
response.end(JSON.stringify({data: ret, key: key}));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
winston.warn('document not found', {key: key});
|
|
||||||
response.writeHead(404, {'content-type': 'application/json'});
|
|
||||||
if (request.method === 'HEAD') {
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
response.end(JSON.stringify({message: 'Document not found.'}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, skipExpire);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Handle retrieving the raw version of a document
|
|
||||||
DocumentHandler.prototype.handleRawGet = function (request, response, config) {
|
|
||||||
const key = request.params.id.split('.')[0];
|
|
||||||
const skipExpire = !!config.documents[key];
|
|
||||||
|
|
||||||
this.store.get(key, function (ret) {
|
|
||||||
if (ret) {
|
|
||||||
winston.verbose('retrieved raw document', {key: key});
|
|
||||||
response.writeHead(200, {'content-type': 'text/plain; charset=UTF-8'});
|
|
||||||
if (request.method === 'HEAD') {
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
response.end(ret);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
winston.warn('raw document not found', {key: key});
|
|
||||||
response.writeHead(404, {'content-type': 'application/json'});
|
|
||||||
if (request.method === 'HEAD') {
|
|
||||||
response.end();
|
|
||||||
} else {
|
|
||||||
response.end(JSON.stringify({message: 'Document not found.'}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, skipExpire);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Handle adding a new Document
|
|
||||||
DocumentHandler.prototype.handlePost = function (request, response) {
|
|
||||||
const _this = this;
|
|
||||||
let buffer = '';
|
|
||||||
let cancelled = false;
|
|
||||||
|
|
||||||
// What to do when done
|
|
||||||
const onSuccess = function () {
|
|
||||||
// Check length
|
|
||||||
if (_this.maxLength && buffer.length > _this.maxLength) {
|
|
||||||
cancelled = true;
|
|
||||||
winston.warn('document >maxLength', {maxLength: _this.maxLength});
|
|
||||||
response.writeHead(400, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({message: 'Document exceeds maximum length.'}));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// And then save if we should
|
|
||||||
_this.chooseKey(function (key) {
|
|
||||||
_this.store.set(key, buffer, function (res) {
|
|
||||||
if (res) {
|
|
||||||
winston.verbose('added document', {key: key});
|
|
||||||
response.writeHead(200, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({key: key}));
|
|
||||||
} else {
|
|
||||||
winston.verbose('error adding document');
|
|
||||||
response.writeHead(500, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({message: 'Error adding document.'}));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// If we should, parse a form to grab the data
|
|
||||||
const ct = request.headers['content-type'];
|
|
||||||
if (ct && ct.split(';')[0] === 'multipart/form-data') {
|
|
||||||
const busboy = new Busboy({headers: request.headers});
|
|
||||||
busboy.on('field', function (field_name, val) {
|
|
||||||
if (field_name === 'data') {
|
|
||||||
buffer = val;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
busboy.on('finish', function () {
|
|
||||||
onSuccess();
|
|
||||||
});
|
|
||||||
request.pipe(busboy);
|
|
||||||
// Otherwise, use our own and just grab flat data from POST body
|
|
||||||
} else {
|
|
||||||
request.on('data', function (data) {
|
|
||||||
buffer += data.toString();
|
|
||||||
});
|
|
||||||
request.on('end', function () {
|
|
||||||
if (cancelled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
onSuccess();
|
|
||||||
});
|
|
||||||
request.on('error', function (error) {
|
|
||||||
winston.error('connection error: ' + error.message);
|
|
||||||
response.writeHead(500, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({message: 'Connection error.'}));
|
|
||||||
cancelled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Handle adding a new Document
|
|
||||||
DocumentHandler.prototype.handlePutLog = function (request, response) {
|
|
||||||
const _this = this;
|
|
||||||
let buffer = '';
|
|
||||||
let cancelled = false;
|
|
||||||
|
|
||||||
// What to do when done
|
|
||||||
const onSuccess = function () {
|
|
||||||
// Check length
|
|
||||||
if (_this.maxLength && buffer.length > _this.maxLength) {
|
|
||||||
cancelled = true;
|
|
||||||
winston.warn('document >maxLength', {maxLength: _this.maxLength});
|
|
||||||
response.writeHead(400, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({message: 'Document exceeds maximum length.'}));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// And then save if we should
|
|
||||||
_this.chooseKey(function (key) {
|
|
||||||
_this.store.set(key, buffer, function (res) {
|
|
||||||
if (res) {
|
|
||||||
winston.verbose('added document', {key: key});
|
|
||||||
response.writeHead(200, {'content-type': 'text/plain'});
|
|
||||||
let logUrl = "https://" + request.headers['host'] + "/" + key;
|
|
||||||
response.end("\n" + logUrl + "\n\n");
|
|
||||||
} else {
|
|
||||||
winston.verbose('error adding document');
|
|
||||||
response.writeHead(500, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({message: 'Error adding document.'}));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// If we should, parse a form to grab the data
|
|
||||||
const ct = request.headers['content-type'];
|
|
||||||
if (ct && ct.split(';')[0] === 'multipart/form-data') {
|
|
||||||
const busboy = new Busboy({headers: request.headers});
|
|
||||||
busboy.on('field', function (field_name, val) {
|
|
||||||
if (field_name === 'data') {
|
|
||||||
buffer = val;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
busboy.on('finish', function () {
|
|
||||||
onSuccess();
|
|
||||||
});
|
|
||||||
request.pipe(busboy);
|
|
||||||
// Otherwise, use our own and just grab flat data from POST body
|
|
||||||
} else {
|
|
||||||
request.on('data', function (data) {
|
|
||||||
buffer += data.toString();
|
|
||||||
});
|
|
||||||
request.on('end', function () {
|
|
||||||
if (cancelled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
onSuccess();
|
|
||||||
});
|
|
||||||
request.on('error', function (error) {
|
|
||||||
winston.error('connection error: ' + error.message);
|
|
||||||
response.writeHead(500, {'content-type': 'application/json'});
|
|
||||||
response.end(JSON.stringify({message: 'Connection error.'}));
|
|
||||||
cancelled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Keep choosing keys until one isn't taken
|
|
||||||
DocumentHandler.prototype.chooseKey = function (callback) {
|
|
||||||
const key = this.acceptableKey();
|
|
||||||
const _this = this;
|
|
||||||
this.store.get(key, function (ret) {
|
|
||||||
if (ret) {
|
|
||||||
_this.chooseKey(callback);
|
|
||||||
} else {
|
|
||||||
callback(key);
|
|
||||||
}
|
|
||||||
}, true); // Don't bump expirations when key searching
|
|
||||||
};
|
|
||||||
|
|
||||||
DocumentHandler.prototype.acceptableKey = function () {
|
|
||||||
return this.keyGenerator.createKey(this.keyLength);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = DocumentHandler;
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*global require,module,process*/
|
|
||||||
|
|
||||||
var AWS = require('aws-sdk');
|
|
||||||
var winston = require('winston');
|
|
||||||
|
|
||||||
var AmazonS3DocumentStore = function(options) {
|
|
||||||
this.expire = options.expire;
|
|
||||||
this.bucket = options.bucket;
|
|
||||||
this.client = new AWS.S3({region: options.region});
|
|
||||||
};
|
|
||||||
|
|
||||||
AmazonS3DocumentStore.prototype.get = function(key, callback, skipExpire) {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var req = {
|
|
||||||
Bucket: _this.bucket,
|
|
||||||
Key: key
|
|
||||||
};
|
|
||||||
|
|
||||||
_this.client.getObject(req, function(err, data) {
|
|
||||||
if(err) {
|
|
||||||
callback(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
callback(data.Body.toString('utf-8'));
|
|
||||||
if (_this.expire && !skipExpire) {
|
|
||||||
winston.warn('amazon s3 store cannot set expirations on keys');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
AmazonS3DocumentStore.prototype.set = function(key, data, callback, skipExpire) {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var req = {
|
|
||||||
Bucket: _this.bucket,
|
|
||||||
Key: key,
|
|
||||||
Body: data,
|
|
||||||
ContentType: 'text/plain'
|
|
||||||
};
|
|
||||||
|
|
||||||
_this.client.putObject(req, function(err, data) {
|
|
||||||
if (err) {
|
|
||||||
callback(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
callback(true);
|
|
||||||
if (_this.expire && !skipExpire) {
|
|
||||||
winston.warn('amazon s3 store cannot set expirations on keys');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = AmazonS3DocumentStore;
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
const crypto = require('crypto');
|
|
||||||
|
|
||||||
const winston = require('winston');
|
|
||||||
|
|
||||||
// For storing in files
|
|
||||||
// options[type] = file
|
|
||||||
// options[path] - Where to store
|
|
||||||
|
|
||||||
const FileDocumentStore = function (options) {
|
|
||||||
this.basePath = options.path || './data';
|
|
||||||
this.expire = options.expire;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Generate md5 of a string
|
|
||||||
FileDocumentStore.md5 = function (str) {
|
|
||||||
const md5sum = crypto.createHash('md5');
|
|
||||||
md5sum.update(str);
|
|
||||||
return md5sum.digest('hex');
|
|
||||||
};
|
|
||||||
|
|
||||||
// Save data in a file, key as md5 - since we don't know what we could
|
|
||||||
// be passed here
|
|
||||||
FileDocumentStore.prototype.set = function (key, data, callback, skipExpire) {
|
|
||||||
try {
|
|
||||||
const _this = this;
|
|
||||||
fs.mkdir(this.basePath, '700', function () {
|
|
||||||
const fn = _this.basePath + '/' + FileDocumentStore.md5(key);
|
|
||||||
fs.writeFile(fn, data, 'utf8', function (err) {
|
|
||||||
if (err) {
|
|
||||||
callback(false);
|
|
||||||
} else {
|
|
||||||
callback(true);
|
|
||||||
if (_this.expire && !skipExpire) {
|
|
||||||
winston.warn('file store cannot set expirations on keys');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
callback(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get data from a file from key
|
|
||||||
FileDocumentStore.prototype.get = function (key, callback, skipExpire) {
|
|
||||||
const _this = this;
|
|
||||||
const fn = this.basePath + '/' + FileDocumentStore.md5(key);
|
|
||||||
fs.readFile(fn, 'utf8', function (err, data) {
|
|
||||||
if (err) {
|
|
||||||
callback(false);
|
|
||||||
} else {
|
|
||||||
callback(data);
|
|
||||||
if (_this.expire && !skipExpire) {
|
|
||||||
winston.warn('file store cannot set expirations on keys');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = FileDocumentStore;
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/*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 expireTime = (skipExpire || this.expire === undefined) ? null : new Date(Date.now() + 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 || entity[0]["expiration"] == null) {
|
|
||||||
callback(entity[0]["value"]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// check for expiry
|
|
||||||
if (entity[0]["expiration"] < new Date()) {
|
|
||||||
winston.info("document expired", {key: key, expiration: entity[0]["expiration"], check: new Date(null)});
|
|
||||||
callback(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// update expiry
|
|
||||||
var task = {
|
|
||||||
key: taskKey,
|
|
||||||
data: [
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
value: entity[0]["value"],
|
|
||||||
excludeFromIndexes: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiration',
|
|
||||||
value: new Date(Date.now() + 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;
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
const memcached = require('memcached');
|
|
||||||
const winston = require('winston');
|
|
||||||
|
|
||||||
class MemcachedDocumentStore {
|
|
||||||
|
|
||||||
// Create a new store with options
|
|
||||||
constructor(options) {
|
|
||||||
this.expire = options.expire;
|
|
||||||
|
|
||||||
const host = options.host || '127.0.0.1';
|
|
||||||
const port = options.port || 11211;
|
|
||||||
const url = `${host}:${port}`;
|
|
||||||
this.connect(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a connection
|
|
||||||
connect(url) {
|
|
||||||
this.client = new memcached(url);
|
|
||||||
|
|
||||||
winston.info(`connecting to memcached on ${url}`);
|
|
||||||
|
|
||||||
this.client.on('failure', function(error) {
|
|
||||||
winston.info('error connecting to memcached', {error});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save file in a key
|
|
||||||
set(key, data, callback, skipExpire) {
|
|
||||||
this.client.set(key, data, skipExpire ? 0 : this.expire || 0, (error) => {
|
|
||||||
callback(!error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a file from a key
|
|
||||||
get(key, callback, skipExpire) {
|
|
||||||
this.client.get(key, (error, data) => {
|
|
||||||
const value = error ? false : data;
|
|
||||||
|
|
||||||
callback(value);
|
|
||||||
|
|
||||||
// Update the key so that the expiration is pushed forward
|
|
||||||
if (value && !skipExpire) {
|
|
||||||
this.set(key, data, (updateSucceeded) => {
|
|
||||||
if (!updateSucceeded) {
|
|
||||||
winston.error('failed to update expiration on GET', {key});
|
|
||||||
}
|
|
||||||
}, skipExpire);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = MemcachedDocumentStore;
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
var MongoClient = require('mongodb').MongoClient,
|
|
||||||
winston = require('winston');
|
|
||||||
|
|
||||||
var MongoDocumentStore = function (options) {
|
|
||||||
this.expire = options.expire;
|
|
||||||
this.connectionUrl = process.env.DATABASE_URl || options.connectionUrl;
|
|
||||||
};
|
|
||||||
|
|
||||||
MongoDocumentStore.prototype.set = function (key, data, callback, skipExpire) {
|
|
||||||
var now = Math.floor(new Date().getTime() / 1000),
|
|
||||||
that = this;
|
|
||||||
|
|
||||||
this.safeConnect(function (err, db) {
|
|
||||||
if (err)
|
|
||||||
return callback(false);
|
|
||||||
|
|
||||||
db.collection('entries').update({
|
|
||||||
'entry_id': key,
|
|
||||||
$or: [
|
|
||||||
{ expiration: -1 },
|
|
||||||
{ expiration: { $gt: now } }
|
|
||||||
]
|
|
||||||
}, {
|
|
||||||
'entry_id': key,
|
|
||||||
'value': data,
|
|
||||||
'expiration': that.expire && !skipExpire ? that.expire + now : -1
|
|
||||||
}, {
|
|
||||||
upsert: true
|
|
||||||
}, function (err, existing) {
|
|
||||||
if (err) {
|
|
||||||
winston.error('error persisting value to mongodb', { error: err });
|
|
||||||
return callback(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
MongoDocumentStore.prototype.get = function (key, callback, skipExpire) {
|
|
||||||
var now = Math.floor(new Date().getTime() / 1000),
|
|
||||||
that = this;
|
|
||||||
|
|
||||||
this.safeConnect(function (err, db) {
|
|
||||||
if (err)
|
|
||||||
return callback(false);
|
|
||||||
|
|
||||||
db.collection('entries').findOne({
|
|
||||||
'entry_id': key,
|
|
||||||
$or: [
|
|
||||||
{ expiration: -1 },
|
|
||||||
{ expiration: { $gt: now } }
|
|
||||||
]
|
|
||||||
}, function (err, entry) {
|
|
||||||
if (err) {
|
|
||||||
winston.error('error persisting value to mongodb', { error: err });
|
|
||||||
return callback(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(entry === null ? false : entry.value);
|
|
||||||
|
|
||||||
if (entry !== null && entry.expiration !== -1 && that.expire && !skipExpire) {
|
|
||||||
db.collection('entries').update({
|
|
||||||
'entry_id': key
|
|
||||||
}, {
|
|
||||||
$set: {
|
|
||||||
'expiration': that.expire + now
|
|
||||||
}
|
|
||||||
}, function (err, result) { });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
MongoDocumentStore.prototype.safeConnect = function (callback) {
|
|
||||||
MongoClient.connect(this.connectionUrl, function (err, db) {
|
|
||||||
if (err) {
|
|
||||||
winston.error('error connecting to mongodb', { error: err });
|
|
||||||
callback(err);
|
|
||||||
} else {
|
|
||||||
callback(undefined, db);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = MongoDocumentStore;
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/*global require,module,process*/
|
|
||||||
|
|
||||||
var winston = require('winston');
|
|
||||||
const {Pool} = require('pg');
|
|
||||||
|
|
||||||
// create table entries (id serial primary key, key varchar(255) not null, value text not null, expiration int, unique(key));
|
|
||||||
|
|
||||||
// A postgres document store
|
|
||||||
var PostgresDocumentStore = function (options) {
|
|
||||||
this.expireJS = parseInt(options.expire, 10);
|
|
||||||
|
|
||||||
const connectionString = process.env.DATABASE_URL || options.connectionUrl;
|
|
||||||
this.pool = new Pool({connectionString});
|
|
||||||
};
|
|
||||||
|
|
||||||
PostgresDocumentStore.prototype = {
|
|
||||||
|
|
||||||
// Set a given key
|
|
||||||
set: function (key, data, callback, skipExpire) {
|
|
||||||
var now = Math.floor(new Date().getTime() / 1000);
|
|
||||||
var that = this;
|
|
||||||
this.safeConnect(function (err, client, done) {
|
|
||||||
if (err) { return callback(false); }
|
|
||||||
client.query('INSERT INTO entries (key, value, expiration) VALUES ($1, $2, $3)', [
|
|
||||||
key,
|
|
||||||
data,
|
|
||||||
that.expireJS && !skipExpire ? that.expireJS + now : null
|
|
||||||
], function (err) {
|
|
||||||
if (err) {
|
|
||||||
winston.error('error persisting value to postgres', { error: err });
|
|
||||||
return callback(false);
|
|
||||||
}
|
|
||||||
callback(true);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// Get a given key's data
|
|
||||||
get: function (key, callback, skipExpire) {
|
|
||||||
var now = Math.floor(new Date().getTime() / 1000);
|
|
||||||
var that = this;
|
|
||||||
this.safeConnect(function (err, client, done) {
|
|
||||||
if (err) { return callback(false); }
|
|
||||||
client.query('SELECT id,value,expiration from entries where KEY = $1 and (expiration IS NULL or expiration > $2)', [key, now], function (err, result) {
|
|
||||||
if (err) {
|
|
||||||
winston.error('error retrieving value from postgres', { error: err });
|
|
||||||
return callback(false);
|
|
||||||
}
|
|
||||||
callback(result.rows.length ? result.rows[0].value : false);
|
|
||||||
if (result.rows.length && that.expireJS && !skipExpire) {
|
|
||||||
client.query('UPDATE entries SET expiration = $1 WHERE ID = $2', [
|
|
||||||
that.expireJS + now,
|
|
||||||
result.rows[0].id
|
|
||||||
], function (err) {
|
|
||||||
if (!err) {
|
|
||||||
done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// A connection wrapper
|
|
||||||
safeConnect: function (callback) {
|
|
||||||
this.pool.connect((error, client, done) => {
|
|
||||||
if (error) {
|
|
||||||
winston.error('error connecting to postgres', {error});
|
|
||||||
callback(error);
|
|
||||||
} else {
|
|
||||||
callback(undefined, client, done);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = PostgresDocumentStore;
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
var redis = require('redis');
|
|
||||||
var winston = require('winston');
|
|
||||||
|
|
||||||
// For storing in redis
|
|
||||||
// options[type] = redis
|
|
||||||
// options[host] - The host to connect to (default localhost)
|
|
||||||
// options[port] - The port to connect to (default 5379)
|
|
||||||
// options[db] - The db to use (default 0)
|
|
||||||
// options[expire] - The time to live for each key set (default never)
|
|
||||||
|
|
||||||
var RedisDocumentStore = function(options, client) {
|
|
||||||
this.expire = options.expire;
|
|
||||||
if (client) {
|
|
||||||
winston.info('using predefined redis client');
|
|
||||||
RedisDocumentStore.client = client;
|
|
||||||
} else if (!RedisDocumentStore.client) {
|
|
||||||
winston.info('configuring redis');
|
|
||||||
RedisDocumentStore.connect(options);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a connection according to config
|
|
||||||
RedisDocumentStore.connect = function(options) {
|
|
||||||
var host = options.host || '127.0.0.1';
|
|
||||||
var port = options.port || 6379;
|
|
||||||
var index = options.db || 0;
|
|
||||||
RedisDocumentStore.client = redis.createClient(port, host);
|
|
||||||
// authenticate if password is provided
|
|
||||||
if (options.password) {
|
|
||||||
RedisDocumentStore.client.auth(options.password);
|
|
||||||
}
|
|
||||||
|
|
||||||
RedisDocumentStore.client.on('error', function(err) {
|
|
||||||
winston.error('redis disconnected', err);
|
|
||||||
});
|
|
||||||
|
|
||||||
RedisDocumentStore.client.select(index, function(err) {
|
|
||||||
if (err) {
|
|
||||||
winston.error(
|
|
||||||
'error connecting to redis index ' + index,
|
|
||||||
{ error: err }
|
|
||||||
);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
winston.info('connected to redis on ' + host + ':' + port + '/' + index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Save file in a key
|
|
||||||
RedisDocumentStore.prototype.set = function(key, data, callback, skipExpire) {
|
|
||||||
var _this = this;
|
|
||||||
RedisDocumentStore.client.set(key, data, function(err) {
|
|
||||||
if (err) {
|
|
||||||
callback(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!skipExpire) {
|
|
||||||
_this.setExpiration(key);
|
|
||||||
}
|
|
||||||
callback(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Expire a key in expire time if set
|
|
||||||
RedisDocumentStore.prototype.setExpiration = function(key) {
|
|
||||||
if (this.expire) {
|
|
||||||
RedisDocumentStore.client.expire(key, this.expire, function(err) {
|
|
||||||
if (err) {
|
|
||||||
winston.error('failed to set expiry on key: ' + key);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get a file from a key
|
|
||||||
RedisDocumentStore.prototype.get = function(key, callback, skipExpire) {
|
|
||||||
var _this = this;
|
|
||||||
RedisDocumentStore.client.get(key, function(err, reply) {
|
|
||||||
if (!err && !skipExpire) {
|
|
||||||
_this.setExpiration(key);
|
|
||||||
}
|
|
||||||
callback(err ? false : reply);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = RedisDocumentStore;
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
const crypto = require('crypto');
|
|
||||||
const rethink = require('rethinkdbdash');
|
|
||||||
const winston = require('winston');
|
|
||||||
|
|
||||||
const md5 = (str) => {
|
|
||||||
const md5sum = crypto.createHash('md5');
|
|
||||||
md5sum.update(str);
|
|
||||||
return md5sum.digest('hex');
|
|
||||||
};
|
|
||||||
|
|
||||||
class RethinkDBStore {
|
|
||||||
constructor(options) {
|
|
||||||
this.client = rethink({
|
|
||||||
silent: true,
|
|
||||||
host: options.host || '127.0.0.1',
|
|
||||||
port: options.port || 28015,
|
|
||||||
db: options.db || 'haste',
|
|
||||||
user: options.user || 'admin',
|
|
||||||
password: options.password || ''
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
set(key, data, callback) {
|
|
||||||
this.client.table('uploads').insert({ id: md5(key), data: data }).run((error) => {
|
|
||||||
if (error) {
|
|
||||||
callback(false);
|
|
||||||
winston.error('failed to insert to table', error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
callback(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
get(key, callback) {
|
|
||||||
this.client.table('uploads').get(md5(key)).run((error, result) => {
|
|
||||||
if (error || !result) {
|
|
||||||
callback(false);
|
|
||||||
if (error) winston.error('failed to insert to table', error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
callback(result.data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = RethinkDBStore;
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
|
|
||||||
module.exports = class DictionaryGenerator {
|
|
||||||
|
|
||||||
constructor(options, readyCallback) {
|
|
||||||
// Check options format
|
|
||||||
if (!options) throw Error('No options passed to generator');
|
|
||||||
if (!options.path) throw Error('No dictionary path specified in options');
|
|
||||||
|
|
||||||
// Load dictionary
|
|
||||||
fs.readFile(options.path, 'utf8', (err, data) => {
|
|
||||||
if (err) throw err;
|
|
||||||
|
|
||||||
this.dictionary = data.split(/[\n\r]+/);
|
|
||||||
|
|
||||||
if (readyCallback) readyCallback();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generates a dictionary-based key, of keyLength words
|
|
||||||
createKey(keyLength) {
|
|
||||||
let text = '';
|
|
||||||
|
|
||||||
for (let i = 0; i < keyLength; i++) {
|
|
||||||
const index = Math.floor(Math.random() * this.dictionary.length);
|
|
||||||
text += this.dictionary[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
// Draws inspiration from pwgen and http://tools.arantius.com/password
|
|
||||||
|
|
||||||
const randOf = (collection) => {
|
|
||||||
return () => {
|
|
||||||
return collection[Math.floor(Math.random() * collection.length)];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// Helper methods to get an random vowel or consonant
|
|
||||||
const randVowel = randOf('aeiou');
|
|
||||||
const randConsonant = randOf('bcdfghjklmnpqrstvwxyz');
|
|
||||||
|
|
||||||
module.exports = class PhoneticKeyGenerator {
|
|
||||||
|
|
||||||
// Generate a phonetic key of alternating consonant & vowel
|
|
||||||
createKey(keyLength) {
|
|
||||||
let text = '';
|
|
||||||
const start = Math.round(Math.random());
|
|
||||||
|
|
||||||
for (let i = 0; i < keyLength; i++) {
|
|
||||||
text += (i % 2 == start) ? randConsonant() : randVowel();
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
module.exports = class RandomKeyGenerator {
|
|
||||||
|
|
||||||
// Initialize a new generator with the given keySpace
|
|
||||||
constructor(options = {}) {
|
|
||||||
this.keyspace = options.keyspace || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate a key of the given length
|
|
||||||
createKey(keyLength) {
|
|
||||||
var text = '';
|
|
||||||
|
|
||||||
for (var i = 0; i < keyLength; i++) {
|
|
||||||
const index = Math.floor(Math.random() * this.keyspace.length);
|
|
||||||
text += this.keyspace.charAt(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user