lemon-core
Version:
Lemon Serverless Micro-Service Platform
129 lines • 4.41 kB
JavaScript
// origin from: https://github.com/baseprime/dynamodb @20191106
// Copyright (c) 2016 Ryan Fitzgerald
/**
* `utils.ts`
* - utils
*
*
* @author Steve Jung <steve@lemoncloud.io>
* @date 2019-11-20 refactoring to ts via origin
*
* @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.strToBin = exports.omitPrimaryKeys = exports.paginatedRequest = exports.mergeResults = exports.omitNulls = void 0;
const lodash_1 = __importDefault(require("lodash"));
const async_1 = __importDefault(require("async"));
// eslint-disable-next-line @typescript-eslint/no-var-requires
const AWSUtil = require('aws-sdk/lib/util');
const omitNulls = (data) => {
return lodash_1.default.omitBy(data, function (value) {
return (lodash_1.default.isNull(value) ||
lodash_1.default.isUndefined(value) ||
(lodash_1.default.isArray(value) && lodash_1.default.isEmpty(value)) ||
(lodash_1.default.isString(value) && lodash_1.default.isEmpty(value)));
});
};
exports.omitNulls = omitNulls;
const mergeResults = (responses, tableName) => {
const result = {
Items: [],
ConsumedCapacity: {
CapacityUnits: 0,
TableName: tableName,
},
Count: 0,
ScannedCount: 0,
};
const merged = lodash_1.default.reduce(responses, (memo, resp) => {
if (!resp) {
return memo;
}
memo.Count += resp.Count || 0;
memo.ScannedCount += resp.ScannedCount || 0;
if (resp.ConsumedCapacity) {
memo.ConsumedCapacity.CapacityUnits += resp.ConsumedCapacity.CapacityUnits || 0;
}
if (resp.Items) {
memo.Items = memo.Items.concat(resp.Items);
}
if (resp.LastEvaluatedKey) {
memo.LastEvaluatedKey = resp.LastEvaluatedKey;
}
return memo;
}, result);
if (merged.ConsumedCapacity.CapacityUnits === 0) {
delete merged.ConsumedCapacity;
}
if (merged.ScannedCount === 0) {
delete merged.ScannedCount;
}
return merged;
};
exports.mergeResults = mergeResults;
const paginatedRequest = (self, runRequestFunc, callback) => {
// if callback isn't passed switch to stream
if (!callback) {
throw new Error('@callback is required');
}
let lastEvaluatedKey = null;
const responses = [];
let retry = false;
const doFunc = function (callback) {
if (lastEvaluatedKey) {
self.startKey(lastEvaluatedKey);
}
runRequestFunc(self.buildRequest(), function (err, resp) {
if (err && err.retryable) {
retry = true;
return setImmediate(callback);
}
else if (err) {
retry = false;
return setImmediate(callback, err);
}
retry = false;
lastEvaluatedKey = resp.LastEvaluatedKey;
responses.push(resp);
return setImmediate(callback);
});
};
const testFunc = function () {
return (self.options.loadAll && lastEvaluatedKey) || retry;
};
const resulsFunc = function (err) {
if (err) {
return callback(err);
}
return callback(null, (0, exports.mergeResults)(responses, self.table.tableName()));
};
async_1.default.doWhilst(doFunc, testFunc, resulsFunc);
};
exports.paginatedRequest = paginatedRequest;
const omitPrimaryKeys = function (schema, params) {
return lodash_1.default.omit(params, schema.hashKey, schema.rangeKey);
};
exports.omitPrimaryKeys = omitPrimaryKeys;
const strToBin = function (value) {
if (typeof value !== 'string') {
const StrConversionError = 'Need to pass in string primitive to be converted to binary.';
throw new Error(StrConversionError);
}
if (AWSUtil.isBrowser()) {
const len = value.length;
const bin = new Uint8Array(new ArrayBuffer(len));
for (let i = 0; i < len; i++) {
bin[i] = value.charCodeAt(i);
}
return bin;
}
else {
return AWSUtil.Buffer(value);
}
};
exports.strToBin = strToBin;
//# sourceMappingURL=utils.js.map
;