@bitblit/ratchet-aws 4.0.211-alpha → 4.0.220-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/batch/aws-batch-background-processor.ts","../src/batch/aws-batch-ratchet.ts","../src/build/ratchet-aws-info.ts","../src/cache/dynamo-db-storage-provider.ts","../src/cache/s3-storage-provider.ts","../src/cache/simple-cache.ts","../src/cloudwatch/cloud-watch-log-group-ratchet.ts","../src/cloudwatch/cloud-watch-logs-ratchet.ts","../src/model/cloud-watch-metrics-unit.ts","../src/cloudwatch/cloud-watch-metrics-ratchet.ts","../src/daemon/daemon-util.ts","../src/s3/s3-cache-ratchet.ts","../src/daemon/daemon.ts","../src/dao/prototype-dao.ts","../src/dao/s3-prototype-dao-provider.ts","../src/dao/s3-simple-dao.ts","../src/dynamodb/dynamo-ratchet.ts","../src/dynamodb/dynamo-table-ratchet.ts","../src/dynamodb/hash-spreader.ts","../src/ec2/ec2-ratchet.ts","../src/environment/cascade-environment-service-provider.ts","../src/environment/env-var-environment-service-provider.ts","../src/environment/environment-service.ts","../src/environment/fixed-environment-service-provider.ts","../src/environment/s3-environment-service-provider.ts","../src/environment/ssm-environment-service-provider.ts","../src/expiring-code/dynamo-expiring-code-provider.ts","../src/expiring-code/expiring-code-ratchet.ts","../src/expiring-code/s3-expiring-code-provider.ts","../src/iam/aws-credentials-ratchet.ts","../src/lambda/lambda-event-detector.ts","../src/lambda/lambda-event-type-guards.ts","../src/route53/route-53-ratchet.ts","../src/runtime-parameter/dynamo-runtime-parameter-provider.ts","../src/runtime-parameter/global-variable-override-runtime-parameter-provider.ts","../src/runtime-parameter/memory-runtime-parameter-provider.ts","../src/runtime-parameter/runtime-parameter-ratchet.ts","../src/s3/s3-location-sync-ratchet.ts","../src/s3/s3-ratchet.ts","../src/ses/mailer.ts","../src/sns/sns-ratchet.ts","../src/sync-lock/dynamo-db-sync-lock.ts","../src/sync-lock/memory-sync-lock.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class AwsBatchBackgroundProcessor {\n batchRatchet;\n validTaskNames;\n constructor(batchRatchet, validTaskNames) {\n this.batchRatchet = batchRatchet;\n this.validTaskNames = validTaskNames;\n RequireRatchet.notNullOrUndefined(this.batchRatchet, 'batchRatchet');\n RequireRatchet.notNullOrUndefined(this.batchRatchet.batchClient, 'batchRatchet.batchClient');\n RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultJobDefinition, 'batchRatchet.defaultJobDefinition');\n RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultQueueName, 'batchRatchet.defaultQueueName');\n }\n async scheduleBackgroundTask(taskName, data = {}, meta = {}) {\n if (this.validTaskNames &&\n this.validTaskNames.length &&\n (!StringRatchet.trimToNull(taskName) || !this.validTaskNames.includes(taskName))) {\n ErrorRatchet.throwFormattedErr('Cannot start task %s - not found in valid task list', taskName);\n }\n Logger.info('Submitting background task to AWS batch: %s %j %s', taskName, data, this.batchRatchet.defaultQueueName);\n let rval = null;\n const jobName = `${this.batchRatchet.defaultJobDefinition}-${taskName}_${DateTime.utc().toFormat('yyyy-MM-dd-HH-mm')}`;\n const options = {\n jobName: jobName,\n jobDefinition: this.batchRatchet.defaultJobDefinition,\n jobQueue: this.batchRatchet.defaultQueueName,\n parameters: {\n taskName,\n taskData: JSON.stringify(data),\n taskMetadata: JSON.stringify(meta),\n },\n };\n try {\n rval = await this.batchRatchet.scheduleJob(options);\n Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);\n }\n catch (err) {\n Logger.error('Cannot submit batch job taskName: %s jobDef: %s queue: %s jobName: %s data: %j', taskName, this.batchRatchet.defaultJobDefinition, this.batchRatchet.defaultQueueName, jobName, data, err);\n }\n return rval;\n }\n}\n//# sourceMappingURL=aws-batch-background-processor.js.map","import { ListJobsCommand, SubmitJobCommand, } from '@aws-sdk/client-batch';\nimport { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class AwsBatchRatchet {\n _batchClient;\n _defaultQueueName;\n _defaultJobDefinition;\n constructor(_batchClient, _defaultQueueName, _defaultJobDefinition) {\n this._batchClient = _batchClient;\n this._defaultQueueName = _defaultQueueName;\n this._defaultJobDefinition = _defaultJobDefinition;\n }\n get batchClient() {\n return this._batchClient;\n }\n get defaultQueueName() {\n return this._defaultQueueName;\n }\n get defaultJobDefinition() {\n return this._defaultJobDefinition;\n }\n async scheduleJob(options) {\n Logger.info('Submitting batch job %s', options.jobName);\n try {\n const rval = await this._batchClient.send(new SubmitJobCommand(options));\n Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);\n return rval;\n }\n catch (err) {\n Logger.error('Cannot submit batch job %s: %s', options.jobName, err);\n }\n return null;\n }\n async jobCountInState(jobStatus, queueName = this.defaultQueueName) {\n const all = await this.listJobs(queueName, jobStatus);\n return all.length;\n }\n async listJobs(queueName = this.defaultQueueName, jobStatus = null) {\n RequireRatchet.notNullOrUndefined(queueName, 'queueName');\n let rval = [];\n const request = {\n jobQueue: queueName,\n jobStatus: jobStatus,\n nextToken: null,\n };\n Logger.info('Fetching %j', request);\n do {\n Logger.info('Pulling page...');\n const tmp = await this._batchClient.send(new ListJobsCommand(request));\n rval = rval.concat(tmp.jobSummaryList);\n request.nextToken = tmp.nextToken;\n } while (request.nextToken);\n return rval;\n }\n}\n//# sourceMappingURL=aws-batch-ratchet.js.map","export class RatchetAwsInfo {\n constructor() { }\n static buildInformation() {\n const val = {\n version: 'LOCAL-SNAPSHOT',\n hash: 'LOCAL-HASH',\n branch: 'LOCAL-BRANCH',\n tag: 'LOCAL-TAG',\n timeBuiltISO: 'LOCAL-TIME-ISO',\n notes: 'LOCAL-NOTES',\n };\n return val;\n }\n}\n//# sourceMappingURL=ratchet-aws-info.js.map","import { RequireRatchet } from '@bitblit/ratchet-common';\nexport class DynamoDbStorageProvider {\n dynamo;\n opts;\n constructor(dynamo, opts) {\n this.dynamo = dynamo;\n this.opts = opts;\n RequireRatchet.notNullOrUndefined(this.dynamo, 'dynamo');\n RequireRatchet.notNullOrUndefined(this.opts, 'opts');\n RequireRatchet.notNullOrUndefined(this.opts.tableName, 'opts.tableName');\n RequireRatchet.notNullOrUndefined(this.opts.hashKeyName, 'opts.hashKeyName');\n RequireRatchet.true(!this.opts.useRangeKeys || (!!this.opts.rangeKeyName && !!this.opts.hashKeyValue), 'invalid range configuration');\n }\n static createDefaultOptions() {\n const rval = {\n tableName: 'simple-cache',\n useRangeKeys: false,\n hashKeyName: 'cache-key',\n rangeKeyName: null,\n hashKeyValue: null,\n };\n return rval;\n }\n createKeyObject(cacheKey) {\n const keys = {};\n if (this.opts.useRangeKeys) {\n keys[this.opts.hashKeyName] = this.opts.hashKeyValue;\n keys[this.opts.rangeKeyName] = cacheKey;\n }\n else {\n keys[this.opts.hashKeyName] = cacheKey;\n }\n return keys;\n }\n cleanDynamoFieldsFromObjectInPlace(rval) {\n if (rval) {\n delete rval[this.opts.hashKeyName];\n if (this.opts.rangeKeyName) {\n delete rval[this.opts.rangeKeyName];\n }\n if (this.opts.dynamoExpiresColumnName) {\n delete rval[this.opts.dynamoExpiresColumnName];\n }\n }\n }\n extractKeysFromObject(rval) {\n let keys = null;\n if (rval) {\n keys = {};\n if (this.opts.useRangeKeys) {\n keys[this.opts.hashKeyName] = this.opts.hashKeyValue;\n keys[this.opts.rangeKeyName] = rval.cacheKey;\n }\n else {\n keys[this.opts.hashKeyName] = rval.cacheKey;\n }\n }\n return keys;\n }\n async readFromCache(cacheKey) {\n const dKey = this.createKeyObject(cacheKey);\n const rval = await this.dynamo.simpleGet(this.opts.tableName, dKey);\n this.cleanDynamoFieldsFromObjectInPlace(rval);\n return rval;\n }\n async storeInCache(value) {\n RequireRatchet.notNullOrUndefined(value, 'value');\n RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');\n const toSave = Object.assign({}, value, this.createKeyObject(value.cacheKey));\n if (this.opts.dynamoExpiresColumnName && value.expiresEpochMS) {\n toSave[this.opts.dynamoExpiresColumnName] = Math.floor(value.expiresEpochMS / 1000);\n }\n const wrote = await this.dynamo.simplePut(this.opts.tableName, toSave);\n return !!wrote;\n }\n async removeFromCache(cacheKey) {\n await this.dynamo.simpleDelete(this.opts.tableName, this.createKeyObject(cacheKey));\n }\n async clearCache() {\n const allValues = await this.readAll();\n const allKeys = allValues.map((a) => this.extractKeysFromObject(a));\n const rval = await this.dynamo.deleteAllInBatches(this.opts.tableName, allKeys, 25);\n return rval;\n }\n async readAll() {\n let rval = null;\n if (this.opts.useRangeKeys) {\n const qry = {\n TableName: this.opts.tableName,\n KeyConditionExpression: '#cacheKey = :cacheKey',\n ExpressionAttributeNames: {\n '#cacheKey': this.opts.hashKeyName,\n },\n ExpressionAttributeValues: {\n ':cacheKey': this.opts.hashKeyValue,\n },\n };\n rval = await this.dynamo.fullyExecuteQuery(qry);\n }\n else {\n const scan = {\n TableName: this.opts.tableName,\n };\n rval = await this.dynamo.fullyExecuteScan(scan);\n }\n rval.forEach((r) => this.cleanDynamoFieldsFromObjectInPlace(r));\n return rval;\n }\n}\n//# sourceMappingURL=dynamo-db-storage-provider.js.map","import { RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class S3StorageProvider {\n s3CacheRatchet;\n prefix;\n constructor(s3CacheRatchet, prefix) {\n this.s3CacheRatchet = s3CacheRatchet;\n this.prefix = prefix;\n RequireRatchet.notNullOrUndefined(this.s3CacheRatchet, 's3CacheRatchet');\n RequireRatchet.notNullOrUndefined(this.s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');\n }\n keyToPath(cacheKey) {\n let rval = StringRatchet.trimToEmpty(this.prefix);\n if (rval.length > 0 && !rval.endsWith('/')) {\n rval += '/';\n }\n rval += cacheKey;\n return rval;\n }\n async readFromCache(cacheKey) {\n const rval = await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyToPath(cacheKey));\n return rval;\n }\n async storeInCache(value) {\n RequireRatchet.notNullOrUndefined(value, 'value');\n RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');\n const tmp = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyToPath(value.cacheKey), value);\n return !!tmp;\n }\n async removeFromCache(cacheKey) {\n await this.s3CacheRatchet.removeCacheFile(this.keyToPath(cacheKey));\n }\n async clearCache() {\n const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));\n const removed = await Promise.all(keys.map((k) => this.removeFromCache(k)));\n return keys.length;\n }\n async readAll() {\n const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));\n const rval = await Promise.all(keys.map((k) => this.readFromCache(k)));\n return rval;\n }\n}\n//# sourceMappingURL=s3-storage-provider.js.map","import { Logger } from '@bitblit/ratchet-common';\nexport class SimpleCache {\n provider;\n defaultTimeToLiveMS;\n constructor(provider, defaultTimeToLiveMS = 1_000 * 60) {\n this.provider = provider;\n this.defaultTimeToLiveMS = defaultTimeToLiveMS;\n }\n createDefaultReadOptions() {\n return {\n maxStalenessMS: null,\n timeToLiveMS: this.defaultTimeToLiveMS,\n cacheNullValues: false,\n };\n }\n async fetchWrapper(cacheKey, producer, opts = this.createDefaultReadOptions()) {\n Logger.silly('Fetching %s', cacheKey);\n const now = new Date().getTime();\n let rval = await this.provider.readFromCache(cacheKey);\n if (rval && rval.expiresEpochMS < now) {\n Logger.debug('Object found, but expired - removing');\n rval = null;\n }\n if (rval && opts && opts.maxStalenessMS && now - rval.createdEpochMS > opts.maxStalenessMS) {\n Logger.debug('Object found by too stale - removing');\n rval = null;\n }\n if (!rval) {\n Logger.debug('%s not found in cache, generating', cacheKey);\n const tmp = await producer();\n if (tmp || opts?.cacheNullValues) {\n Logger.debug('Writing %j to cache');\n rval = {\n cacheKey: cacheKey,\n createdEpochMS: now,\n expiresEpochMS: opts && opts.timeToLiveMS ? now + opts.timeToLiveMS : null,\n value: tmp,\n generated: false,\n };\n await this.provider.storeInCache(rval);\n rval.generated = true;\n }\n }\n return rval;\n }\n async fetch(cacheKey, producer, opts = null) {\n const wrapper = await this.fetchWrapper(cacheKey, producer, opts);\n return wrapper ? wrapper.value : null;\n }\n async removeFromCache(cacheKey, returnOldValue) {\n let rval = null;\n if (returnOldValue) {\n rval = await this.fetchWrapper(cacheKey, () => null);\n }\n await this.provider.removeFromCache(cacheKey);\n return rval;\n }\n async clearCache() {\n return this.provider.clearCache();\n }\n async readAll() {\n return this.provider.readAll();\n }\n}\n//# sourceMappingURL=simple-cache.js.map","import { CloudWatchLogsClient, DescribeLogStreamsCommand, FilterLogEventsCommand, } from '@aws-sdk/client-cloudwatch-logs';\nimport { Logger, StopWatch } from '@bitblit/ratchet-common';\nexport class CloudWatchLogGroupRatchet {\n logGroup;\n awsCWLogs;\n constructor(logGroup, awsCWLogs = new CloudWatchLogsClient({ region: 'us-east-1' })) {\n this.logGroup = logGroup;\n this.awsCWLogs = awsCWLogs;\n }\n get cloudWatchLogsClient() {\n return this.awsCWLogs;\n }\n async readLogStreams(startTimestamp = null, endTimestamp = null) {\n const params = {\n logGroupName: this.logGroup,\n orderBy: 'LastEventTime',\n };\n const rval = [];\n do {\n Logger.debug('Pulling more log streams (%d found so far)', rval.length);\n const temp = await this.awsCWLogs.send(new DescribeLogStreamsCommand(params));\n temp.logStreams.forEach((s) => {\n if (s.lastEventTimestamp !== null) {\n if (!startTimestamp || s.lastEventTimestamp >= startTimestamp) {\n if (!endTimestamp || s.firstEventTimestamp <= endTimestamp) {\n rval.push(s);\n }\n }\n }\n });\n params.nextToken = temp.nextToken;\n } while (!!params.nextToken);\n Logger.debug('Found %d total, returning', rval.length);\n return rval;\n }\n async readLogStreamNames(startTimestamp = null, endTimestamp = null) {\n const streams = await this.readLogStreams(startTimestamp, endTimestamp);\n const rval = streams.map((s) => s.logStreamName);\n return rval;\n }\n async readEvents(filter, startTimestamp = null, endTimestamp = null, sortEvents = true, maxEvents = null) {\n const sw = new StopWatch();\n const params = {\n logGroupName: this.logGroup,\n endTime: endTimestamp,\n startTime: startTimestamp,\n };\n if (filter) {\n params.filterPattern = filter;\n }\n Logger.debug('Reading log events matching : %j', params);\n let rval = [];\n do {\n Logger.debug('Pulling more log events (%d found so far) : %s', rval.length, sw.dump());\n const temp = await this.awsCWLogs.send(new FilterLogEventsCommand(params));\n rval = rval.concat(temp.events);\n params.nextToken = temp.nextToken;\n } while (!!params.nextToken && (!maxEvents || rval.length < maxEvents));\n Logger.debug('Found %d total in %s', rval.length, sw.dump());\n if (sortEvents) {\n Logger.debug('Sorting events by timestamp');\n rval = rval.sort((a, b) => {\n let rval = a.timestamp - b.timestamp;\n if (rval === 0) {\n rval = a.message.localeCompare(b.message);\n }\n return rval;\n });\n }\n sw.log();\n return rval;\n }\n}\n//# sourceMappingURL=cloud-watch-log-group-ratchet.js.map","import { CloudWatchLogsClient, DeleteLogGroupCommand, DeleteLogStreamCommand, DescribeLogGroupsCommand, DescribeLogStreamsCommand, GetQueryResultsCommand, StartQueryCommand, StopQueryCommand, } from '@aws-sdk/client-cloudwatch-logs';\nimport { Logger, PromiseRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class CloudWatchLogsRatchet {\n static MAX_DELETE_RETRIES = 5;\n cwLogs;\n constructor(cloudwatchLogs = null) {\n this.cwLogs = cloudwatchLogs ? cloudwatchLogs : new CloudWatchLogsClient({ region: 'us-east-1' });\n }\n get cloudWatchLogsClient() {\n return this.cwLogs;\n }\n async removeEmptyOrOldLogStreams(logGroupName, maxToRemove = 1000, oldestEventEpochMS = null) {\n Logger.info('Removing empty streams from %s, oldest event epoch MS : %d', logGroupName, oldestEventEpochMS);\n const streamSearchParams = {\n logGroupName: logGroupName,\n orderBy: 'LastEventTime',\n };\n const oldestEventTester = oldestEventEpochMS || 1;\n let totalStreams = 0;\n const removedStreams = [];\n const failedRemovedStreams = [];\n let waitPerDescribe = 10;\n do {\n Logger.debug('Executing search for streams');\n try {\n const streams = await this.cwLogs.send(new DescribeLogStreamsCommand(streamSearchParams));\n totalStreams += streams.logStreams.length;\n Logger.debug('Found %d streams (%d so far, %d to delete)', streams.logStreams.length, totalStreams, removedStreams.length);\n for (let i = 0; i < streams.logStreams.length && removedStreams.length < maxToRemove; i++) {\n const st = streams.logStreams[i];\n if (!st.firstEventTimestamp) {\n removedStreams.push(st);\n }\n else if (st.lastEventTimestamp < oldestEventTester) {\n removedStreams.push(st);\n }\n }\n streamSearchParams['nextToken'] = streams.nextToken;\n }\n catch (err) {\n const oldWait = waitPerDescribe;\n waitPerDescribe = Math.min(1000, waitPerDescribe * 1.5);\n Logger.info('Caught while describing %s, increasing wait between deletes (was %d, now %d)', err, oldWait, waitPerDescribe);\n }\n } while (!!streamSearchParams['nextToken'] && removedStreams.length < maxToRemove);\n Logger.info('Found %d streams to delete', removedStreams.length);\n let waitPer = 10;\n for (let i = 0; i < removedStreams.length; i++) {\n const delParams = {\n logGroupName: logGroupName,\n logStreamName: removedStreams[i].logStreamName,\n };\n const type = removedStreams[i].storedBytes === 0 ? 'empty' : 'old';\n Logger.info('Removing %s stream %s', type, removedStreams[i].logStreamName);\n let removed = false;\n let retry = 0;\n while (!removed && retry < CloudWatchLogsRatchet.MAX_DELETE_RETRIES) {\n try {\n await this.cwLogs.send(new DeleteLogStreamCommand(delParams));\n removed = true;\n await PromiseRatchet.wait(waitPer);\n }\n catch (err) {\n retry++;\n const oldWait = waitPer;\n waitPer = Math.min(1000, waitPer * 1.5);\n Logger.info('Caught %s, increasing wait between deletes and retrying (wait was %d, now %d) (Retry %d of %d)', err, oldWait, waitPer, retry, CloudWatchLogsRatchet.MAX_DELETE_RETRIES);\n }\n }\n if (!removed) {\n failedRemovedStreams.push(removedStreams[i]);\n }\n }\n Logger.warn('Failed to remove streams : %j', failedRemovedStreams);\n return removedStreams;\n }\n async findOldestEventTimestampInGroup(logGroupName) {\n const stream = await this.findStreamWithOldestEventInGroup(logGroupName);\n return stream ? stream.firstEventTimestamp : null;\n }\n async findStreamWithOldestEventInGroup(logGroupName) {\n Logger.info('Finding oldest event in : %s', logGroupName);\n let rval = null;\n try {\n const streamSearchParams = {\n logGroupName: logGroupName,\n orderBy: 'LastEventTime',\n };\n let totalStreams = 0;\n do {\n Logger.debug('Executing search for streams');\n const streams = await this.cwLogs.send(new DescribeLogStreamsCommand(streamSearchParams));\n totalStreams += streams.logStreams.length;\n Logger.debug('Found %d streams (%d so far)', streams.logStreams.length, totalStreams);\n streams.logStreams.forEach((s) => {\n if (s.firstEventTimestamp && (rval === null || s.firstEventTimestamp < rval.firstEventTimestamp)) {\n rval = s;\n }\n });\n streamSearchParams['nextToken'] = streams.nextToken;\n } while (!!streamSearchParams['nextToken']);\n }\n catch (err) {\n Logger.error('Error attempting to find oldest event in group : %s : %s', logGroupName, err, err);\n }\n return rval;\n }\n async findLogGroups(prefix) {\n RequireRatchet.notNullOrUndefined(prefix);\n const params = {\n logGroupNamePrefix: prefix,\n };\n let rval = [];\n do {\n Logger.info('%d found, pulling log groups : %j', rval.length, params);\n const res = await this.cwLogs.send(new DescribeLogGroupsCommand(params));\n rval = rval.concat(res.logGroups);\n params.nextToken = res.nextToken;\n } while (!!params.nextToken);\n return rval;\n }\n async removeLogGroups(groups) {\n RequireRatchet.notNullOrUndefined(groups);\n const rval = [];\n for (let i = 0; i < groups.length; i++) {\n try {\n Logger.info('Deleting %j', groups[i]);\n const req = {\n logGroupName: groups[i].logGroupName,\n };\n await this.cwLogs.send(new DeleteLogGroupCommand(req));\n rval.push(true);\n }\n catch (err) {\n Logger.error('Failure to delete %j : %s', groups[i], err);\n rval.push(false);\n }\n }\n return rval;\n }\n async removeLogGroupsWithPrefix(prefix) {\n RequireRatchet.notNullOrUndefined(prefix);\n RequireRatchet.true(StringRatchet.trimToEmpty(prefix).length > 0);\n Logger.info('Removing log groups with prefix %s', prefix);\n const groups = await this.findLogGroups(prefix);\n return await this.removeLogGroups(groups);\n }\n async fullyExecuteInsightsQuery(sqr) {\n RequireRatchet.notNullOrUndefined(sqr);\n Logger.debug('Starting insights query : %j', sqr);\n const resp = await this.cwLogs.send(new StartQueryCommand(sqr));\n Logger.debug('Got query id %j', resp);\n let rval = null;\n let delayMS = 100;\n while (!rval || ['Running', 'Scheduled'].includes(rval.status)) {\n rval = await this.cwLogs.send(new GetQueryResultsCommand({ queryId: resp.queryId }));\n await PromiseRatchet.wait(delayMS);\n delayMS *= 2;\n Logger.info('Got : %j', rval);\n }\n return rval;\n }\n async abortInsightsQuery(queryId) {\n let rval = null;\n if (!!queryId) {\n rval = await this.cwLogs.send(new StopQueryCommand({ queryId: queryId }));\n }\n return rval;\n }\n}\n//# sourceMappingURL=cloud-watch-logs-ratchet.js.map","export var CloudWatchMetricsUnit;\n(function (CloudWatchMetricsUnit) {\n CloudWatchMetricsUnit[\"Seconds\"] = \"Seconds\";\n CloudWatchMetricsUnit[\"Microseconds\"] = \"Microseconds\";\n CloudWatchMetricsUnit[\"Milliseconds\"] = \"Milliseconds\";\n CloudWatchMetricsUnit[\"Bytes\"] = \"Bytes\";\n CloudWatchMetricsUnit[\"Kilobytes\"] = \"Kilobytes\";\n CloudWatchMetricsUnit[\"Megabytes\"] = \"Megabytes\";\n CloudWatchMetricsUnit[\"Gigabytes\"] = \"Gigabytes\";\n CloudWatchMetricsUnit[\"Terabytes\"] = \"Terabytes\";\n CloudWatchMetricsUnit[\"Bits\"] = \"Bits\";\n CloudWatchMetricsUnit[\"Kilobits\"] = \"Kilobits\";\n CloudWatchMetricsUnit[\"Megabits\"] = \"Megabits\";\n CloudWatchMetricsUnit[\"Gigabits\"] = \"Gigabits\";\n CloudWatchMetricsUnit[\"Terabits\"] = \"Terabits\";\n CloudWatchMetricsUnit[\"Percent\"] = \"Percent\";\n CloudWatchMetricsUnit[\"Count\"] = \"Count\";\n CloudWatchMetricsUnit[\"BytesPerSecond\"] = \"Bytes/Second\";\n CloudWatchMetricsUnit[\"KilobytesPerSecond\"] = \"Kilobytes/Second\";\n CloudWatchMetricsUnit[\"MegabytesPerSecond\"] = \"Megabytes/Second\";\n CloudWatchMetricsUnit[\"GigabytesPerSecond\"] = \"Gigabytes/Second\";\n CloudWatchMetricsUnit[\"TerabytesPerSecond\"] = \"Terabytes/Second\";\n CloudWatchMetricsUnit[\"BitsPerSecond\"] = \"Terabytes/Second\";\n CloudWatchMetricsUnit[\"KilobitsPerSecond\"] = \"Kilobits/Second\";\n CloudWatchMetricsUnit[\"MegabitsPerSecond\"] = \"Megabits/Second\";\n CloudWatchMetricsUnit[\"GigabitsPerSecond\"] = \"Gigabits/Second\";\n CloudWatchMetricsUnit[\"TerabitsPerSecond\"] = \"Terabits/Second\";\n CloudWatchMetricsUnit[\"CountPerSecond\"] = \"Count/Second\";\n CloudWatchMetricsUnit[\"None\"] = \"None\";\n})(CloudWatchMetricsUnit || (CloudWatchMetricsUnit = {}));\n//# sourceMappingURL=cloud-watch-metrics-unit.js.map","import { CloudWatchClient, PutMetricDataCommand } from '@aws-sdk/client-cloudwatch';\nimport { Logger } from '@bitblit/ratchet-common';\nimport { CloudWatchMetricsUnit } from '../model/cloud-watch-metrics-unit.js';\nimport { DateTime } from 'luxon';\nexport class CloudWatchMetricsRatchet {\n cw;\n constructor(cloudWatch = null) {\n this.cw = cloudWatch ? cloudWatch : new CloudWatchClient({ region: 'us-east-1', apiVersion: '2010-08-01' });\n }\n get cloudWatchClient() {\n return this.cw;\n }\n async writeSingleMetric(namespace, metric, dims, unit = CloudWatchMetricsUnit.None, value, timestampDate = new Date(), highResolution = false) {\n const cwDims = [];\n if (!!dims && dims.length > 0) {\n dims.forEach((d) => {\n cwDims.push({ Name: d.key, Value: d.value });\n });\n }\n const storageResolution = highResolution ? 1 : 60;\n const metricData = {\n Namespace: namespace,\n MetricData: [\n {\n MetricName: metric,\n Dimensions: cwDims,\n Unit: String(unit),\n Value: value,\n Timestamp: timestampDate,\n StorageResolution: storageResolution,\n },\n ],\n };\n Logger.silly('Writing metric to cw : %j', metricData);\n const result = await this.cw.send(new PutMetricDataCommand(metricData));\n Logger.silly('Result: %j', result);\n return result;\n }\n async writeDynamoCountAsMinuteLevelMetric(req) {\n Logger.info('Publishing %s / %s metric for %s UTC', req.namespace, req.metric, req.minuteUTC);\n if (!!req.scan && !!req.query) {\n throw new Error('Must send query or scan, but not both');\n }\n if (!req.scan && !req.query) {\n throw new Error('You must specify either a scan or a query');\n }\n const cnt = !!req.query\n ? await req.dynamoRatchet.fullyExecuteQueryCount(req.query)\n : await req.dynamoRatchet.fullyExecuteScanCount(req.scan);\n Logger.debug('%s / %s for %s are %j', req.namespace, req.metric, req.minuteUTC, cnt);\n const parseDateString = req.minuteUTC.split(' ').join('T') + ':00Z';\n const parseDate = DateTime.fromISO(parseDateString).toJSDate();\n const metricRes = await this.writeSingleMetric(req.namespace, req.metric, req.dims, CloudWatchMetricsUnit.Count, cnt.count, parseDate, false);\n Logger.debug('Metrics response: %j', metricRes);\n return cnt.count;\n }\n}\n//# sourceMappingURL=cloud-watch-metrics-ratchet.js.map","import { Logger, StringRatchet } from '@bitblit/ratchet-common';\nimport { PutObjectCommand, } from '@aws-sdk/client-s3';\nimport { Upload } from '@aws-sdk/lib-storage';\nexport class DaemonUtil {\n static DEFAULT_CONTENT = Buffer.from('DAEMON_PLACEHOLDER');\n static DAEMON_METADATA_KEY = 'daemon_meta';\n static async start(cache, id, s3Key, options) {\n try {\n options.meta = options.meta || {};\n Logger.info('Starting daemon, key: %s, options: %j', s3Key, options);\n const now = new Date().getTime();\n const newState = {\n id: id,\n title: options.title,\n lastUpdatedEpochMS: now,\n lastUpdatedMessage: 'Created',\n targetFileName: options.targetFileName,\n startedEpochMS: now,\n completedEpochMS: null,\n meta: options.meta,\n error: null,\n link: null,\n contentType: options.contentType,\n };\n const rval = await DaemonUtil.writeState(cache, s3Key, newState, DaemonUtil.DEFAULT_CONTENT);\n return rval;\n }\n catch (err) {\n Logger.error('Error while trying to start a daemon: %j %s', options, err);\n throw err;\n }\n }\n static async writeState(cache, s3Key, newState, contents) {\n try {\n const s3meta = {};\n newState.lastUpdatedEpochMS = new Date().getTime();\n s3meta[DaemonUtil.DAEMON_METADATA_KEY] = JSON.stringify(newState);\n const params = {\n Bucket: cache.getDefaultBucket(),\n Key: s3Key,\n ContentType: newState.contentType,\n Metadata: s3meta,\n Body: new Blob([contents]),\n };\n if (newState.targetFileName) {\n params.ContentDisposition = 'attachment;filename=\"' + newState.targetFileName + '\"';\n }\n const written = await cache.getS3Client().send(new PutObjectCommand(params));\n Logger.silly('Daemon wrote : %s', written);\n return DaemonUtil.stat(cache, s3Key);\n }\n catch (err) {\n Logger.error('Error while trying to write a daemon stat: %j %s', newState, err);\n throw err;\n }\n }\n static async streamDataAndFinish(cache, s3Key, data, options) {\n Logger.debug('Streaming data to %s', s3Key);\n const inStat = await DaemonUtil.updateMessage(cache, s3Key, 'Streaming data');\n inStat.completedEpochMS = new Date().getTime();\n inStat.lastUpdatedMessage = 'Complete';\n const s3meta = {};\n s3meta[DaemonUtil.DAEMON_METADATA_KEY] = JSON.stringify(inStat);\n const params = {\n Bucket: cache.getDefaultBucket(),\n Key: s3Key,\n ContentType: inStat.contentType,\n Metadata: s3meta,\n Body: data,\n };\n const targetFileName = StringRatchet.trimToNull(options?.overrideTargetFileName) || StringRatchet.trimToNull(inStat?.targetFileName);\n if (targetFileName) {\n params.ContentDisposition = 'attachment;filename=\"' + targetFileName + '\"';\n }\n const upload = new Upload({\n client: cache.getS3Client(),\n params: params,\n tags: [],\n queueSize: 4,\n partSize: 1024 * 1024 * 5,\n leavePartsOnError: false,\n });\n upload.on('httpUploadProgress', (progress) => {\n Logger.info('Uploading : %s', progress);\n });\n const written = await upload.done();\n Logger.silly('Daemon wrote : %s', written);\n return DaemonUtil.stat(cache, s3Key);\n }\n static async updateMessage(cache, s3Key, newMessage) {\n try {\n const inStat = await DaemonUtil.stat(cache, s3Key);\n inStat.lastUpdatedMessage = newMessage;\n return DaemonUtil.writeState(cache, s3Key, inStat, DaemonUtil.DEFAULT_CONTENT);\n }\n catch (err) {\n Logger.error('Error while trying to update a daemon message: %j %s', s3Key, err);\n throw err;\n }\n }\n static async stat(s3Cache, path) {\n try {\n Logger.debug('Daemon stat for path %s / %s', s3Cache.getDefaultBucket(), path);\n let stat = null;\n const meta = await s3Cache.fetchMetaForCacheFile(path);\n Logger.debug('Daemon: Meta is %j', meta);\n const metaString = meta && meta.Metadata ? meta.Metadata[DaemonUtil.DAEMON_METADATA_KEY] : null;\n if (metaString) {\n stat = JSON.parse(metaString);\n if (stat.completedEpochMS && !stat.error) {\n stat.link = await s3Cache.preSignedDownloadUrlForCacheFile(path);\n }\n }\n else {\n Logger.warn('No metadata found! (Head was %j)', meta);\n }\n return stat;\n }\n catch (err) {\n Logger.error('Error while trying to fetch a daemon state: %j %s', path, err);\n throw err;\n }\n }\n static async abort(s3Cache, path) {\n return DaemonUtil.error(s3Cache, path, 'Aborted');\n }\n static async error(s3Cache, path, error) {\n try {\n const inStat = await DaemonUtil.stat(s3Cache, path);\n inStat.error = error;\n inStat.completedEpochMS = new Date().getTime();\n return DaemonUtil.writeState(s3Cache, path, inStat, DaemonUtil.DEFAULT_CONTENT);\n }\n catch (err) {\n Logger.error('Error while trying to write a daemon error: %j %s', path, err);\n throw err;\n }\n }\n static async finalize(s3Cache, path, contents) {\n try {\n Logger.info('Finalizing daemon %s with %d bytes', path, contents.length);\n const inStat = await DaemonUtil.stat(s3Cache, path);\n inStat.completedEpochMS = new Date().getTime();\n inStat.lastUpdatedMessage = 'Complete';\n return DaemonUtil.writeState(s3Cache, path, inStat, contents);\n }\n catch (err) {\n Logger.error('Error while trying to finalize a daemon: %j %s', path, err);\n throw err;\n }\n }\n}\n//# sourceMappingURL=daemon-util.js.map","import { CopyObjectCommand, DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsCommand, NoSuchKey, } from '@aws-sdk/client-s3';\nimport { Logger, RequireRatchet, StopWatch, StreamRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { Upload } from '@aws-sdk/lib-storage';\nexport class S3CacheRatchet {\n s3;\n defaultBucket;\n constructor(s3, defaultBucket = null) {\n this.s3 = s3;\n this.defaultBucket = defaultBucket;\n RequireRatchet.notNullOrUndefined(this.s3, 's3');\n }\n get s3Client() {\n return this.s3;\n }\n static applyCacheControlMaxAge(input, seconds) {\n if (input && seconds) {\n input.CacheControl = 'max-age=' + seconds;\n }\n return input;\n }\n static applyUserMetaData(input, key, value) {\n if (input && StringRatchet.trimToNull(key) && StringRatchet.trimToNull(value)) {\n input.Metadata = input.Metadata || {};\n input.Metadata[key] = value;\n }\n return input;\n }\n getDefaultBucket() {\n return this.defaultBucket;\n }\n getS3Client() {\n return this.s3;\n }\n async fileExists(key, bucket = null) {\n try {\n const head = await this.fetchMetaForCacheFile(key, this.bucketVal(bucket));\n return !!head;\n }\n catch (err) {\n Logger.silly('Error calling file exists (as expected) %s', err);\n return false;\n }\n }\n async fetchCacheFileAsS3GetObjectCommandOutput(key, bucket = null) {\n let rval = null;\n try {\n const params = {\n Bucket: this.bucketVal(bucket),\n Key: key,\n };\n rval = await this.s3.send(new GetObjectCommand(params));\n }\n catch (err) {\n if (err instanceof NoSuchKey) {\n Logger.debug('Key %s not found - returning null', key);\n rval = null;\n }\n else {\n throw err;\n }\n }\n return rval;\n }\n async fetchCacheFileAsReadableStream(key, bucket = null) {\n const out = await this.fetchCacheFileAsS3GetObjectCommandOutput(key, bucket);\n return out.Body.transformToWebStream();\n }\n async fetchCacheFileAsBuffer(key, bucket = null) {\n let rval = null;\n const out = await this.fetchCacheFileAsS3GetObjectCommandOutput(key, bucket);\n if (out?.Body) {\n const tmp = await out.Body.transformToByteArray();\n rval = Buffer.from(tmp);\n }\n return rval;\n }\n async fetchCacheFileAsString(key, bucket = null) {\n let rval = null;\n const out = await this.fetchCacheFileAsS3GetObjectCommandOutput(key, bucket);\n if (out?.Body) {\n rval = await out.Body.transformToString();\n }\n return rval;\n }\n async fetchCacheFileAsObject(key, bucket = null) {\n const value = await this.fetchCacheFileAsString(key, bucket);\n return value ? JSON.parse(value) : null;\n }\n async removeCacheFile(key, bucket = null) {\n let rval = null;\n const params = {\n Bucket: this.bucketVal(bucket),\n Key: key,\n };\n try {\n rval = await this.s3.send(new DeleteObjectCommand(params));\n }\n catch (err) {\n if (err && err['statusCode'] == 404) {\n Logger.info('Swallowing 404 deleting missing object %s %s', bucket, key);\n rval = null;\n }\n else {\n throw err;\n }\n }\n return rval;\n }\n async writeObjectToCacheFile(key, dataObject, template, bucket) {\n const json = JSON.stringify(dataObject);\n return this.writeStringToCacheFile(key, json, template, bucket);\n }\n async writeStringToCacheFile(key, dataString, template, bucket) {\n const stream = StreamRatchet.stringToWebReadableStream(dataString);\n return this.writeStreamToCacheFile(key, stream, template, bucket);\n }\n async writeStreamToCacheFile(key, data, template, bucket) {\n const params = Object.assign({}, template || {}, {\n Bucket: this.bucketVal(bucket),\n Key: key,\n Body: data,\n });\n const upload = new Upload({\n client: this.s3,\n params: params,\n tags: [],\n queueSize: 4,\n partSize: 1024 * 1024 * 5,\n leavePartsOnError: false,\n });\n upload.on('httpUploadProgress', (progress) => {\n Logger.info('Uploading : %s', progress);\n });\n const result = await upload.done();\n return result;\n }\n async synchronize(srcPrefix, targetPrefix, targetRatchet = this, recurseSubFolders = false) {\n RequireRatchet.notNullOrUndefined(srcPrefix, 'srcPrefix');\n RequireRatchet.notNullOrUndefined(targetPrefix, 'targetPrefix');\n RequireRatchet.true(srcPrefix.endsWith('/'), 'srcPrefix must end in /');\n RequireRatchet.true(targetPrefix.endsWith('/'), 'targetPrefix must end in /');\n let rval = [];\n const sourceFiles = await this.directChildrenOfPrefix(srcPrefix);\n const targetFiles = await targetRatchet.directChildrenOfPrefix(targetPrefix);\n const sw = new StopWatch();\n for (let i = 0; i < sourceFiles.length; i++) {\n const sourceFile = sourceFiles[i];\n Logger.info('Processing %s : %s', sourceFile, sw.dumpExpected(i / sourceFiles.length));\n if (sourceFile.endsWith('/')) {\n if (recurseSubFolders) {\n Logger.info('%s is a subfolder - recursing');\n const subs = await this.synchronize(srcPrefix + sourceFile, targetPrefix + sourceFile, targetRatchet, recurseSubFolders);\n Logger.info('Got %d back from %s', subs.length, sourceFile);\n rval = rval.concat(subs);\n }\n else {\n Logger.info('%s is a subfolder and recurse not specified - skipping', sourceFile);\n }\n }\n else {\n let shouldCopy = true;\n const srcMeta = await this.fetchMetaForCacheFile(srcPrefix + sourceFile);\n if (targetFiles.includes(sourceFile)) {\n const targetMeta = await targetRatchet.fetchMetaForCacheFile(targetPrefix + sourceFile);\n if (srcMeta.ETag === targetMeta.ETag) {\n Logger.debug('Skipping - identical');\n shouldCopy = false;\n }\n }\n if (shouldCopy) {\n Logger.debug('Copying...');\n const srcStream = await this.fetchCacheFileAsReadableStream(srcPrefix + sourceFile);\n try {\n const written = await targetRatchet.writeStreamToCacheFile(targetPrefix + sourceFile, srcStream, srcMeta, undefined);\n Logger.silly('Write result : %j', written);\n rval.push(sourceFile);\n }\n catch (err) {\n Logger.error('Failed to sync : %s : %s', sourceFile, err);\n }\n }\n }\n }\n Logger.info('Found %d files, copied %d', sourceFiles.length, rval.length);\n sw.log();\n return rval;\n }\n async fetchMetaForCacheFile(key, bucket = null) {\n let rval = null;\n try {\n rval = await this.s3.send(new HeadObjectCommand({\n Bucket: this.bucketVal(bucket),\n Key: key,\n }));\n }\n catch (err) {\n if (err && err['statusCode'] == 404) {\n Logger.info('Cache file %s %s not found returning null', this.bucketVal(bucket), key);\n rval = null;\n }\n else {\n Logger.error('Unrecognized error, rethrowing : %s', err, err);\n throw err;\n }\n }\n return rval;\n }\n async cacheFileAgeInSeconds(key, bucket = null) {\n try {\n const res = await this.fetchMetaForCacheFile(key, bucket);\n if (res && res.LastModified) {\n return Math.floor((new Date().getTime() - res.LastModified.getTime()) / 1000);\n }\n else {\n Logger.warn('Cache file %s %s had no last modified returning null', this.bucketVal(bucket), key);\n return null;\n }\n }\n catch (err) {\n if (err && err['statusCode'] == 404) {\n Logger.warn('Cache file %s %s not found returning null', this.bucketVal(bucket), key);\n return null;\n }\n else {\n throw err;\n }\n }\n }\n async copyFile(srcKey, dstKey, srcBucket = null, dstBucket = null) {\n const params = {\n CopySource: '/' + this.bucketVal(srcBucket) + '/' + srcKey,\n Bucket: this.bucketVal(dstBucket),\n Key: dstKey,\n MetadataDirective: 'COPY',\n };\n const rval = await this.s3.send(new CopyObjectCommand(params));\n return rval;\n }\n async quietCopyFile(srcKey, dstKey, srcBucket = null, dstBucket = null) {\n let rval = false;\n try {\n const tmp = await this.copyFile(srcKey, dstKey, srcBucket, dstBucket);\n rval = true;\n }\n catch (err) {\n Logger.silly('Failed to copy file in S3 : %s', err);\n }\n return rval;\n }\n async preSignedDownloadUrlForCacheFile(key, expirationSeconds = 3600, bucket = null) {\n const getCommand = {\n Bucket: this.bucketVal(bucket),\n Key: key,\n };\n const link = await getSignedUrl(this.s3, new GetObjectCommand(getCommand), { expiresIn: expirationSeconds });\n return link;\n }\n async directChildrenOfPrefix(prefix, expandFiles = false, bucket = null, maxToReturn = null) {\n const returnValue = [];\n const params = {\n Bucket: this.bucketVal(bucket),\n Prefix: prefix,\n Delimiter: '/',\n };\n let response = null;\n do {\n response = await this.s3.send(new ListObjectsCommand(params));\n const prefixLength = prefix.length;\n if (response['CommonPrefixes']) {\n response['CommonPrefixes'].forEach((cp) => {\n if (!maxToReturn || returnValue.length < maxToReturn) {\n const value = cp['Prefix'].substring(prefixLength);\n returnValue.push(value);\n }\n });\n }\n if (response['Contents']) {\n await Promise.all(response['Contents'].map(async (cp) => {\n if (!maxToReturn || returnValue.length < maxToReturn) {\n if (expandFiles) {\n const expanded = {\n link: await this.preSignedDownloadUrlForCacheFile(cp['Key'], 3600, bucket),\n name: cp['Key'].substring(prefixLength),\n size: cp['Size'],\n };\n returnValue.push(expanded);\n }\n else {\n returnValue.push(cp['Key'].substring(prefixLength));\n }\n }\n }));\n }\n params.Marker = response.NextMarker;\n } while (params.Marker && (!maxToReturn || returnValue.length < maxToReturn));\n return returnValue;\n }\n async allSubFoldersOfPrefix(prefix, bucket = null) {\n const returnValue = [prefix];\n let idx = 0;\n while (idx < returnValue.length) {\n const next = returnValue[idx++];\n Logger.debug('Pulling %s (%d remaining)', next, returnValue.length - idx);\n const req = {\n Bucket: this.bucketVal(bucket),\n Prefix: next,\n Delimiter: '/',\n };\n let resp = null;\n do {\n req.ContinuationToken = resp ? resp.NextContinuationToken : null;\n resp = await this.s3.send(new ListObjectsCommand(req));\n resp.CommonPrefixes.forEach((p) => {\n returnValue.push(p.Prefix);\n });\n Logger.debug('g:%j', resp);\n } while (resp.NextContinuationToken);\n }\n return returnValue;\n }\n bucketVal(explicitBucket) {\n const rval = explicitBucket ? explicitBucket : this.defaultBucket;\n if (!rval) {\n throw 'You must set either the default bucket or pass it explicitly';\n }\n return rval;\n }\n}\n//# sourceMappingURL=s3-cache-ratchet.js.map","import { Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { S3CacheRatchet } from '../s3/s3-cache-ratchet.js';\nimport { DaemonUtil } from './daemon-util.js';\nexport class Daemon {\n s3;\n bucket;\n prefix;\n _defaultGroup;\n jwtRatchet;\n static DEFAULT_DEFAULT_GROUP = 'DEFAULT';\n cache;\n constructor(s3, bucket, prefix = '', _defaultGroup = Daemon.DEFAULT_DEFAULT_GROUP, jwtRatchet) {\n this.s3 = s3;\n this.bucket = bucket;\n this.prefix = prefix;\n this._defaultGroup = _defaultGroup;\n this.jwtRatchet = jwtRatchet;\n this.cache = new S3CacheRatchet(this.s3, this.bucket);\n }\n get defaultGroup() {\n return this._defaultGroup;\n }\n async keyToPublicToken(key, expirationSeconds) {\n RequireRatchet.notNullOrUndefined(this.jwtRatchet, 'You must set jwtRatchet if you wish to use public tokens');\n RequireRatchet.notNullOrUndefined(key, 'key');\n RequireRatchet.true(expirationSeconds > 0, 'Expiration seconds must be larger than 0');\n const token = { daemonKey: key };\n const publicToken = await this.jwtRatchet.createTokenString(token, expirationSeconds);\n return publicToken;\n }\n keyToPath(key) {\n return Buffer.from(key, 'base64').toString();\n }\n pathToKey(path) {\n return Buffer.from(path).toString('base64');\n }\n generatePath(group = this._defaultGroup) {\n return this.generatePrefix(group) + StringRatchet.createType4Guid();\n }\n generatePrefix(group = this._defaultGroup) {\n return this.prefix + group + '/';\n }\n async start(options) {\n options.group = options.group || this._defaultGroup;\n const path = this.generatePath(options.group);\n const key = this.pathToKey(path);\n return DaemonUtil.start(this.cache, key, path, options);\n }\n async writeState(newState, contents) {\n const key = this.keyToPath(newState.id);\n return DaemonUtil.writeState(this.cache, key, newState, contents);\n }\n async clean(group = this._defaultGroup, olderThanSeconds = 60 * 60 * 24 * 7) {\n try {\n Logger.info('Daemon removing items older than %d seconds from group %s', olderThanSeconds, group);\n const original = await this.list(group);\n const now = new Date().getTime();\n const removed = [];\n for (let i = 0; i < original.length; i++) {\n const test = original[i];\n const ageSeconds = (now - test.startedEpochMS) / 1000;\n if (ageSeconds > olderThanSeconds) {\n const remove = await this.cache.removeCacheFile(this.keyToPath(test.id));\n removed.push(test);\n }\n }\n Logger.debug('Removed %d of %d items', removed.length, original.length);\n return removed;\n }\n catch (err) {\n Logger.error('Error while trying to clean a daemon: %j %s', group, err);\n throw err;\n }\n }\n async listKeys(group = this._defaultGroup) {\n try {\n const prefix = this.generatePrefix(group);\n Logger.info('Fetching children of %s', prefix);\n const rval = await this.cache.directChildrenOfPrefix(prefix);\n Logger.debug('Found : %j', rval);\n return rval;\n }\n catch (err) {\n Logger.error('Error while trying to list daemon keys: %j %s', group, err);\n throw err;\n }\n }\n async list(group = this._defaultGroup) {\n try {\n const prefix = this.generatePrefix(group);\n Logger.info('Fetching children of %s', prefix);\n const keys = await this.listKeys(group);\n const proms = keys.map((k) => this.stat(this.pathToKey(this.generatePrefix(group) + k)));\n const rval = await Promise.all(proms);\n return rval;\n }\n catch (err) {\n Logger.error('Error while trying to list daemon states: %j %s', group, err);\n throw err;\n }\n }\n async updateMessage(id, newMessage) {\n const itemPath = this.keyToPath(id);\n return DaemonUtil.updateMessage(this.cache, itemPath, newMessage);\n }\n async stat(key) {\n const itemPath = this.keyToPath(key);\n return DaemonUtil.stat(this.cache, itemPath);\n }\n async statFromPublicToken(publicToken) {\n RequireRatchet.notNullOrUndefined(this.jwtRatchet, 'You must set jwtRatchet if you wish to use public tokens');\n RequireRatchet.notNullOrUndefined(publicToken, 'publicToken');\n const parsed = await this.jwtRatchet.decodeToken(publicToken);\n const key = parsed?.daemonKey;\n return key ? this.stat(key) : null;\n }\n async abort(id) {\n return DaemonUtil.abort(this.cache, this.keyToPath(id));\n }\n async error(id, error) {\n return DaemonUtil.error(this.cache, this.keyToPath(id), error);\n }\n async finalize(id, contents) {\n return DaemonUtil.finalize(this.cache, this.keyToPath(id), contents);\n }\n}\n//# sourceMappingURL=daemon.js.map","import { MapRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { DateTime } from 'luxon';\nexport class PrototypeDao {\n provider;\n cfg;\n static defaultDaoConfig() {\n return {\n guidCreateFunction: StringRatchet.createType4Guid,\n guidFieldName: 'guid',\n createdEpochMSFieldName: 'createdEpochMS',\n updatedEpochMSFieldName: 'updatedEpochMS',\n createdUtcTimestampFieldName: null,\n updatedUtcTimestampFieldName: null,\n };\n }\n constructor(provider, cfg = PrototypeDao.defaultDaoConfig()) {\n this.provider = provider;\n this.cfg = cfg;\n RequireRatchet.notNullOrUndefined(provider, 'provider');\n RequireRatchet.notNullOrUndefined(cfg, 'cfg');\n RequireRatchet.notNullOrUndefined(cfg.guidCreateFunction, 'cfg.guidCreateFunction');\n RequireRatchet.notNullOrUndefined(cfg.guidFieldName, 'cfg.guidFieldName');\n }\n async fetchAll() {\n const db = await this.provider.loadDatabase();\n return db.items || [];\n }\n async resetDatabase() {\n await this.provider.storeDatabase({ items: [], lastModifiedEpochMS: Date.now() });\n }\n async removeItems(guids) {\n let old = await this.fetchAll();\n if (guids) {\n old = old.filter((t) => !guids.includes(t[this.cfg.guidFieldName]));\n await this.provider.storeDatabase({ items: old, lastModifiedEpochMS: Date.now() });\n }\n return old;\n }\n async store(value) {\n let old = await this.fetchAll();\n if (value) {\n value[this.cfg.guidFieldName] = value[this.cfg.guidFieldName] || this.cfg.guidCreateFunction();\n if (this.cfg.createdEpochMSFieldName) {\n value[this.cfg.createdEpochMSFieldName] = value[this.cfg.createdEpochMSFieldName] || Date.now();\n }\n if (this.cfg.createdUtcTimestampFieldName) {\n value[this.cfg.createdUtcTimestampFieldName] = value[this.cfg.createdUtcTimestampFieldName] || DateTime.utc().toISO();\n }\n if (this.cfg.updatedEpochMSFieldName) {\n value[this.cfg.updatedEpochMSFieldName] = Date.now();\n }\n if (this.cfg.updatedUtcTimestampFieldName) {\n value[this.cfg.updatedUtcTimestampFieldName] = DateTime.utc().toISO();\n }\n old = old.filter((t) => t[this.cfg.guidFieldName] !== value[this.cfg.guidFieldName]);\n old.push(value);\n await this.provider.storeDatabase({ items: old, lastModifiedEpochMS: Date.now() });\n }\n return value;\n }\n async fetchById(guid) {\n const old = await this.fetchAll();\n return old.find((t) => t[this.cfg.guidFieldName] === guid);\n }\n async searchByField(fieldDotPath, fieldValue) {\n RequireRatchet.notNullOrUndefined(fieldDotPath, 'fieldDotPath');\n RequireRatchet.notNullOrUndefined(fieldValue, 'fieldValue');\n const map = {};\n map[fieldDotPath] = fieldValue;\n return this.searchByFieldMap(map);\n }\n async searchByFieldMap(input) {\n RequireRatchet.notNullOrUndefined(input, 'input');\n let old = await this.fetchAll();\n old = old.filter((t) => {\n let matchAll = true;\n Object.keys(input).forEach((k) => {\n const val = MapRatchet.findValueDotPath(t, k);\n const fieldValue = input[k];\n matchAll = matchAll && val === fieldValue;\n });\n return matchAll;\n });\n return old;\n }\n}\n//# sourceMappingURL=prototype-dao.js.map","import { RequireRatchet } from '@bitblit/ratchet-common';\nexport class S3PrototypeDaoProvider {\n s3CacheRatchet;\n keyName;\n constructor(s3CacheRatchet, keyName) {\n this.s3CacheRatchet = s3CacheRatchet;\n this.keyName = keyName;\n RequireRatchet.notNullOrUndefined(s3CacheRatchet, 's3CacheRatchet');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(keyName, 'keyName');\n }\n async storeDatabase(inDb) {\n const toSave = inDb || { items: [], lastModifiedEpochMS: null };\n toSave.lastModifiedEpochMS = Date.now();\n const put = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyName, toSave);\n const rval = !!put;\n return rval;\n }\n async loadDatabase() {\n const rval = (await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyName)) || {\n items: [],\n lastModifiedEpochMS: Date.now(),\n };\n return rval;\n }\n}\n//# sourceMappingURL=s3-prototype-dao-provider.js.map","import { Logger, StringRatchet } from '@bitblit/ratchet-common';\nexport class S3SimpleDao {\n cache;\n prefix;\n constructor(cache, prefix) {\n this.cache = cache;\n this.prefix = prefix;\n if (!cache) {\n throw new Error('cache object may not be null');\n }\n if (!cache.getDefaultBucket()) {\n throw new Error('Supplied cache must have default bucket set');\n }\n }\n buildPathPrefix(path) {\n let rval = '';\n if (this.prefix) {\n rval += this.prefix;\n }\n if (path) {\n rval += path;\n }\n return rval;\n }\n buildFullPath(id, path) {\n let rval = this.buildPathPrefix(path);\n if (rval.length > 0) {\n rval += '/';\n }\n rval += id + '.json';\n return rval;\n }\n async exists(id, path) {\n const fullPath = this.buildFullPath(id, path);\n Logger.debug('Check file existence : %s', fullPath);\n return this.cache.fileExists(fullPath);\n }\n async fetch(id, path) {\n const fullPath = this.buildFullPath(id, path);\n Logger.debug('Fetching : %s', fullPath);\n const rval = (await this.cache.fetchCacheFileAsObject(fullPath));\n rval.id = id;\n rval.path = path;\n return rval;\n }\n async store(item, path) {\n item.id = item.id || StringRatchet.createType4Guid();\n item.lastModifiedEpochMS = new Date().getTime();\n const fullPath = this.buildFullPath(item.id, path);\n Logger.debug('Storing : %s', fullPath);\n const stored = await this.cache.writeObjectToCacheFile(fullPath, item);\n const read = await this.fetch(item.id, path);\n return read;\n }\n async listItems(path) {\n const fullPath = this.buildPathPrefix(path);\n Logger.debug('Listing : %s', fullPath);\n const rval = await this.cache.directChildrenOfPrefix(fullPath);\n return rval;\n }\n async fetchItemsInPath(path) {\n const fullPath = this.buildPathPrefix(path);\n Logger.debug('Full fetch of : %s', fullPath);\n const items = await this.listItems(path);\n const promises = items.map((s) => this.fetch(s, path));\n const rval = await Promise.all(promises);\n return rval;\n }\n async delete(id, path) {\n const fullPath = this.buildFullPath(id, path);\n Logger.debug('Deleting : %s', fullPath);\n const del = await this.cache.removeCacheFile(fullPath);\n return del != null;\n }\n}\n//# sourceMappingURL=s3-simple-dao.js.map","import { BatchGetCommand, BatchWriteCommand, DeleteCommand, GetCommand, PutCommand, QueryCommand, ScanCommand, } from '@aws-sdk/lib-dynamodb';\nimport { DurationRatchet, ErrorRatchet, Logger, NumberRatchet, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nimport { UpdateItemCommand, } from '@aws-sdk/client-dynamodb';\nexport class DynamoRatchet {\n awsDDB;\n constructor(awsDDB) {\n this.awsDDB = awsDDB;\n if (!awsDDB) {\n throw 'awsDDB may not be null';\n }\n }\n get dynamoDBDocumentClient() {\n return this.awsDDB;\n }\n getDDB() {\n return this.awsDDB;\n }\n async tableIsEmpty(tableName) {\n const scan = {\n TableName: tableName,\n Limit: 1,\n };\n const ScanCommandOutput = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n return ScanCommandOutput.Items.length === 0;\n }\n async scanPromise(input) {\n return this.awsDDB.send(new ScanCommand(input));\n }\n async queryPromise(input) {\n return this.awsDDB.send(new QueryCommand(input));\n }\n async throughputSafeScanOrQuery(proc, input, maxTries, inCurrentTry) {\n let rval = null;\n if (input) {\n let currentTry = inCurrentTry ?? 0;\n do {\n currentTry++;\n try {\n rval = await proc(input);\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded scan throughput for %j : Try %d of %d (Waiting %d ms)', input, currentTry, maxTries, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else {\n throw err;\n }\n }\n } while (!rval && (!maxTries || currentTry < maxTries));\n if (!rval) {\n ErrorRatchet.throwFormattedErr('throughputSafeScan failed - tried %d times, kept running into throughput exceeded : %j', maxTries, input);\n }\n }\n return rval;\n }\n async fullyExecuteQueryCount(qry, delayMS = 0) {\n try {\n qry.Select = 'COUNT';\n Logger.debug('Executing count query : %j', qry);\n const rval = {\n count: 0,\n scannedCount: 0,\n pages: 0,\n };\n const start = new Date().getTime();\n let qryResults = null;\n const myLimit = qry.Limit;\n qry.Limit = null;\n do {\n qryResults = await this.throughputSafeScanOrQuery((o) => this.queryPromise(o), qry);\n rval.count += qryResults['Count'];\n rval.scannedCount += qryResults['ScannedCount'];\n rval.pages++;\n qry['ExclusiveStartKey'] = qryResults.LastEvaluatedKey;\n await PromiseRatchet.wait(delayMS);\n Logger.silly('Rval is now %j', rval);\n if (myLimit && rval.count >= myLimit && qry['ExclusiveStartKey']) {\n Logger.info('Aborting query since hit limit of %d', myLimit);\n qry['ExclusiveStartKey'] = null;\n }\n } while (qry['ExclusiveStartKey']);\n const end = new Date().getTime();\n Logger.debug('Finished, returned %j in %s for %j', rval, DurationRatchet.formatMsDuration(end - start, true), qry);\n return rval;\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, qry, err);\n return null;\n }\n }\n async fullyExecuteQuery(qry, delayMS = 0, softLimit = null) {\n const rval = [];\n await this.fullyExecuteProcessOverQuery(qry, async (v) => {\n rval.push(v);\n }, delayMS, softLimit);\n return rval;\n }\n async fullyExecuteProcessOverQuery(qry, proc, delayMS = 0, softLimit = null) {\n let cnt = 0;\n try {\n Logger.debug('Executing query : %j', qry);\n const start = new Date().getTime();\n Logger.debug('Pulling %j', qry);\n let qryResults = await this.throughputSafeScanOrQuery((o) => this.queryPromise(o), qry);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n let pages = 0;\n let blankPages = 0;\n while (qryResults.LastEvaluatedKey && (softLimit === null || cnt < softLimit) && !qry.Limit) {\n Logger.silly('Found more rows - requery with key %j', qryResults.LastEvaluatedKey);\n qry['ExclusiveStartKey'] = qryResults.LastEvaluatedKey;\n qryResults = await this.throughputSafeScanOrQuery((o) => this.queryPromise(o), qry);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n Logger.silly('Have processed %d items', cnt);\n pages++;\n blankPages += qryResults.Count === 0 ? 1 : 0;\n await PromiseRatchet.wait(delayMS);\n }\n const end = new Date().getTime();\n Logger.debug('Finished, processed %d rows in %s for %j (%d blank pages, %d total pages)', cnt, DurationRatchet.formatMsDuration(end - start, true), qry, blankPages, pages);\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, qry, err);\n }\n return cnt;\n }\n async fullyExecuteScanCount(scan, delayMS = 0) {\n try {\n scan.Select = 'COUNT';\n const rval = {\n count: 0,\n scannedCount: 0,\n pages: 0,\n };\n Logger.debug('Executing scan count : %j', scan);\n const start = new Date().getTime();\n let qryResults = null;\n const myLimit = scan.Limit;\n scan.Limit = null;\n do {\n qryResults = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n rval.count += qryResults['Count'];\n rval.scannedCount += qryResults['ScannedCount'];\n rval.pages++;\n scan['ExclusiveStartKey'] = qryResults?.LastEvaluatedKey;\n await PromiseRatchet.wait(delayMS);\n Logger.silly('Rval is now %j', rval);\n if (myLimit && rval.count >= myLimit && scan['ExclusiveStartKey']) {\n Logger.info('Aborting scan since hit limit of %d', myLimit);\n scan['ExclusiveStartKey'] = null;\n }\n } while (scan['ExclusiveStartKey']);\n const end = new Date().getTime();\n Logger.debug('Finished, returned %j in %s for %j', rval, DurationRatchet.formatMsDuration(end - start, true), scan);\n return rval;\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, scan, err);\n return null;\n }\n }\n async fullyExecuteScan(scan, delayMS = 0, softLimit = null) {\n const rval = [];\n await this.fullyExecuteProcessOverScan(scan, async (v) => {\n rval.push(v);\n }, delayMS, softLimit);\n return rval;\n }\n async fullyExecuteProcessOverScan(scan, proc, delayMS = 0, softLimit = null) {\n let cnt = 0;\n try {\n Logger.debug('Executing scan : %j', scan);\n const start = new Date().getTime();\n Logger.debug('Pulling %j', scan);\n let qryResults = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n while (qryResults.LastEvaluatedKey && (softLimit === null || cnt < softLimit) && !scan.Limit) {\n Logger.silly('Found more rows - requery with key %j', qryResults.LastEvaluatedKey);\n scan['ExclusiveStartKey'] = qryResults.LastEvaluatedKey;\n qryResults = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n Logger.silly('Rval is now %d items', cnt);\n await PromiseRatchet.wait(delayMS);\n }\n const end = new Date().getTime();\n Logger.debug('Finished, processed %d results in %s for %j', cnt, DurationRatchet.formatMsDuration(end - start, true), scan);\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, scan, err);\n }\n return cnt;\n }\n async writeAllInBatches(tableName, elements, batchSize) {\n if (!batchSize || batchSize < 2) {\n throw new Error('Batch size needs to be at least 2, was ' + batchSize);\n }\n let rval = 0;\n if (!!elements && elements.length > 0) {\n let batchItems = [];\n elements.forEach((el) => {\n batchItems.push({\n PutRequest: {\n Item: el,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: tableName,\n },\n });\n });\n Logger.debug('Processing %d batch items to %s', batchItems.length, tableName);\n while (batchItems.length > 0) {\n const curBatch = batchItems.slice(0, Math.min(batchItems.length, batchSize));\n batchItems = batchItems.slice(curBatch.length);\n const params = {\n RequestItems: {},\n ReturnConsumedCapacity: 'TOTAL',\n ReturnItemCollectionMetrics: 'SIZE',\n };\n params.RequestItems[tableName] = curBatch;\n let tryCount = 1;\n let done = false;\n let batchResults = null;\n while (!done && tryCount < 7) {\n try {\n batchResults = await this.awsDDB.send(new BatchWriteCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n Logger.info('Caught ProvisionedThroughputExceededException - retrying delete');\n batchResults = { UnprocessedItems: params.RequestItems };\n }\n else {\n throw err;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n const backoff = Math.pow(2, tryCount);\n Logger.warn('Found %d unprocessed items. Backing off %d seconds and trying again', batchResults.UnprocessedItems[tableName].length, backoff);\n await PromiseRatchet.wait(backoff * 1000);\n tryCount++;\n params.RequestItems[tableName] = batchResults.UnprocessedItems[tableName];\n }\n else {\n done = true;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n Logger.error('After 6 tries there were still %d unprocessed items');\n rval += curBatch.length - batchResults.UnprocessedItems[tableName].length;\n Logger.warn('FIX Unprocessed : %j', batchResults.UnprocessedItems);\n }\n else {\n rval += curBatch.length;\n }\n }\n }\n return rval;\n }\n async fetchFullObjectsMatchingKeysOnlyIndexQuery(qry, keyNames, batchSize = 25) {\n RequireRatchet.notNullOrUndefined(qry);\n RequireRatchet.notNullOrUndefined(qry.TableName);\n RequireRatchet.notNullOrUndefined(keyNames);\n RequireRatchet.true(keyNames.length > 0);\n const keyDataSrc = await this.fullyExecuteQuery(qry);\n const keysOnly = DynamoRatchet.stripAllToKeysOnly(keyDataSrc, keyNames);\n const rval = await this.fetchAllInBatches(qry.TableName, keysOnly, batchSize);\n return rval;\n }\n async fetchAllInBatches(tableName, inKeys, batchSize) {\n if (!batchSize || batchSize < 2 || batchSize > 100) {\n throw new Error('Batch size needs to be at least 2 and no more than 100, was ' + batchSize);\n }\n let rval = [];\n const batches = [];\n let remain = Object.assign([], inKeys);\n while (remain.length > 0) {\n const curBatch = remain.slice(0, Math.min(remain.length, batchSize));\n remain = remain.slice(curBatch.length);\n const tableEntry = {};\n tableEntry[tableName] = {\n Keys: curBatch,\n };\n const nextBatch = {\n RequestItems: tableEntry,\n ReturnConsumedCapacity: 'TOTAL',\n };\n batches.push(nextBatch);\n }\n Logger.debug('Created %d batches', batches.length);\n for (let i = 0; i < batches.length; i++) {\n if (batches.length > 1) {\n Logger.info('Processing batch %d of %d', i + 1, batches.length);\n }\n const input = batches[i];\n let tryCount = 1;\n do {\n Logger.silly('Pulling %j', input);\n const res = await this.awsDDB.send(new BatchGetCommand(input));\n rval = rval.concat(res.Responses[tableName]);\n if (!!res.UnprocessedKeys && !!res.UnprocessedKeys[tableName] && res.UnprocessedKeys[tableName].Keys.length > 0 && tryCount < 15) {\n Logger.silly('Found %d unprocessed, waiting', res.UnprocessedKeys[tableName].Keys);\n await PromiseRatchet.wait(Math.pow(2, tryCount) * 1000);\n tryCount++;\n }\n input.RequestItems = res.UnprocessedKeys;\n } while (!input.RequestItems && input.RequestItems[tableName].Keys.length > 0);\n }\n return rval;\n }\n async deleteAllInBatches(tableName, keys, batchSize) {\n if (!batchSize || batchSize < 2) {\n throw new Error('Batch size needs to be at least 2, was ' + batchSize);\n }\n let rval = 0;\n if (!!keys && keys.length > 0) {\n let batchItems = [];\n keys.forEach((el) => {\n batchItems.push({\n DeleteRequest: {\n Key: el,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: tableName,\n },\n });\n });\n Logger.debug('Processing %d DeleteBatch items to %s', batchItems.length, tableName);\n while (batchItems.length > 0) {\n const curBatch = batchItems.slice(0, Math.min(batchItems.length, batchSize));\n batchItems = batchItems.slice(curBatch.length);\n const params = {\n RequestItems: {},\n ReturnConsumedCapacity: 'TOTAL',\n ReturnItemCollectionMetrics: 'SIZE',\n };\n params.RequestItems[tableName] = curBatch;\n let tryCount = 1;\n let done = false;\n let batchResults = null;\n while (!done && tryCount < 7) {\n try {\n batchResults = await this.awsDDB.send(new BatchWriteCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n Logger.info('Caught ProvisionedThroughputExceededException - retrying delete');\n batchResults = { UnprocessedItems: params.RequestItems };\n }\n else {\n throw err;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n const backoff = Math.pow(2, tryCount);\n Logger.warn('Found %d unprocessed items. Backing off %d seconds and trying again', batchResults.UnprocessedItems[tableName].length, backoff);\n await PromiseRatchet.wait(backoff * 1000);\n tryCount++;\n params.RequestItems[tableName] = batchResults.UnprocessedItems[tableName];\n }\n else {\n done = true;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n Logger.error('After 6 tries there were still %d unprocessed items');\n rval += curBatch.length - batchResults.UnprocessedItems[tableName].length;\n Logger.warn('FIX Unprocessed : %j', batchResults.UnprocessedItems);\n }\n else {\n rval += curBatch.length;\n }\n Logger.debug('%d Remain, DeleteBatch Results : %j', batchItems.length, batchResults);\n }\n }\n return rval;\n }\n async simplePut(tableName, value, autoRetryCount = 3) {\n let rval = null;\n let currentTry = 0;\n const params = {\n Item: value,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: tableName,\n };\n while (!rval && currentTry < autoRetryCount) {\n try {\n rval = await this.awsDDB.send(new PutCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded write throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else {\n throw err;\n }\n }\n }\n if (!rval) {\n Logger.warn('Unable to write %j to DDB after %d tries, giving up', params, autoRetryCount);\n }\n return rval;\n }\n async simplePutOnlyIfFieldIsNullOrUndefined(tableName, value, fieldName) {\n let rval = false;\n const params = {\n Item: value,\n ReturnConsumedCapacity: 'TOTAL',\n ConditionExpression: 'attribute_not_exists(#fieldName) OR #fieldName = :null ',\n ExpressionAttributeNames: {\n '#fieldName': fieldName,\n },\n ExpressionAttributeValues: {\n ':null': null,\n },\n TableName: tableName,\n };\n try {\n const wrote = await this.awsDDB.send(new PutCommand(params));\n Logger.silly('Wrote : %j', wrote);\n rval = true;\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n Logger.debug('Exceeded write throughput for %j : (Waiting 2000 ms)', params);\n await PromiseRatchet.wait(2000);\n rval = await this.simplePutOnlyIfFieldIsNullOrUndefined(tableName, value, fieldName);\n }\n else if (err && err['code'] && err['code'] === 'ConditionalCheckFailedException') {\n Logger.debug('Failed to write %j due to null field failure');\n rval = false;\n }\n else {\n throw err;\n }\n }\n return rval;\n }\n async simplePutWithCollisionAvoidance(tableName, value, keyNames, adjustFunction, maxAdjusts = null, autoRetryCount = 3) {\n RequireRatchet.true(keyNames && keyNames.length > 0 && keyNames.length < 3, 'You must pass 1 or 2 key names');\n let pio = null;\n let currentTry = 0;\n const attrNames = {\n '#key0': keyNames[0],\n };\n const attrValues = {\n ':key0': value[keyNames[0]],\n };\n let condExp = '#key0 <> :key0';\n if (keyNames.length > 1) {\n condExp += ' AND #key1 <> :key1';\n attrNames['#key1'] = keyNames[1];\n attrValues[':key1'] = value[keyNames[1]];\n }\n const params = {\n Item: value,\n ReturnConsumedCapacity: 'TOTAL',\n ConditionExpression: condExp,\n ExpressionAttributeNames: attrNames,\n ExpressionAttributeValues: attrValues,\n TableName: tableName,\n };\n let adjustCount = 0;\n while (!pio && currentTry < autoRetryCount && (!maxAdjusts || adjustCount < maxAdjusts)) {\n try {\n pio = await this.awsDDB.send(new PutCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n currentTry++;\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded write throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n }\n else if (err && err['code'] && err['code'] === 'ConditionalCheckFailedException') {\n let newValue = Object.assign({}, params.Item);\n Logger.info('Failed to write %j due to collision - adjusting and retrying', newValue);\n newValue = adjustFunction(newValue);\n params.Item = newValue;\n params.ExpressionAttributeValues[':key0'] = newValue[keyNames[0]];\n if (keyNames.length > 1) {\n params.ExpressionAttributeValues[':key1'] = newValue[keyNames[1]];\n }\n adjustCount++;\n }\n else {\n throw err;\n }\n }\n }\n if (pio && adjustCount > 0) {\n Logger.info('After adjustment, wrote %j as %j', value, params.Item);\n }\n if (!pio) {\n Logger.warn('Unable to write %j to DDB after %d provision tries and %d adjusts, giving up', params, currentTry, adjustCount);\n }\n return pio ? params.Item : null;\n }\n async simpleGet(tableName, keys, autoRetryCount = 3) {\n let holder = null;\n let currentTry = 0;\n const params = {\n TableName: tableName,\n Key: keys,\n };\n while (!holder && currentTry < autoRetryCount) {\n try {\n holder = await this.awsDDB.send(new GetCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded read throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else {\n throw err;\n }\n }\n }\n if (!holder) {\n Logger.warn('Unable to read %j from DDB after %d tries, giving up', params, autoRetryCount);\n }\n const rval = !!holder && !!holder.Item ? Object.assign({}, holder.Item) : null;\n return rval;\n }\n static objectIsErrorWithProvisionedThroughputExceededExceptionCode(err) {\n return !!err && !!err['code'] && err['code'] === 'ProvisionedThroughputExceededException';\n }\n async simpleGetWithCounterDecrement(tableName, keys, counterAttributeName, deleteOnZero, autoRetryCount = 3) {\n let holder = null;\n let currentTry = 0;\n const params = {\n TableName: tableName,\n Key: keys,\n UpdateExpression: 'set #counter = #counter-:decVal',\n ExpressionAttributeNames: {\n '#counter': counterAttributeName,\n },\n ExpressionAttributeValues: {\n ':decVal': 1,\n ':minVal': 0,\n },\n ConditionExpression: '#counter > :minVal',\n ReturnValues: 'ALL_NEW',\n };\n let updateFailed = false;\n while (!holder && currentTry < autoRetryCount && !updateFailed) {\n try {\n holder = await this.awsDDB.send(new UpdateItemCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded update throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else if (!!err && !!err['code'] && err['code'] === 'ConditionalCheckFailedException') {\n Logger.info('Cannot fetch requested row (%j) - the update check failed', keys);\n updateFailed = true;\n }\n else {\n throw err;\n }\n }\n }\n if (!holder && !updateFailed) {\n Logger.warn('Unable to update %j from DDB after %d tries, giving up', params, autoRetryCount);\n }\n const rval = !!holder && !!holder.Attributes ? Object.assign({}, holder.Attributes) : null;\n if (deleteOnZero && rval && rval[counterAttributeName] === 0) {\n Logger.info('Delete on 0 specified, removing');\n await this.simpleDelete(tableName, keys);\n }\n return rval;\n }\n async simpleDelete(tableName, keys) {\n const params = {\n TableName: tableName,\n Key: keys,\n };\n const holder = await this.awsDDB.send(new DeleteCommand(params));\n return holder;\n }\n async atomicCounter(tableName, keys, counterFieldName, increment = 1) {\n const update = {\n TableName: tableName,\n Key: keys,\n UpdateExpression: 'SET #counterFieldName = #counterFieldName + :inc',\n ExpressionAttributeNames: {\n '#counterFieldName': counterFieldName,\n },\n ExpressionAttributeValues: {\n ':inc': increment,\n },\n ReturnValues: 'UPDATED_NEW',\n };\n const ui = await this.awsDDB.send(new UpdateItemCommand(update));\n const rval = NumberRatchet.safeNumber(ui.Attributes[counterFieldName]);\n return rval;\n }\n static cleanObject(ob) {\n if (!!ob) {\n const rem = [];\n Object.keys(ob).forEach((k) => {\n const v = ob[k];\n if (v === '') {\n rem.push(k);\n }\n else if (v instanceof Object) {\n DynamoRatchet.cleanObject(v);\n }\n });\n Logger.silly('Removing keys : %j', rem);\n rem.forEach((k) => {\n delete ob[k];\n });\n }\n }\n static stripToKeysOnly(input, keysNames) {\n let rval = null;\n if (!!input && !!keysNames && keysNames.length > 0) {\n rval = {};\n keysNames.forEach((k) => {\n if (!input[k]) {\n ErrorRatchet.throwFormattedErr('Failed key extraction on %j - missing %s', input, k);\n }\n rval[k] = input[k];\n });\n }\n return rval;\n }\n static stripAllToKeysOnly(input, keys) {\n const rval = input.map((i) => DynamoRatchet.stripToKeysOnly(i, keys));\n return rval;\n }\n}\n//# sourceMappingURL=dynamo-ratchet.js.map","import { CreateTableCommand, DeleteTableCommand, DescribeTableCommand, ListTablesCommand, ResourceNotFoundException, } from '@aws-sdk/client-dynamodb';\nimport { ErrorRatchet, Logger, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nexport class DynamoTableRatchet {\n awsDDB;\n constructor(awsDDB) {\n this.awsDDB = awsDDB;\n if (!awsDDB) {\n throw 'awsDDB may not be null';\n }\n }\n async deleteTable(tableName, waitForDelete = true) {\n RequireRatchet.notNullOrUndefined(tableName);\n const input = {\n TableName: tableName,\n };\n Logger.debug('Deleting ddb table %s', tableName);\n const rval = await this.awsDDB.send(new DeleteTableCommand(input));\n if (waitForDelete) {\n Logger.debug('Table marked for delete, waiting for deletion');\n await this.waitForTableDelete(tableName);\n }\n return rval;\n }\n async createTable(input, waitForReady = true, replaceIfExists = false) {\n RequireRatchet.notNullOrUndefined(input);\n RequireRatchet.notNullOrUndefined(input.TableName);\n Logger.debug('Creating new table : %j', input);\n const exists = await this.tableExists(input.TableName);\n if (exists) {\n if (replaceIfExists) {\n Logger.debug('Table %s exists and replace specified - deleting', input.TableName);\n await this.deleteTable(input.TableName);\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot create table %s - exists already and replace not specified', input.TableName);\n }\n }\n const rval = await this.awsDDB.send(new CreateTableCommand(input));\n if (waitForReady) {\n Logger.debug('Table created, awaiting ready');\n await this.waitForTableReady(input.TableName);\n }\n return rval;\n }\n async waitForTableReady(tableName) {\n let rval = true;\n let out = await this.safeDescribeTable(tableName);\n while (!!out && !!out.Table && out.Table.TableStatus !== 'ACTIVE') {\n Logger.silly('Table not ready - waiting 2 seconds');\n await PromiseRatchet.wait(2000);\n out = await this.safeDescribeTable(tableName);\n }\n if (!out && !out.Table) {\n Logger.warn('Cannot wait for %s to be ready - table does not exist', tableName);\n rval = false;\n }\n return rval;\n }\n async waitForTableDelete(tableName) {\n let out = await this.safeDescribeTable(tableName);\n while (!!out) {\n Logger.silly('Table %s still exists, waiting 2 seconds (State is %s)', tableName, out.Table.TableStatus);\n await PromiseRatchet.wait(2000);\n out = await this.safeDescribeTable(tableName);\n }\n }\n async tableExists(tableName) {\n const desc = await this.safeDescribeTable(tableName);\n return !!desc;\n }\n async listAllTables() {\n const input = {};\n let rval = [];\n do {\n const out = await this.awsDDB.send(new ListTablesCommand(input));\n rval = rval.concat(out.TableNames);\n input.ExclusiveStartTableName = out.LastEvaluatedTableName;\n } while (input.ExclusiveStartTableName);\n return rval;\n }\n async safeDescribeTable(tableName) {\n try {\n const out = await this.awsDDB.send(new DescribeTableCommand({ TableName: tableName }));\n return out;\n }\n catch (err) {\n if (err instanceof ResourceNotFoundException) {\n return null;\n }\n else {\n throw err;\n }\n }\n }\n async copyTable(srcTableName, dstTableName, overrides, copyData) {\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(srcTableName, 'srcTableName');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(dstTableName, 'dstTableName');\n if (copyData) {\n throw ErrorRatchet.fErr('Cannot copy %s to %s - copy data not supported yet', srcTableName, dstTableName);\n }\n const srcTableDef = await this.safeDescribeTable(srcTableName);\n if (await this.tableExists(dstTableName)) {\n throw ErrorRatchet.fErr('Cannot copy to %s - table already exists', dstTableName);\n }\n if (!srcTableDef) {\n throw ErrorRatchet.fErr('Cannot copy %s - doesnt exist', srcTableName);\n }\n const ads = srcTableDef.Table.AttributeDefinitions;\n const ks = srcTableDef.Table.KeySchema;\n const gi = srcTableDef.Table.GlobalSecondaryIndexes;\n const createInput = Object.assign({}, overrides || {}, {\n AttributeDefinitions: srcTableDef.Table.AttributeDefinitions,\n TableName: dstTableName,\n KeySchema: srcTableDef.Table.KeySchema,\n LocalSecondaryIndexes: srcTableDef.Table.LocalSecondaryIndexes,\n GlobalSecondaryIndexes: srcTableDef.Table.GlobalSecondaryIndexes.map((gi) => {\n const output = gi;\n if (output.ProvisionedThroughput?.WriteCapacityUnits === 0 || output.ProvisionedThroughput?.ReadCapacityUnits === 0) {\n output.ProvisionedThroughput = undefined;\n }\n return output;\n }),\n BillingMode: srcTableDef.Table.BillingModeSummary.BillingMode,\n ProvisionedThroughput: srcTableDef.Table.BillingModeSummary.BillingMode === 'PROVISIONED'\n ? srcTableDef.Table.ProvisionedThroughput\n : undefined,\n StreamSpecification: srcTableDef.Table.StreamSpecification,\n SSESpecification: srcTableDef.Table.SSEDescription,\n Tags: undefined,\n TableClass: srcTableDef.Table.TableClassSummary?.TableClass,\n DeletionProtectionEnabled: srcTableDef.Table.DeletionProtectionEnabled,\n });\n const rval = await this.awsDDB.send(new CreateTableCommand(createInput));\n return rval;\n }\n}\n//# sourceMappingURL=dynamo-table-ratchet.js.map","import { ErrorRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class HashSpreader {\n spots;\n buckets;\n separator;\n alphabet;\n _allSlots;\n constructor(spots = 3, buckets = 16, separator = '_', alphabet = '0123456789ABCDEF') {\n this.spots = spots;\n this.buckets = buckets;\n this.separator = separator;\n this.alphabet = alphabet;\n RequireRatchet.true(spots > 0, 'Spots must be larger than 0');\n RequireRatchet.true(buckets > 1, 'Buckets must be larger than 1');\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(alphabet), 'Alphabet may not be null or empty');\n RequireRatchet.true(StringRatchet.allUnique(alphabet), 'Alphabet must be unique');\n RequireRatchet.true(StringRatchet.stringContainsOnlyAlphanumeric(alphabet), 'Alphabet must be alphanumeric');\n const permutations = Math.pow(alphabet.length, spots);\n RequireRatchet.true(buckets < permutations, 'Buckets must be less than permutations (' + buckets + ' / ' + permutations + ')');\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(this.separator), 'Separator must be nonnull and nonempty');\n const allPerms = StringRatchet.allPermutationsOfLength(spots, alphabet);\n this._allSlots = allPerms.slice(0, buckets);\n }\n get allBuckets() {\n return Object.assign([], this._allSlots);\n }\n get randomBucket() {\n return this._allSlots[Math.floor(Math.random() * this.buckets)];\n }\n allSpreadValues(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot spread null/empty value');\n const rval = this._allSlots.map((s) => input + this.separator + s);\n return rval;\n }\n allSpreadValuesForArray(inputs) {\n RequireRatchet.true(inputs && inputs.length > 0, 'Cannot spread null/empty array');\n let rval = [];\n inputs.forEach((i) => {\n rval = rval.concat(this.allSpreadValues(i));\n });\n return rval;\n }\n addSpreader(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot spread null/empty value');\n return input + this.separator + this.randomBucket;\n }\n extractBucket(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot extract from null or empty value');\n const loc = input.length - this.spots;\n if (loc < 0 || input.charAt(loc) !== this.separator) {\n ErrorRatchet.throwFormattedErr('Cannot extract bucket, not created by this spreader (missing %s at location %d)', this.separator, loc);\n }\n return input.substring(loc);\n }\n removeBucket(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot extract from null or empty value');\n const loc = input.length - this.spots;\n if (loc < 0 || input.charAt(loc) !== this.separator) {\n ErrorRatchet.throwFormattedErr('Cannot remove bucket, not created by this spreader (missing %s at location %d)', this.separator, loc);\n }\n return input.substring(0, loc);\n }\n}\n//# sourceMappingURL=hash-spreader.js.map","import { DescribeInstancesCommand, EC2Client, StartInstancesCommand, StopInstancesCommand, } from '@aws-sdk/client-ec2';\nimport { EC2InstanceConnectClient, SendSSHPublicKeyCommand, } from '@aws-sdk/client-ec2-instance-connect';\nimport { DurationRatchet, Logger, PromiseRatchet } from '@bitblit/ratchet-common';\nexport class Ec2Ratchet {\n region;\n availabilityZone;\n ec2;\n ec2InstanceConnect;\n constructor(region = 'us-east-1', availabilityZone = 'us-east-1a') {\n this.region = region;\n this.availabilityZone = availabilityZone;\n this.ec2 = new EC2Client({ region: region });\n this.ec2InstanceConnect = new EC2InstanceConnectClient({ region: region });\n }\n get eC2Client() {\n return this.ec2;\n }\n get eC2InstanceConnectClient() {\n return this.ec2InstanceConnect;\n }\n async stopInstance(instanceId, maxWaitForShutdownMS = 0) {\n let rval = true;\n try {\n const stopParams = {\n InstanceIds: [instanceId],\n DryRun: false,\n };\n Logger.info('About to stop instances : %j', stopParams);\n await this.ec2.send(new StopInstancesCommand(stopParams));\n Logger.info('Stop instance command sent, waiting on shutdown');\n let status = await this.describeInstance(instanceId);\n if (maxWaitForShutdownMS > 0) {\n const start = new Date().getTime();\n while (!!status && status.State.Code !== 16 && new Date().getTime() - start < maxWaitForShutdownMS) {\n Logger.debug('Instance status is %j - waiting for 5 seconds (up to %s)', status.State, DurationRatchet.formatMsDuration(maxWaitForShutdownMS));\n await PromiseRatchet.wait(5000);\n status = await this.describeInstance(instanceId);\n }\n }\n }\n catch (err) {\n Logger.error('Failed to stop instance %s : %s', instanceId, err, err);\n rval = false;\n }\n return rval;\n }\n async launchInstance(instanceId, maxWaitForStartupMS = 0) {\n let rval = true;\n try {\n const startParams = {\n InstanceIds: [instanceId],\n DryRun: false,\n };\n Logger.info('About to start instance : %j', startParams);\n await this.ec2.send(new StartInstancesCommand(startParams));\n Logger.info('Start instance command sent, waiting on startup');\n let status = await this.describeInstance(instanceId);\n if (maxWaitForStartupMS > 0) {\n const start = new Date().getTime();\n while (!!status && status.State.Code !== 16 && new Date().getTime() - start < maxWaitForStartupMS) {\n Logger.debug('Instance status is %j - waiting for 5 seconds (up to %s)', status.State, DurationRatchet.formatMsDuration(maxWaitForStartupMS));\n await PromiseRatchet.wait(5000);\n status = await this.describeInstance(instanceId);\n }\n }\n if (!!status && !!status.PublicIpAddress) {\n Logger.info('Instance address is %s', status.PublicIpAddress);\n Logger.info('SSH command : ssh -i path_to_pem_file ec2-user@%s', status.PublicIpAddress);\n }\n }\n catch (err) {\n Logger.error('Failed to start instance %s : %s', instanceId, err, err);\n rval = false;\n }\n return rval;\n }\n async describeInstance(instanceId) {\n const res = await this.listAllInstances([instanceId]);\n return res.length === 1 ? res[0] : null;\n }\n async listAllInstances(instanceIds = []) {\n let rval = [];\n const req = {\n NextToken: null,\n };\n if (instanceIds && instanceIds.length > 0) {\n req.InstanceIds = instanceIds;\n }\n do {\n Logger.debug('Pulling instances... (%j)', req);\n const res = await this.ec2.send(new DescribeInstancesCommand(req));\n res.Reservations.forEach((r) => {\n rval = rval.concat(r.Instances);\n });\n req.NextToken = res.NextToken;\n } while (req.NextToken);\n Logger.debug('Finished pulling instances (found %d)', rval.length);\n return rval;\n }\n async sendPublicKeyToEc2Instance(instanceId, publicKeyString, instanceOsUser) {\n const userName = instanceOsUser || 'ec2-user';\n const req = {\n InstanceId: instanceId,\n AvailabilityZone: this.availabilityZone,\n InstanceOSUser: userName,\n SSHPublicKey: publicKeyString,\n };\n const rval = await this.ec2InstanceConnect.send(new SendSSHPublicKeyCommand(req));\n return rval;\n }\n}\n//# sourceMappingURL=ec2-ratchet.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class CascadeEnvironmentServiceProvider {\n providers;\n constructor(providers) {\n this.providers = providers;\n RequireRatchet.notNullOrUndefined(providers);\n RequireRatchet.true(providers.length > 0);\n }\n async fetchConfig(name) {\n Logger.silly('CascadeEnvironmentServiceProvider fetch for %s', name);\n let rval = null;\n for (let i = 0; i < this.providers.length && !rval; i++) {\n try {\n rval = await this.providers[i].fetchConfig(name);\n }\n catch (err) {\n Logger.error('Provider %d failed - trying next : %s', i, err, err);\n rval = null;\n }\n }\n return rval;\n }\n}\n//# sourceMappingURL=cascade-environment-service-provider.js.map","import { ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class EnvVarEnvironmentServiceProvider {\n envVarName;\n constructor(envVarName) {\n this.envVarName = envVarName;\n RequireRatchet.notNullOrUndefined(envVarName);\n }\n async fetchConfig() {\n Logger.silly('EnvVarEnvironmentServiceProvider fetch for %s', this.envVarName);\n let rval = null;\n const src = process ? process.env : global ? global : {};\n const toParse = StringRatchet.trimToNull(src[this.envVarName]);\n if (toParse) {\n try {\n rval = JSON.parse(toParse);\n }\n catch (err) {\n Logger.error('Failed to read env - null or invalid JSON : %s : %s', err, toParse, err);\n throw err;\n }\n }\n else {\n ErrorRatchet.throwFormattedErr('Could not find env var with name : %s', this.envVarName);\n }\n return rval;\n }\n}\n//# sourceMappingURL=env-var-environment-service-provider.js.map","import { ErrorRatchet, Logger, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nexport class EnvironmentService {\n provider;\n cfg;\n readPromiseCache = new Map();\n static defaultEnvironmentServiceConfig() {\n const rval = {\n maxRetries: 3,\n backoffMultiplierMS: 500,\n };\n return rval;\n }\n constructor(provider, cfg = EnvironmentService.defaultEnvironmentServiceConfig()) {\n this.provider = provider;\n this.cfg = cfg;\n RequireRatchet.notNullOrUndefined(provider);\n RequireRatchet.notNullOrUndefined(cfg);\n }\n async getConfig(name) {\n Logger.silly('EnvService:Request to read config %s', name);\n if (!this.readPromiseCache.has(name)) {\n Logger.silly('EnvService: Nothing in cache - adding');\n this.readPromiseCache.set(name, this.getConfigUncached(name));\n }\n return this.readPromiseCache.get(name);\n }\n async getConfigUncached(name) {\n let tryCount = 1;\n let rval = null;\n while (!rval && tryCount < this.cfg.maxRetries) {\n tryCount++;\n Logger.silly('Attempting fetch of %s', name);\n try {\n rval = await this.provider.fetchConfig(name);\n }\n catch (err) {\n const waitMS = tryCount * this.cfg.backoffMultiplierMS;\n Logger.info('Error attempting to fetch config %s (try %d of %d, waiting %s MS): %s', name, tryCount, this.cfg.maxRetries, waitMS, err, err);\n await PromiseRatchet.wait(waitMS);\n }\n }\n if (!rval) {\n ErrorRatchet.throwFormattedErr('Was unable to fetch config %s even after %d retries', name, this.cfg.maxRetries);\n }\n return rval;\n }\n}\n//# sourceMappingURL=environment-service.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class FixedEnvironmentServiceProvider {\n value;\n constructor(value) {\n this.value = value;\n RequireRatchet.notNullOrUndefined(value);\n }\n static fromRecord(record) {\n const m = new Map();\n Object.keys(record).forEach((k) => {\n m.set(k, record[k]);\n });\n return new FixedEnvironmentServiceProvider(m);\n }\n async fetchConfig(name) {\n Logger.silly('FixedEnvironmentServiceProvider fetch for %s', name);\n const rval = this.value.get(name);\n return rval;\n }\n}\n//# sourceMappingURL=fixed-environment-service-provider.js.map","import { S3CacheRatchet } from '../s3/s3-cache-ratchet.js';\nimport { Logger, RequireRatchet, StopWatch, StringRatchet } from '@bitblit/ratchet-common';\nimport { S3Client } from '@aws-sdk/client-s3';\nexport class S3EnvironmentServiceProvider {\n cfg;\n ratchet;\n constructor(cfg) {\n this.cfg = cfg;\n RequireRatchet.notNullOrUndefined(cfg);\n RequireRatchet.notNullOrUndefined(cfg.bucketName);\n RequireRatchet.notNullOrUndefined(cfg.region);\n RequireRatchet.true(!!cfg.s3Override || !!cfg.region, 'You must set either region or S3Override');\n const s3 = cfg.s3Override || new S3Client({ region: cfg.region });\n this.ratchet = new S3CacheRatchet(s3, cfg.bucketName);\n }\n async fetchConfig(name) {\n const readPath = StringRatchet.trimToEmpty(this.cfg.pathPrefix) + name + StringRatchet.trimToEmpty(this.cfg.pathSuffix);\n Logger.silly('S3EnvironmentServiceProvider:Request to read config from : %s / %s', this.cfg.bucketName, readPath);\n const sw = new StopWatch();\n const rval = await this.ratchet.fetchCacheFileAsObject(readPath);\n sw.log();\n return rval;\n }\n}\n//# sourceMappingURL=s3-environment-service-provider.js.map","import { ErrorRatchet, Logger, PromiseRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { GetParameterCommand, SSMClient } from '@aws-sdk/client-ssm';\nexport class SsmEnvironmentServiceProvider {\n region;\n ssmEncrypted;\n ssm;\n constructor(region = 'us-east-1', ssmEncrypted = true) {\n this.region = region;\n this.ssmEncrypted = ssmEncrypted;\n RequireRatchet.notNullOrUndefined(region);\n RequireRatchet.notNullOrUndefined(ssmEncrypted);\n this.ssm = new SSMClient({ region: this.region });\n }\n async fetchConfig(name) {\n Logger.silly('SsmEnvironmentServiceProvider fetch for %s', name);\n const params = {\n Name: name,\n WithDecryption: this.ssmEncrypted,\n };\n let rval = null;\n let toParse = null;\n try {\n const value = await this.ssm.send(new GetParameterCommand(params));\n toParse = StringRatchet.trimToNull(value?.Parameter?.Value);\n }\n catch (err) {\n const errCode = err['code'] || '';\n if (errCode.toLowerCase().indexOf('throttlingexception') !== -1) {\n Logger.warn('Throttled while trying to read parameters - waiting 1 second before allowing retry');\n await PromiseRatchet.wait(1_000);\n }\n else if (errCode.toLowerCase().indexOf('parameternotfound') !== -1) {\n const errMsg = Logger.warn('AWS could not find parameter %s - are you using the right AWS key?', name);\n throw new Error(errMsg);\n }\n else {\n Logger.error('Final environment fetch error (cannot retry) : %s', err, err);\n throw err;\n }\n }\n if (toParse) {\n try {\n rval = JSON.parse(toParse);\n }\n catch (err) {\n Logger.error('Failed to read env - null or invalid JSON : %s : %s', err, toParse, err);\n throw err;\n }\n }\n else {\n ErrorRatchet.throwFormattedErr('Could not find system parameter with name : %s in this account', name);\n }\n return rval;\n }\n}\n//# sourceMappingURL=ssm-environment-service-provider.js.map","export class DynamoExpiringCodeProvider {\n tableName;\n dynamoRatchet;\n constructor(tableName, dynamoRatchet) {\n this.tableName = tableName;\n this.dynamoRatchet = dynamoRatchet;\n }\n async checkCode(code, context, deleteOnMatch) {\n const keys = { code: code, context: context };\n const expCode = await this.dynamoRatchet.simpleGet(this.tableName, keys);\n const rval = expCode && expCode.expiresEpochMS > Date.now();\n if (rval && deleteOnMatch) {\n await this.dynamoRatchet.simpleDelete(this.tableName, keys);\n }\n return rval;\n }\n async storeCode(code) {\n const output = await this.dynamoRatchet.simplePut(this.tableName, code);\n return output && output.ConsumedCapacity.CapacityUnits > 0;\n }\n async createTableIfMissing(dtr) {\n return null;\n }\n}\n//# sourceMappingURL=dynamo-expiring-code-provider.js.map","import { RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class ExpiringCodeRatchet {\n provider;\n constructor(provider) {\n this.provider = provider;\n }\n static generateCode(params) {\n RequireRatchet.notNullOrUndefined(params, 'params');\n RequireRatchet.notNullOrUndefined(params.context, 'params.context');\n RequireRatchet.notNullOrUndefined(params.length, 'params.length');\n RequireRatchet.notNullOrUndefined(params.alphabet, 'params.alphabet');\n let code = '';\n for (let i = 0; i < params.length; i++) {\n code += params.alphabet.charAt(Math.floor(params.alphabet.length * Math.random()));\n }\n const rval = {\n code: code,\n context: params.context,\n tags: params.tags,\n expiresEpochMS: Date.now() + params.timeToLiveSeconds * 1000,\n };\n return rval;\n }\n async createNewCode(params) {\n const value = ExpiringCodeRatchet.generateCode(params);\n const rval = await this.provider.storeCode(value);\n return rval ? value : null;\n }\n async checkCode(code, context, deleteOnMatch) {\n const rval = await this.provider.checkCode(StringRatchet.trimToEmpty(code), StringRatchet.trimToEmpty(context), deleteOnMatch);\n return rval;\n }\n}\n//# sourceMappingURL=expiring-code-ratchet.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class S3ExpiringCodeProvider {\n s3CacheRatchet;\n keyName;\n constructor(s3CacheRatchet, keyName) {\n this.s3CacheRatchet = s3CacheRatchet;\n this.keyName = keyName;\n RequireRatchet.notNullOrUndefined(s3CacheRatchet, 's3CacheRatchet');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(keyName, 'keyName');\n }\n async fetchFile() {\n const rval = (await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyName)) || {\n data: [],\n lastModifiedEpochMS: Date.now(),\n };\n return rval;\n }\n async updateFile(vals) {\n const next = {\n data: vals || [],\n lastModifiedEpochMS: Date.now(),\n };\n next.data = next.data.filter((d) => d.expiresEpochMS > Date.now());\n Logger.info('Updating code file to %s codes', next.data.length);\n const rval = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyName, next);\n return rval;\n }\n async checkCode(code, context, deleteOnMatch) {\n const val = await this.fetchFile();\n const rval = val.data.find((d) => d?.code?.toUpperCase() === code?.toUpperCase() && d?.context?.toUpperCase() === context?.toUpperCase());\n if (rval) {\n if (deleteOnMatch || rval.expiresEpochMS < Date.now()) {\n Logger.info('Stripping used/expired code from the database');\n const newData = val.data.filter((d) => d != rval);\n await this.updateFile(newData);\n }\n }\n return !!rval && rval.expiresEpochMS > Date.now();\n }\n async storeCode(code) {\n const old = await this.fetchFile();\n old.data.push(code);\n const wrote = await this.updateFile(old.data);\n return !!wrote;\n }\n}\n//# sourceMappingURL=s3-expiring-code-provider.js.map","import { ErrorRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class AwsCredentialsRatchet {\n constructor() { }\n static applySetProfileEnvironmentalVariable(newProfile) {\n if (!!process.env) {\n if (StringRatchet.trimToNull(newProfile)) {\n process.env['AWS_PROFILE'] = newProfile;\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot set profile to null/empty string');\n }\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot set profile - not in a node environment - process missing');\n }\n }\n}\n//# sourceMappingURL=aws-credentials-ratchet.js.map","export class LambdaEventDetector {\n static isValidCronEvent(event) {\n return event && event.source == 'aws.events' && event.resources && event.resources.length > 0;\n }\n static isValidSnsEvent(event) {\n return event && event.Records && event.Records.length > 0 && event.Records[0].EventSource == 'aws:sns';\n }\n static isValidDynamoDBEvent(event) {\n return event && event.Records && event.Records.length > 0 && event.Records[0].eventSource == 'aws:dynamodb';\n }\n static isValidS3Event(event) {\n return event && event.Records && event.Records.length > 0 && event.Records[0].eventSource == 'aws:s3';\n }\n static isValidApiGatewayV2WithRequestContextEvent(event) {\n return event && event.rawPath && event.requestContext && event.routeKey;\n }\n static isValidApiGatewayEvent(event) {\n return event && event.httpMethod && event.path && event.requestContext;\n }\n static isValidApiGatewayAuthorizerEvent(event) {\n return event && event.authorizationToken && event.methodArn;\n }\n static isSingleCronEvent(event) {\n return this.isValidCronEvent(event) && LambdaEventDetector.isSingleEntryEvent(event, 'resources');\n }\n static isSingleSnsEvent(event) {\n return this.isValidSnsEvent(event) && LambdaEventDetector.isSingleEntryEvent(event);\n }\n static isSingleDynamoDBEvent(event) {\n return this.isValidDynamoDBEvent(event) && LambdaEventDetector.isSingleEntryEvent(event);\n }\n static isSingleS3Event(event) {\n return this.isValidS3Event(event) && LambdaEventDetector.isSingleEntryEvent(event);\n }\n static isSingleEntryEvent(event, entryName = 'Records') {\n return event && event[entryName] && event[entryName] instanceof Array && event[entryName].length === 1;\n }\n}\n//# sourceMappingURL=lambda-event-detector.js.map","import { LambdaEventDetector } from './lambda-event-detector.js';\nexport class LambdaEventTypeGuards {\n static isValidCronEvent(event) {\n return LambdaEventDetector.isValidCronEvent(event);\n }\n static isValidSnsEvent(event) {\n return LambdaEventDetector.isValidSnsEvent(event);\n }\n static isValidDynamoDBEvent(event) {\n return LambdaEventDetector.isValidDynamoDBEvent(event);\n }\n static isValidS3Event(event) {\n return LambdaEventDetector.isValidS3Event(event);\n }\n static isValidApiGatewayV2WithRequestContextEvent(event) {\n return LambdaEventDetector.isValidApiGatewayV2WithRequestContextEvent(event);\n }\n static isValidApiGatewayEvent(event) {\n return LambdaEventDetector.isValidApiGatewayEvent(event);\n }\n static isValidApiGatewayAuthorizerEvent(event) {\n return LambdaEventDetector.isValidApiGatewayAuthorizerEvent(event);\n }\n}\n//# sourceMappingURL=lambda-event-type-guards.js.map","import { Logger } from '@bitblit/ratchet-common';\nimport { ChangeResourceRecordSetsCommand, waitUntilResourceRecordSetsChanged, } from '@aws-sdk/client-route-53';\nimport { WaiterState } from '@aws-sdk/util-waiter';\nexport class Route53Ratchet {\n route53;\n hostedZoneId;\n constructor(route53, hostedZoneId) {\n this.route53 = route53;\n this.hostedZoneId = hostedZoneId;\n if (!this.route53) {\n throw 'route53 may not be null';\n }\n }\n get route53Client() {\n return this.route53;\n }\n async changeCnameRecordTarget(domainName, target, hostedZoneId = this.hostedZoneId, ttlSeconds = 600) {\n Logger.info('Updating %s to point to %s', domainName, target);\n try {\n const params = {\n ChangeBatch: {\n Changes: [\n {\n Action: 'UPSERT',\n ResourceRecordSet: {\n Name: domainName,\n ResourceRecords: [\n {\n Value: target,\n },\n ],\n TTL: ttlSeconds,\n Type: 'CNAME',\n },\n },\n ],\n },\n HostedZoneId: hostedZoneId,\n };\n const result = await this.route53.send(new ChangeResourceRecordSetsCommand(params));\n Logger.debug('Updated domain result: %j', result);\n const waitParams = {\n Id: result.ChangeInfo.Id,\n };\n const waitResult = await waitUntilResourceRecordSetsChanged({ client: this.route53, maxWaitTime: 300 }, waitParams);\n Logger.debug('Wait responsed: %j', waitResult);\n if (waitResult.state === WaiterState.SUCCESS) {\n Logger.info('Updated %s to point to %s', domainName, hostedZoneId);\n return true;\n }\n }\n catch (err) {\n Logger.warn('Error update CName for %s with value %s: %j', domainName, target, err);\n }\n Logger.info('Cannot update %s to point to %s', domainName, target);\n return false;\n }\n}\n//# sourceMappingURL=route-53-ratchet.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class DynamoRuntimeParameterProvider {\n dynamo;\n tableName;\n constructor(dynamo, tableName) {\n this.dynamo = dynamo;\n this.tableName = tableName;\n RequireRatchet.notNullOrUndefined(this.dynamo);\n RequireRatchet.notNullOrUndefined(this.tableName);\n }\n async readParameter(groupId, paramKey) {\n Logger.silly('Reading %s / %s from underlying db', groupId, paramKey);\n const req = {\n groupId: groupId,\n paramKey: paramKey,\n };\n const rval = await this.dynamo.simpleGet(this.tableName, req);\n return rval;\n }\n async readAllParametersForGroup(groupId) {\n const qry = {\n TableName: this.tableName,\n KeyConditionExpression: 'groupId = :groupId',\n ExpressionAttributeValues: {\n ':groupId': groupId,\n },\n };\n const all = await this.dynamo.fullyExecuteQuery(qry);\n return all;\n }\n async writeParameter(toStore) {\n const rval = await this.dynamo.simplePut(this.tableName, toStore);\n return !!rval;\n }\n}\n//# sourceMappingURL=dynamo-runtime-parameter-provider.js.map","import { ErrorRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class GlobalVariableOverrideRuntimeParameterProvider {\n wrapped;\n options = {\n globalTTL: 1,\n separator: '.',\n prefix: 'RuntimeEnv-',\n suffix: '',\n };\n constructor(wrapped, opts) {\n this.wrapped = wrapped;\n RequireRatchet.notNullOrUndefined(this.wrapped, 'wrapped');\n RequireRatchet.notNullOrUndefined(global?.process?.env, '\"process\" not found - this only runs in Node, not the browser');\n if (opts) {\n this.options = opts;\n }\n RequireRatchet.notNullOrUndefined(this.options.globalTTL, 'this.options.globalTTL');\n RequireRatchet.notNullOrUndefined(this.options.separator, 'this.options.separator');\n RequireRatchet.true(this.options.globalTTL > 0, 'this.options.globalTTL must be larger than 0');\n }\n generateName(groupId, paramKey) {\n return (StringRatchet.trimToEmpty(this.options.prefix) +\n groupId +\n StringRatchet.trimToEmpty(this.options.separator) +\n paramKey +\n StringRatchet.trimToEmpty(this.options.suffix));\n }\n async readParameter(groupId, paramKey) {\n const asString = StringRatchet.trimToNull(process.env[this.generateName(groupId, paramKey)]);\n if (asString && !StringRatchet.canParseAsJson(asString)) {\n ErrorRatchet.throwFormattedErr('Cannot parse ENV override (%s / %s) as JSON - did you forget the quotes on a string?', groupId, paramKey);\n }\n const rval = asString\n ? {\n groupId: groupId,\n paramKey: paramKey,\n paramValue: asString,\n ttlSeconds: this.options.globalTTL,\n }\n : await this.wrapped.readParameter(groupId, paramKey);\n return rval;\n }\n async readAllParametersForGroup(groupId) {\n return this.wrapped.readAllParametersForGroup(groupId);\n }\n async writeParameter(toStore) {\n return this.wrapped.writeParameter(toStore);\n }\n}\n//# sourceMappingURL=global-variable-override-runtime-parameter-provider.js.map","import { Logger } from '@bitblit/ratchet-common';\nexport class MemoryRuntimeParameterProvider {\n data;\n constructor(data = Promise.resolve({})) {\n this.data = data;\n }\n async readParameter(groupId, paramKey) {\n Logger.silly('Reading %s / %s from underlying db', groupId, paramKey);\n const d = await this.data;\n return d[groupId + '::' + paramKey];\n }\n async readAllParametersForGroup(groupId) {\n const d = await this.data;\n const out = [];\n Object.keys(d).forEach((k) => {\n if (k.startsWith(groupId)) {\n out.push(d[k]);\n }\n });\n return out;\n }\n async writeParameter(toStore) {\n const d = await this.data;\n d[toStore.groupId + '::' + toStore.paramKey] = toStore;\n return true;\n }\n}\n//# sourceMappingURL=memory-runtime-parameter-provider.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class RuntimeParameterRatchet {\n provider;\n cache = new Map();\n constructor(provider) {\n this.provider = provider;\n RequireRatchet.notNullOrUndefined(this.provider);\n }\n async fetchParameter(groupId, paramKey, defaultValue = null, forceFreshRead = false) {\n Logger.debug('Reading parameter %s / %s / Force : %s', groupId, paramKey, forceFreshRead);\n const cached = this.cache.get(RuntimeParameterRatchet.toCacheStoreKey(groupId, paramKey));\n let rval = null;\n const now = new Date().getTime();\n if (!forceFreshRead && !!cached) {\n const oldest = !!cached.ttlSeconds ? now - cached.ttlSeconds * 1000 : 0;\n if (cached.storedEpochMS > oldest) {\n Logger.silly('Fetched %s / %s from cache', groupId, paramKey);\n rval = JSON.parse(cached.paramValue);\n }\n }\n if (!rval) {\n const temp = await this.readUnderlyingEntry(groupId, paramKey);\n if (!!temp) {\n this.addToCache(temp);\n rval = JSON.parse(temp.paramValue);\n }\n }\n rval = rval || defaultValue;\n return rval;\n }\n async fetchAllParametersForGroup(groupId) {\n const all = await this.readUnderlyingEntries(groupId);\n const rval = new Map();\n all.forEach((t) => {\n rval.set(t.paramKey, JSON.parse(t.paramValue));\n this.addToCache(t);\n });\n return rval;\n }\n async readUnderlyingEntry(groupId, paramKey) {\n return this.provider.readParameter(groupId, paramKey);\n }\n async readUnderlyingEntries(groupId) {\n return this.provider.readAllParametersForGroup(groupId);\n }\n async storeParameter(groupId, paramKey, paramValue, ttlSeconds) {\n const toStore = {\n groupId: groupId,\n paramKey: paramKey,\n paramValue: JSON.stringify(paramValue),\n ttlSeconds: ttlSeconds,\n };\n const wrote = await this.provider.writeParameter(toStore);\n return this.provider.readParameter(groupId, paramKey);\n }\n static toCacheStoreKey(groupId, paramKey) {\n return groupId + ':::' + paramKey;\n }\n addToCache(temp) {\n if (!!temp) {\n const now = new Date().getTime();\n const toStore = Object.assign({ storedEpochMS: now }, temp);\n this.cache.set(RuntimeParameterRatchet.toCacheStoreKey(temp.groupId, temp.paramKey), toStore);\n }\n }\n clearCache() {\n Logger.debug('Clearing runtime parameter cache');\n this.cache = new Map();\n }\n}\n//# sourceMappingURL=runtime-parameter-ratchet.js.map","import { CopyObjectCommand, GetObjectCommand, ListObjectsV2Command, } from '@aws-sdk/client-s3';\nimport { Logger, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nimport { Upload } from '@aws-sdk/lib-storage';\nexport class S3LocationSyncRatchet {\n config;\n constructor(config) {\n RequireRatchet.notNullOrUndefined(config, 'config');\n this.config = config;\n if (!this.config.maxNumThreads) {\n this.config.maxNumThreads = 15;\n }\n if (!this.config.maxRetries) {\n this.config.maxRetries = 5;\n }\n }\n updateSrcPrefix(prefix) {\n this.config.srcPrefix = prefix;\n }\n updateDstPrefix(prefix) {\n this.config.dstPrefix = prefix;\n }\n async copyObject(key, size, express = false) {\n const dstKey = key.replace(this.config.srcPrefix, this.config.dstPrefix);\n let completedCopying = false;\n let retries = 0;\n while (!completedCopying && retries < this.config.maxRetries) {\n Logger.debug(`${retries > 0 ? `Retry ${retries} ` : ''}${express ? 'Express' : 'Slow'} copying\n [${[this.config.srcBucket, key].join('/')} ---> ${[this.config.dstBucket, dstKey].join('/')}]`);\n try {\n if (express) {\n const params = {\n CopySource: encodeURIComponent([this.config.srcBucket, key].join('/')),\n Bucket: this.config.dstBucket,\n Key: dstKey,\n MetadataDirective: 'COPY',\n };\n await this.config.dstS3.send(new CopyObjectCommand(params));\n }\n else {\n const fetched = await this.config.srcS3.send(new GetObjectCommand({ Bucket: this.config.srcBucket, Key: key }));\n const params = {\n Bucket: this.config.dstBucket,\n Key: dstKey,\n Body: fetched.Body,\n ContentLength: size,\n };\n const upload = new Upload({\n client: this.config.dstS3,\n params: params,\n tags: [],\n queueSize: 4,\n partSize: 1024 * 1024 * 5,\n leavePartsOnError: false,\n });\n upload.on('httpUploadProgress', (progress) => {\n Logger.info('Uploading : %s', progress);\n });\n await upload.done();\n }\n completedCopying = true;\n }\n catch (err) {\n Logger.warn(`Can't ${express ? 'express' : 'slow'} copy\n [${[this.config.srcBucket, key].join('/')} ---> ${[this.config.dstBucket, dstKey].join('/')}]: %j`, err);\n retries++;\n }\n }\n Logger.debug(`Finished ${express ? 'express' : 'slow'} copying\n [${[this.config.srcBucket, key].join('/')} ---> ${[this.config.dstBucket, dstKey].join('/')}]`);\n }\n async listObjects(bucket, prefix, s3) {\n Logger.info(`Scanning bucket [${[bucket, prefix].join('/')}]`);\n const params = {\n Bucket: bucket,\n Prefix: prefix,\n };\n let more = true;\n const rval = {};\n while (more) {\n const response = await s3.send(new ListObjectsV2Command(params));\n more = response.IsTruncated;\n response.Contents.forEach((obj) => {\n rval[obj.Key] = { Key: obj.Key, LastModified: obj.LastModified, ETag: obj.ETag, Size: obj.Size };\n });\n if (more) {\n params.ContinuationToken = response.NextContinuationToken;\n }\n }\n return rval;\n }\n async startSyncing() {\n Logger.info(`Syncing [${this.config.srcBucket}/${this.config.srcPrefix}\n ---> ${this.config.dstBucket}/${this.config.dstPrefix}]`);\n const cp = async (obj) => {\n await this.copyObject(obj.Key, obj.Size);\n };\n let cmpResult = await this.compareSrcAndDst();\n if (cmpResult.needCopy.length > 0 || cmpResult.diff.length > 0) {\n await PromiseRatchet.runBoundedParallelSingleParam(cp, cmpResult.needCopy, this, this.config.maxNumThreads);\n await PromiseRatchet.runBoundedParallelSingleParam(cp, cmpResult.diff, this, this.config.maxNumThreads);\n Logger.info('Verifying...');\n cmpResult = await this.compareSrcAndDst();\n Logger.debug('Compare result %j', cmpResult);\n }\n return cmpResult.needCopy.length === 0 && cmpResult.diff.length === 0;\n }\n async compareSrcAndDst() {\n const getSrc = this.listObjects(this.config.srcBucket, this.config.srcPrefix, this.config.srcS3);\n const getDst = this.listObjects(this.config.dstBucket, this.config.dstPrefix, this.config.dstS3);\n const srcObjs = await getSrc;\n const dstObjs = await getDst;\n const rval = {\n needCopy: [],\n existed: [],\n diff: [],\n };\n await PromiseRatchet.runBoundedParallelSingleParam((key) => {\n const sObj = srcObjs[key];\n const dstKey = key.replace(this.config.srcPrefix, this.config.dstPrefix);\n const dObj = dstObjs.hasOwnProperty(dstKey) ? dstObjs[dstKey] : undefined;\n if (!dObj) {\n rval.needCopy.push(sObj);\n return;\n }\n if (sObj.Size !== dObj.Size) {\n rval.diff.push(sObj);\n return;\n }\n if (sObj.LastModified.getTime() <= dObj.LastModified.getTime()) {\n rval.existed.push(sObj);\n return;\n }\n rval.diff.push(sObj);\n }, Object.keys(srcObjs), this, this.config.maxNumThreads);\n return rval;\n }\n}\n//# sourceMappingURL=s3-location-sync-ratchet.js.map","import { RequireRatchet } from '@bitblit/ratchet-common';\nexport class S3Ratchet {\n static checkS3UrlForValidity(value) {\n let rval = false;\n if (value) {\n rval = value.startsWith('s3://') && value.trim().length > 5;\n }\n return rval;\n }\n static extractBucketFromURL(value) {\n RequireRatchet.true(S3Ratchet.checkS3UrlForValidity(value), 'invalid s3 url');\n const idx1 = value.indexOf('/', 5);\n const rval = idx1 > 0 ? value.substring(5, idx1) : value.substring(5);\n return rval;\n }\n static extractKeyFromURL(value) {\n RequireRatchet.true(S3Ratchet.checkS3UrlForValidity(value), 'invalid s3 url');\n const idx1 = value.indexOf('/', 5);\n const rval = idx1 > 0 ? value.substring(idx1 + 1) : null;\n return rval;\n }\n}\n//# sourceMappingURL=s3-ratchet.js.map","import { Base64Ratchet, ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { SendRawEmailCommand } from '@aws-sdk/client-ses';\nimport { DateTime } from 'luxon';\nexport class Mailer {\n ses;\n config;\n static EMAIL = new RegExp('.+@.+\\\\.[a-z]+');\n constructor(ses, config = {}) {\n this.ses = ses;\n this.config = config;\n RequireRatchet.notNullOrUndefined(this.ses);\n if (!!config.archive && !config.archive.getDefaultBucket()) {\n throw new Error('If archive specified, must set a default bucket');\n }\n }\n get sESClient() {\n return this.ses;\n }\n async fillEmailBody(rts, context, htmlTemplateName, txtTemplateName = null, layoutName = null, partialNames = null) {\n RequireRatchet.notNullOrUndefined(htmlTemplateName);\n if (!this.config.templateRenderer) {\n ErrorRatchet.throwFormattedErr('Cannot use fill body if template renderer not set');\n }\n rts.htmlMessage = await this.config.templateRenderer.renderTemplate(htmlTemplateName, context, layoutName, partialNames);\n rts.txtMessage = !!txtTemplateName ? await this.config.templateRenderer.renderTemplate(txtTemplateName, context) : null;\n return rts;\n }\n async fillEmailBodyAndSend(rts, context, htmlTemplateName, txtTemplateName = null, layoutName = null, partialNames = null) {\n const newVal = await this.fillEmailBody(rts, context, htmlTemplateName, txtTemplateName, layoutName, partialNames);\n const rval = await this.sendEmail(newVal);\n return rval;\n }\n filterEmailsToValid(emails) {\n const rval = (emails || []).filter((e) => {\n if (!this.config.allowedDestinationEmails || this.config.allowedDestinationEmails.length == 0) {\n return true;\n }\n else {\n const match = this.config.allowedDestinationEmails.find((s) => s.test(e));\n return !!match;\n }\n });\n return rval;\n }\n async archiveEmailIfConfigured(rts) {\n let rval = false;\n if (!!rts && !!this.config.archive && !rts.doNotArchive) {\n Logger.debug('Archiving outbound email to : %j', rts.destinationAddresses);\n let targetPath = StringRatchet.trimToEmpty(this.config.archivePrefix);\n if (!targetPath.endsWith('/')) {\n targetPath += '/';\n }\n const now = DateTime.utc();\n targetPath +=\n 'year=' +\n now.toFormat('yyyy') +\n '/month=' +\n now.toFormat('MM') +\n '/day=' +\n now.toFormat('dd') +\n '/hour=' +\n now.toFormat('HH') +\n '/' +\n now.toFormat('mm_ss__SSS');\n targetPath += '.json';\n try {\n await this.config.archive.writeObjectToCacheFile(targetPath, rts);\n rval = true;\n }\n catch (err) {\n Logger.warn('Failed to archive email %s %j : %s', targetPath, rts, err);\n }\n }\n return rval;\n }\n applyLimitsToBodySizesIfAnyInPlace(rts) {\n if (this.config.maxMessageBodySizeInBytes) {\n const txtSize = StringRatchet.trimToEmpty(rts.txtMessage).length;\n const htmlSize = StringRatchet.trimToEmpty(rts.htmlMessage).length;\n const totalSize = txtSize + htmlSize;\n if (totalSize > this.config.maxMessageBodySizeInBytes) {\n Logger.warn('Max message size is %d but size is %d - converting', this.config.maxMessageBodySizeInBytes, totalSize);\n rts.attachments = rts.attachments || [];\n if (StringRatchet.trimToNull(rts.txtMessage)) {\n const txtAttach = {\n filename: 'original-txt-body.txt',\n contentType: 'text/plain',\n base64Data: Base64Ratchet.generateBase64VersionOfString(rts.txtMessage),\n };\n rts.attachments.push(txtAttach);\n }\n if (StringRatchet.trimToNull(rts.htmlMessage)) {\n const htmlAttach = {\n filename: 'original-html-body.html',\n contentType: 'text/html',\n base64Data: Base64Ratchet.generateBase64VersionOfString(rts.htmlMessage),\n };\n rts.attachments.push(htmlAttach);\n }\n rts.htmlMessage = null;\n rts.txtMessage = 'The message was too large and was converted to attachment(s). Please see attached files for content';\n }\n }\n }\n applyLimitsToAttachmentSizesIfAnyInPlace(rts) {\n if (this.config.maxAttachmentSizeInBase64Bytes) {\n const filtered = [];\n if (rts.attachments) {\n rts.attachments.forEach((a) => {\n if (a.base64Data && a.base64Data.length < this.config.maxAttachmentSizeInBase64Bytes) {\n filtered.push(a);\n }\n else {\n Logger.warn('Removing too-large attachment : %s : %s : %d', a.filename, a.contentType, a.base64Data.length);\n filtered.push({\n filename: 'attachment-removed-notice-' + StringRatchet.createRandomHexString(4) + '.txt',\n contentType: 'text/plain',\n base64Data: Base64Ratchet.generateBase64VersionOfString('Attachment ' +\n a.filename +\n ' of type ' +\n a.contentType +\n ' was removed since it was ' +\n a.base64Data.length +\n ' bytes but max allowed is ' +\n this.config.maxAttachmentSizeInBase64Bytes),\n });\n }\n });\n }\n rts.attachments = filtered;\n }\n }\n async sendEmail(inRts) {\n RequireRatchet.notNullOrUndefined(inRts, 'RTS must be defined');\n RequireRatchet.notNullOrUndefined(inRts.destinationAddresses, 'Destination addresses must be defined');\n let rval = null;\n let toAddresses = this.filterEmailsToValid(inRts.destinationAddresses);\n const autoBcc = inRts.doNotAutoBcc ? [] : this.config.autoBccAddresses || [];\n const bccAddresses = (inRts.bccAddresses || []).concat(autoBcc);\n if (toAddresses.length === 0 && bccAddresses.length > 0) {\n Logger.debug('Destination emails filtered to none but BCC defined, copying BCC');\n toAddresses = bccAddresses;\n }\n const rts = Object.assign({}, inRts);\n rts.srcDestinationAddresses = inRts.destinationAddresses;\n rts.srcBccAddresses = inRts.bccAddresses;\n rts.destinationAddresses = toAddresses;\n rts.bccAddresses = bccAddresses;\n this.applyLimitsToBodySizesIfAnyInPlace(rts);\n this.applyLimitsToAttachmentSizesIfAnyInPlace(rts);\n await this.archiveEmailIfConfigured(rts);\n if (rts.destinationAddresses.length === 0) {\n Logger.info('After cleaning email lists, no destination addresses left - not sending email');\n }\n else {\n const toLine = 'To: ' + rts.destinationAddresses.join(', ') + '\\n';\n const bccLine = !!rts.bccAddresses && rts.bccAddresses.length > 0 ? 'Bcc: ' + rts.bccAddresses.join(', ') + '\\n' : '';\n try {\n const from = rts.fromAddress || this.config.defaultSendingAddress;\n const boundary = 'NextPart';\n const altBoundary = 'AltPart';\n let rawMail = 'From: ' + from + '\\n';\n rawMail += toLine;\n rawMail += bccLine;\n rawMail += 'Subject: ' + rts.subject + '\\n';\n rawMail += 'MIME-Version: 1.0\\n';\n rawMail += 'Content-Type: multipart/mixed; boundary=\"' + boundary + '\"\\n';\n rawMail += '\\n\\n--' + boundary + '\\n';\n rawMail += 'Content-Type: multipart/alternative; boundary=\"' + altBoundary + '\"\\n';\n if (!!StringRatchet.trimToNull(rts.htmlMessage)) {\n rawMail += '\\n\\n--' + altBoundary + '\\n';\n rawMail += 'Content-Type: text/html; charset=\"UTF-8\"\\n\\n';\n rawMail += rts.htmlMessage;\n }\n if (!!StringRatchet.trimToNull(rts.txtMessage)) {\n rawMail += '\\n\\n--' + altBoundary + '\\n';\n rawMail += 'Content-Type: text/plain\\n\\n';\n rawMail += rts.txtMessage;\n }\n rawMail += '\\n\\n--' + altBoundary + '--\\n';\n if (rts.attachments) {\n rts.attachments.forEach((a) => {\n rawMail += '\\n\\n--' + boundary + '\\n';\n rawMail += 'Content-Type: ' + a.contentType + '; name=\"' + a.filename + '\"\\n';\n rawMail += 'Content-Transfer-Encoding: base64\\n';\n rawMail += 'Content-Disposition: attachment\\n\\n';\n rawMail += a.base64Data.replace(/([^\\0]{76})/g, '$1\\n') + '\\n\\n';\n });\n }\n rawMail += '\\n\\n--' + boundary + '--\\n';\n const params = {\n RawMessage: { Data: new TextEncoder().encode(rawMail) },\n };\n rval = await this.ses.send(new SendRawEmailCommand(params));\n }\n catch (err) {\n Logger.error('Error while processing email: %s', err, err);\n }\n }\n return rval;\n }\n static validEmail(email) {\n return email !== null && Mailer.EMAIL.test(email);\n }\n}\n//# sourceMappingURL=mailer.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nimport { PublishCommand, SNSClient } from '@aws-sdk/client-sns';\nexport class SnsRatchet {\n sns;\n topicArn;\n constructor(sns = new SNSClient({ region: 'us-east-1' }), topicArn) {\n this.sns = sns;\n this.topicArn = topicArn;\n RequireRatchet.notNullOrUndefined(this.sns, 'sns');\n RequireRatchet.notNullOrUndefined(this.topicArn, 'topicArn');\n }\n get snsClient() {\n return this.sns;\n }\n async sendMessage(inMsg, suppressErrors = false) {\n let result = null;\n try {\n const safeInMsg = inMsg ? inMsg : 'NO-MESSAGE-PROVIDED';\n const msg = typeof safeInMsg === 'string' ? safeInMsg : JSON.stringify(safeInMsg);\n const params = {\n TopicArn: this.topicArn,\n Message: msg,\n };\n Logger.debug('Sending via SNS : %j', params);\n result = await this.sns.send(new PublishCommand(params));\n }\n catch (err) {\n if (suppressErrors) {\n Logger.error('Failed to fire SNS notification : %j : %s', inMsg, err);\n }\n else {\n throw err;\n }\n }\n return result;\n }\n async conditionallySendMessage(inMsg, condition, suppressErrors = false) {\n let rval = null;\n if (condition) {\n rval = await this.sendMessage(inMsg, suppressErrors);\n }\n else {\n Logger.info('Not sending message, condition was false : %j', inMsg);\n }\n return rval;\n }\n}\n//# sourceMappingURL=sns-ratchet.js.map","import { Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { PutItemCommand } from '@aws-sdk/client-dynamodb';\nexport class DynamoDbSyncLock {\n ratchet;\n tableName;\n constructor(ratchet, tableName) {\n this.ratchet = ratchet;\n this.tableName = tableName;\n RequireRatchet.notNullOrUndefined(ratchet, 'ratchet');\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(this.tableName), 'tableName');\n }\n async acquireLock(lockKey, expirationSeconds = 30) {\n let rval = false;\n if (!!lockKey && !!expirationSeconds) {\n const nowSeconds = Math.floor(new Date().getTime() / 1000);\n const row = {\n lockingKey: lockKey,\n timestamp: nowSeconds,\n expires: nowSeconds + expirationSeconds,\n };\n const params = {\n Item: row,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: this.tableName,\n ConditionExpression: 'attribute_not_exists(lockingKey)',\n };\n try {\n const pio = await this.ratchet.getDDB().send(new PutItemCommand(params));\n rval = true;\n }\n catch (err) {\n if (String(err).indexOf('ConditionalCheckFailedException') > -1) {\n Logger.silly('Unable to acquire lock on %s', lockKey);\n }\n }\n }\n return rval;\n }\n async releaseLock(lockKey) {\n if (StringRatchet.trimToNull(lockKey)) {\n try {\n const dio = await this.ratchet.simpleDelete(this.tableName, { lockingKey: lockKey });\n Logger.silly('Released lock %s : %s', lockKey, dio);\n }\n catch (err) {\n Logger.warn('Failed to release lock key : %s : %s', lockKey, err, err);\n }\n }\n }\n async clearExpiredSyncLocks() {\n const nowSeconds = Math.floor(new Date().getTime() / 1000);\n const scan = {\n TableName: this.tableName,\n FilterExpression: 'expires < :now',\n ExpressionAttributeValues: {\n ':now': nowSeconds,\n },\n };\n const vals = await this.ratchet.fullyExecuteScan(scan);\n const keysOnly = vals.map((v) => {\n const next = { lockingKey: v['lockingKey'] };\n return next;\n });\n const removed = await this.ratchet.deleteAllInBatches(this.tableName, keysOnly, 25);\n return removed;\n }\n}\n//# sourceMappingURL=dynamo-db-sync-lock.js.map","import { StringRatchet } from '@bitblit/ratchet-common';\nexport class MemorySyncLock {\n _locks = new Map();\n constructor() { }\n async acquireLock(lockKey, expirationSeconds = 30) {\n let rval = false;\n if (StringRatchet.trimToNull(lockKey)) {\n const now = Date.now();\n const val = this._locks.get(lockKey);\n if (!val || val < now) {\n this._locks.set(lockKey, now + expirationSeconds * 1000);\n rval = true;\n }\n }\n return rval;\n }\n async releaseLock(lockKey) {\n if (StringRatchet.trimToNull(lockKey)) {\n this._locks.delete(lockKey);\n }\n }\n async clearExpiredSyncLocks() {\n const toRemove = [];\n const now = Date.now();\n this._locks.forEach((v, k) => {\n if (v < now) {\n toRemove.push(k);\n }\n });\n toRemove.forEach((k) => {\n this._locks.delete(k);\n });\n return toRemove.length;\n }\n}\n//# sourceMappingURL=memory-sync-lock.js.map"],"names":["AwsBatchBackgroundProcessor","batchRatchet","validTaskNames","constructor","this","RequireRatchet","notNullOrUndefined","batchClient","defaultJobDefinition","defaultQueueName","async","taskName","data","meta","length","StringRatchet","trimToNull","includes","ErrorRatchet","throwFormattedErr","Logger","info","rval","jobName","DateTime","utc","toFormat","options","jobDefinition","jobQueue","parameters","taskData","JSON","stringify","taskMetadata","scheduleJob","jobId","err","error","AwsBatchRatchet","_batchClient","_defaultQueueName","_defaultJobDefinition","send","SubmitJobCommand","jobStatus","queueName","listJobs","request","nextToken","tmp","ListJobsCommand","concat","jobSummaryList","RatchetAwsInfo","static","version","hash","branch","tag","timeBuiltISO","notes","DynamoDbStorageProvider","dynamo","opts","tableName","hashKeyName","true","useRangeKeys","rangeKeyName","hashKeyValue","createKeyObject","cacheKey","keys","cleanDynamoFieldsFromObjectInPlace","dynamoExpiresColumnName","extractKeysFromObject","dKey","simpleGet","value","toSave","Object","assign","expiresEpochMS","Math","floor","simplePut","simpleDelete","allKeys","readAll","map","a","deleteAllInBatches","qry","TableName","KeyConditionExpression","ExpressionAttributeNames","ExpressionAttributeValues","fullyExecuteQuery","scan","fullyExecuteScan","forEach","r","S3StorageProvider","s3CacheRatchet","prefix","getDefaultBucket","keyToPath","trimToEmpty","endsWith","fetchCacheFileAsObject","writeObjectToCacheFile","removeCacheFile","directChildrenOfPrefix","Promise","all","k","removeFromCache","readFromCache","SimpleCache","provider","defaultTimeToLiveMS","createDefaultReadOptions","maxStalenessMS","timeToLiveMS","cacheNullValues","producer","silly","now","Date","getTime","debug","createdEpochMS","generated","storeInCache","wrapper","fetchWrapper","returnOldValue","clearCache","CloudWatchLogGroupRatchet","logGroup","awsCWLogs","CloudWatchLogsClient","region","cloudWatchLogsClient","startTimestamp","endTimestamp","params","logGroupName","orderBy","temp","DescribeLogStreamsCommand","logStreams","s","lastEventTimestamp","firstEventTimestamp","push","readLogStreams","logStreamName","filter","sortEvents","maxEvents","sw","StopWatch","endTime","startTime","filterPattern","dump","FilterLogEventsCommand","events","sort","b","timestamp","message","localeCompare","log","CloudWatchLogsRatchet","cwLogs","cloudwatchLogs","maxToRemove","oldestEventEpochMS","streamSearchParams","oldestEventTester","totalStreams","removedStreams","failedRemovedStreams","waitPerDescribe","streams","i","st","oldWait","min","waitPer","delParams","type","storedBytes","removed","retry","MAX_DELETE_RETRIES","DeleteLogStreamCommand","PromiseRatchet","wait","warn","stream","findStreamWithOldestEventInGroup","logGroupNamePrefix","res","DescribeLogGroupsCommand","logGroups","groups","req","DeleteLogGroupCommand","findLogGroups","removeLogGroups","sqr","resp","StartQueryCommand","delayMS","status","GetQueryResultsCommand","queryId","StopQueryCommand","CloudWatchMetricsUnit","CloudWatchMetricsRatchet","cw","cloudWatch","CloudWatchClient","apiVersion","cloudWatchClient","namespace","metric","dims","unit","None","timestampDate","highResolution","cwDims","d","Name","key","Value","storageResolution","metricData","Namespace","MetricData","MetricName","Dimensions","Unit","String","Timestamp","StorageResolution","result","PutMetricDataCommand","minuteUTC","query","Error","cnt","dynamoRatchet","fullyExecuteQueryCount","fullyExecuteScanCount","parseDateString","split","join","parseDate","fromISO","toJSDate","metricRes","writeSingleMetric","Count","count","DaemonUtil","Buffer","from","cache","id","s3Key","newState","title","lastUpdatedEpochMS","lastUpdatedMessage","targetFileName","startedEpochMS","completedEpochMS","link","contentType","writeState","DEFAULT_CONTENT","contents","s3meta","DAEMON_METADATA_KEY","Bucket","Key","ContentType","Metadata","Body","Blob","ContentDisposition","written","getS3Client","PutObjectCommand","stat","inStat","updateMessage","overrideTargetFileName","upload","Upload","client","tags","queueSize","partSize","leavePartsOnError","on","progress","done","newMessage","s3Cache","path","fetchMetaForCacheFile","metaString","parse","preSignedDownloadUrlForCacheFile","S3CacheRatchet","s3","defaultBucket","s3Client","input","seconds","CacheControl","bucket","bucketVal","GetObjectCommand","NoSuchKey","fetchCacheFileAsS3GetObjectCommandOutput","transformToWebStream","out","transformToByteArray","transformToString","fetchCacheFileAsString","DeleteObjectCommand","dataObject","template","json","writeStringToCacheFile","dataString","StreamRatchet","stringToWebReadableStream","writeStreamToCacheFile","srcPrefix","targetPrefix","targetRatchet","recurseSubFolders","sourceFiles","targetFiles","sourceFile","dumpExpected","subs","synchronize","shouldCopy","srcMeta","targetMeta","ETag","srcStream","fetchCacheFileAsReadableStream","undefined","HeadObjectCommand","LastModified","srcKey","dstKey","srcBucket","dstBucket","CopySource","MetadataDirective","CopyObjectCommand","copyFile","expirationSeconds","getCommand","getSignedUrl","expiresIn","expandFiles","maxToReturn","returnValue","Prefix","Delimiter","response","ListObjectsCommand","prefixLength","cp","substring","expanded","name","size","Marker","NextMarker","idx","next","ContinuationToken","NextContinuationToken","CommonPrefixes","p","explicitBucket","Daemon","_defaultGroup","jwtRatchet","DEFAULT_DEFAULT_GROUP","defaultGroup","token","daemonKey","createTokenString","toString","pathToKey","generatePath","group","generatePrefix","createType4Guid","start","olderThanSeconds","original","list","test","proms","listKeys","itemPath","publicToken","parsed","decodeToken","abort","finalize","PrototypeDao","cfg","guidCreateFunction","guidFieldName","createdEpochMSFieldName","updatedEpochMSFieldName","createdUtcTimestampFieldName","updatedUtcTimestampFieldName","defaultDaoConfig","loadDatabase","items","storeDatabase","lastModifiedEpochMS","guids","old","fetchAll","t","toISO","guid","find","fieldDotPath","fieldValue","searchByFieldMap","matchAll","val","MapRatchet","findValueDotPath","S3PrototypeDaoProvider","keyName","notNullUndefinedOrOnlyWhitespaceString","inDb","S3SimpleDao","buildPathPrefix","buildFullPath","fullPath","fileExists","item","fetch","promises","listItems","DynamoRatchet","awsDDB","dynamoDBDocumentClient","getDDB","Limit","throughputSafeScanOrQuery","o","scanPromise","Items","ScanCommand","QueryCommand","proc","maxTries","inCurrentTry","currentTry","objectIsErrorWithProvisionedThroughputExceededExceptionCode","pow","Select","scannedCount","pages","qryResults","myLimit","queryPromise","LastEvaluatedKey","end","DurationRatchet","formatMsDuration","softLimit","fullyExecuteProcessOverQuery","v","blankPages","fullyExecuteProcessOverScan","elements","batchSize","batchItems","el","PutRequest","Item","ReturnConsumedCapacity","curBatch","slice","RequestItems","ReturnItemCollectionMetrics","tryCount","batchResults","BatchWriteCommand","UnprocessedItems","backoff","keyNames","keyDataSrc","keysOnly","stripAllToKeysOnly","fetchAllInBatches","inKeys","batches","remain","tableEntry","Keys","nextBatch","BatchGetCommand","Responses","UnprocessedKeys","DeleteRequest","autoRetryCount","PutCommand","fieldName","ConditionExpression","wrote","simplePutOnlyIfFieldIsNullOrUndefined","adjustFunction","maxAdjusts","pio","attrNames","attrValues","condExp","adjustCount","newValue","holder","GetCommand","counterAttributeName","deleteOnZero","UpdateExpression","ReturnValues","updateFailed","UpdateItemCommand","Attributes","DeleteCommand","counterFieldName","increment","update","ui","NumberRatchet","safeNumber","ob","rem","cleanObject","keysNames","stripToKeysOnly","DynamoTableRatchet","waitForDelete","DeleteTableCommand","waitForTableDelete","waitForReady","replaceIfExists","tableExists","deleteTable","CreateTableCommand","waitForTableReady","safeDescribeTable","Table","TableStatus","ListTablesCommand","TableNames","ExclusiveStartTableName","LastEvaluatedTableName","DescribeTableCommand","ResourceNotFoundException","srcTableName","dstTableName","overrides","copyData","fErr","srcTableDef","AttributeDefinitions","KeySchema","GlobalSecondaryIndexes","createInput","LocalSecondaryIndexes","gi","output","ProvisionedThroughput","WriteCapacityUnits","ReadCapacityUnits","BillingMode","BillingModeSummary","StreamSpecification","SSESpecification","SSEDescription","Tags","TableClass","TableClassSummary","DeletionProtectionEnabled","HashSpreader","spots","buckets","separator","alphabet","_allSlots","allUnique","stringContainsOnlyAlphanumeric","permutations","allPerms","allPermutationsOfLength","allBuckets","randomBucket","random","allSpreadValues","allSpreadValuesForArray","inputs","addSpreader","extractBucket","loc","charAt","removeBucket","Ec2Ratchet","availabilityZone","ec2","ec2InstanceConnect","EC2Client","EC2InstanceConnectClient","eC2Client","eC2InstanceConnectClient","instanceId","maxWaitForShutdownMS","stopParams","InstanceIds","DryRun","StopInstancesCommand","describeInstance","State","Code","maxWaitForStartupMS","startParams","StartInstancesCommand","PublicIpAddress","listAllInstances","instanceIds","NextToken","DescribeInstancesCommand","Reservations","Instances","publicKeyString","instanceOsUser","userName","InstanceId","AvailabilityZone","InstanceOSUser","SSHPublicKey","SendSSHPublicKeyCommand","CascadeEnvironmentServiceProvider","providers","fetchConfig","EnvVarEnvironmentServiceProvider","envVarName","src","process","env","global","toParse","EnvironmentService","readPromiseCache","Map","maxRetries","backoffMultiplierMS","defaultEnvironmentServiceConfig","has","set","getConfigUncached","get","waitMS","FixedEnvironmentServiceProvider","record","m","S3EnvironmentServiceProvider","ratchet","bucketName","s3Override","S3Client","readPath","pathPrefix","pathSuffix","SsmEnvironmentServiceProvider","ssmEncrypted","ssm","SSMClient","WithDecryption","GetParameterCommand","Parameter","errCode","toLowerCase","indexOf","errMsg","DynamoExpiringCodeProvider","code","context","deleteOnMatch","expCode","ConsumedCapacity","CapacityUnits","dtr","ExpiringCodeRatchet","timeToLiveSeconds","generateCode","storeCode","checkCode","S3ExpiringCodeProvider","vals","fetchFile","toUpperCase","newData","updateFile","AwsCredentialsRatchet","newProfile","LambdaEventDetector","event","source","resources","Records","EventSource","eventSource","rawPath","requestContext","routeKey","httpMethod","authorizationToken","methodArn","isValidCronEvent","isSingleEntryEvent","isValidSnsEvent","isValidDynamoDBEvent","isValidS3Event","entryName","Array","LambdaEventTypeGuards","isValidApiGatewayV2WithRequestContextEvent","isValidApiGatewayEvent","isValidApiGatewayAuthorizerEvent","Route53Ratchet","route53","hostedZoneId","route53Client","domainName","target","ttlSeconds","ChangeBatch","Changes","Action","ResourceRecordSet","ResourceRecords","TTL","Type","HostedZoneId","ChangeResourceRecordSetsCommand","waitParams","Id","ChangeInfo","waitResult","waitUntilResourceRecordSetsChanged","maxWaitTime","state","WaiterState","SUCCESS","DynamoRuntimeParameterProvider","groupId","paramKey","toStore","GlobalVariableOverrideRuntimeParameterProvider","wrapped","globalTTL","suffix","generateName","asString","canParseAsJson","paramValue","readParameter","readAllParametersForGroup","writeParameter","MemoryRuntimeParameterProvider","resolve","startsWith","RuntimeParameterRatchet","defaultValue","forceFreshRead","cached","toCacheStoreKey","oldest","storedEpochMS","readUnderlyingEntry","addToCache","readUnderlyingEntries","S3LocationSyncRatchet","config","maxNumThreads","updateSrcPrefix","updateDstPrefix","dstPrefix","express","replace","completedCopying","retries","encodeURIComponent","dstS3","fetched","srcS3","ContentLength","more","ListObjectsV2Command","IsTruncated","Contents","obj","Size","copyObject","cmpResult","compareSrcAndDst","needCopy","diff","runBoundedParallelSingleParam","getSrc","listObjects","getDst","srcObjs","dstObjs","existed","sObj","dObj","hasOwnProperty","S3Ratchet","trim","checkS3UrlForValidity","idx1","Mailer","ses","RegExp","archive","sESClient","rts","htmlTemplateName","txtTemplateName","layoutName","partialNames","templateRenderer","htmlMessage","renderTemplate","txtMessage","newVal","fillEmailBody","sendEmail","filterEmailsToValid","emails","e","allowedDestinationEmails","doNotArchive","destinationAddresses","targetPath","archivePrefix","applyLimitsToBodySizesIfAnyInPlace","maxMessageBodySizeInBytes","totalSize","attachments","txtAttach","filename","base64Data","Base64Ratchet","generateBase64VersionOfString","htmlAttach","applyLimitsToAttachmentSizesIfAnyInPlace","maxAttachmentSizeInBase64Bytes","filtered","createRandomHexString","inRts","toAddresses","autoBcc","doNotAutoBcc","autoBccAddresses","bccAddresses","srcDestinationAddresses","srcBccAddresses","archiveEmailIfConfigured","toLine","bccLine","fromAddress","defaultSendingAddress","boundary","altBoundary","rawMail","subject","RawMessage","Data","TextEncoder","encode","SendRawEmailCommand","email","EMAIL","SnsRatchet","sns","topicArn","SNSClient","snsClient","inMsg","suppressErrors","safeInMsg","msg","TopicArn","Message","PublishCommand","condition","sendMessage","DynamoDbSyncLock","lockKey","nowSeconds","lockingKey","expires","PutItemCommand","dio","FilterExpression","MemorySyncLock","_locks","delete","toRemove"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/batch/aws-batch-background-processor.ts","../src/batch/aws-batch-ratchet.ts","../src/build/ratchet-aws-info.ts","../src/cache/dynamo-db-storage-provider.ts","../src/cache/s3-storage-provider.ts","../src/cache/simple-cache.ts","../src/cloudwatch/cloud-watch-log-group-ratchet.ts","../src/cloudwatch/cloud-watch-logs-ratchet.ts","../src/model/cloud-watch-metrics-unit.ts","../src/cloudwatch/cloud-watch-metrics-ratchet.ts","../src/daemon/daemon-util.ts","../src/s3/s3-cache-ratchet.ts","../src/daemon/daemon.ts","../src/dao/prototype-dao.ts","../src/dao/s3-prototype-dao-provider.ts","../src/dao/s3-simple-dao.ts","../src/dynamodb/dynamo-ratchet.ts","../src/dynamodb/dynamo-table-ratchet.ts","../src/dynamodb/hash-spreader.ts","../src/ec2/ec2-ratchet.ts","../src/environment/cascade-environment-service-provider.ts","../src/environment/env-var-environment-service-provider.ts","../src/environment/environment-service.ts","../src/environment/fixed-environment-service-provider.ts","../src/environment/s3-environment-service-provider.ts","../src/environment/ssm-environment-service-provider.ts","../src/expiring-code/dynamo-expiring-code-provider.ts","../src/expiring-code/expiring-code-ratchet.ts","../src/expiring-code/s3-expiring-code-provider.ts","../src/iam/aws-credentials-ratchet.ts","../src/lambda/lambda-event-detector.ts","../src/lambda/lambda-event-type-guards.ts","../src/route53/route-53-ratchet.ts","../src/runtime-parameter/dynamo-runtime-parameter-provider.ts","../src/runtime-parameter/global-variable-override-runtime-parameter-provider.ts","../src/runtime-parameter/memory-runtime-parameter-provider.ts","../src/runtime-parameter/runtime-parameter-ratchet.ts","../src/s3/s3-location-sync-ratchet.ts","../src/s3/s3-ratchet.ts","../src/ses/mailer.ts","../src/sns/sns-ratchet.ts","../src/sync-lock/dynamo-db-sync-lock.ts","../src/sync-lock/memory-sync-lock.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class AwsBatchBackgroundProcessor {\n batchRatchet;\n validTaskNames;\n constructor(batchRatchet, validTaskNames) {\n this.batchRatchet = batchRatchet;\n this.validTaskNames = validTaskNames;\n RequireRatchet.notNullOrUndefined(this.batchRatchet, 'batchRatchet');\n RequireRatchet.notNullOrUndefined(this.batchRatchet.batchClient, 'batchRatchet.batchClient');\n RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultJobDefinition, 'batchRatchet.defaultJobDefinition');\n RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultQueueName, 'batchRatchet.defaultQueueName');\n }\n async scheduleBackgroundTask(taskName, data = {}, meta = {}) {\n if (this.validTaskNames &&\n this.validTaskNames.length &&\n (!StringRatchet.trimToNull(taskName) || !this.validTaskNames.includes(taskName))) {\n ErrorRatchet.throwFormattedErr('Cannot start task %s - not found in valid task list', taskName);\n }\n Logger.info('Submitting background task to AWS batch: %s %j %s', taskName, data, this.batchRatchet.defaultQueueName);\n let rval = null;\n const jobName = `${this.batchRatchet.defaultJobDefinition}-${taskName}_${DateTime.utc().toFormat('yyyy-MM-dd-HH-mm')}`;\n const options = {\n jobName: jobName,\n jobDefinition: this.batchRatchet.defaultJobDefinition,\n jobQueue: this.batchRatchet.defaultQueueName,\n parameters: {\n taskName,\n taskData: JSON.stringify(data),\n taskMetadata: JSON.stringify(meta),\n },\n };\n try {\n rval = await this.batchRatchet.scheduleJob(options);\n Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);\n }\n catch (err) {\n Logger.error('Cannot submit batch job taskName: %s jobDef: %s queue: %s jobName: %s data: %j', taskName, this.batchRatchet.defaultJobDefinition, this.batchRatchet.defaultQueueName, jobName, data, err);\n }\n return rval;\n }\n}\n//# sourceMappingURL=aws-batch-background-processor.js.map","import { ListJobsCommand, SubmitJobCommand, } from '@aws-sdk/client-batch';\nimport { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class AwsBatchRatchet {\n _batchClient;\n _defaultQueueName;\n _defaultJobDefinition;\n constructor(_batchClient, _defaultQueueName, _defaultJobDefinition) {\n this._batchClient = _batchClient;\n this._defaultQueueName = _defaultQueueName;\n this._defaultJobDefinition = _defaultJobDefinition;\n }\n get batchClient() {\n return this._batchClient;\n }\n get defaultQueueName() {\n return this._defaultQueueName;\n }\n get defaultJobDefinition() {\n return this._defaultJobDefinition;\n }\n async scheduleJob(options) {\n Logger.info('Submitting batch job %s', options.jobName);\n try {\n const rval = await this._batchClient.send(new SubmitJobCommand(options));\n Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);\n return rval;\n }\n catch (err) {\n Logger.error('Cannot submit batch job %s: %s', options.jobName, err);\n }\n return null;\n }\n async jobCountInState(jobStatus, queueName = this.defaultQueueName) {\n const all = await this.listJobs(queueName, jobStatus);\n return all.length;\n }\n async listJobs(queueName = this.defaultQueueName, jobStatus = null) {\n RequireRatchet.notNullOrUndefined(queueName, 'queueName');\n let rval = [];\n const request = {\n jobQueue: queueName,\n jobStatus: jobStatus,\n nextToken: null,\n };\n Logger.info('Fetching %j', request);\n do {\n Logger.info('Pulling page...');\n const tmp = await this._batchClient.send(new ListJobsCommand(request));\n rval = rval.concat(tmp.jobSummaryList);\n request.nextToken = tmp.nextToken;\n } while (request.nextToken);\n return rval;\n }\n}\n//# sourceMappingURL=aws-batch-ratchet.js.map","export class RatchetAwsInfo {\n constructor() { }\n static buildInformation() {\n const val = {\n version: 'LOCAL-SNAPSHOT',\n hash: 'LOCAL-HASH',\n branch: 'LOCAL-BRANCH',\n tag: 'LOCAL-TAG',\n timeBuiltISO: 'LOCAL-TIME-ISO',\n notes: 'LOCAL-NOTES',\n };\n return val;\n }\n}\n//# sourceMappingURL=ratchet-aws-info.js.map","import { RequireRatchet } from '@bitblit/ratchet-common';\nexport class DynamoDbStorageProvider {\n dynamo;\n opts;\n constructor(dynamo, opts) {\n this.dynamo = dynamo;\n this.opts = opts;\n RequireRatchet.notNullOrUndefined(this.dynamo, 'dynamo');\n RequireRatchet.notNullOrUndefined(this.opts, 'opts');\n RequireRatchet.notNullOrUndefined(this.opts.tableName, 'opts.tableName');\n RequireRatchet.notNullOrUndefined(this.opts.hashKeyName, 'opts.hashKeyName');\n RequireRatchet.true(!this.opts.useRangeKeys || (!!this.opts.rangeKeyName && !!this.opts.hashKeyValue), 'invalid range configuration');\n }\n static createDefaultOptions() {\n const rval = {\n tableName: 'simple-cache',\n useRangeKeys: false,\n hashKeyName: 'cache-key',\n rangeKeyName: null,\n hashKeyValue: null,\n };\n return rval;\n }\n createKeyObject(cacheKey) {\n const keys = {};\n if (this.opts.useRangeKeys) {\n keys[this.opts.hashKeyName] = this.opts.hashKeyValue;\n keys[this.opts.rangeKeyName] = cacheKey;\n }\n else {\n keys[this.opts.hashKeyName] = cacheKey;\n }\n return keys;\n }\n cleanDynamoFieldsFromObjectInPlace(rval) {\n if (rval) {\n delete rval[this.opts.hashKeyName];\n if (this.opts.rangeKeyName) {\n delete rval[this.opts.rangeKeyName];\n }\n if (this.opts.dynamoExpiresColumnName) {\n delete rval[this.opts.dynamoExpiresColumnName];\n }\n }\n }\n extractKeysFromObject(rval) {\n let keys = null;\n if (rval) {\n keys = {};\n if (this.opts.useRangeKeys) {\n keys[this.opts.hashKeyName] = this.opts.hashKeyValue;\n keys[this.opts.rangeKeyName] = rval.cacheKey;\n }\n else {\n keys[this.opts.hashKeyName] = rval.cacheKey;\n }\n }\n return keys;\n }\n async readFromCache(cacheKey) {\n const dKey = this.createKeyObject(cacheKey);\n const rval = await this.dynamo.simpleGet(this.opts.tableName, dKey);\n this.cleanDynamoFieldsFromObjectInPlace(rval);\n return rval;\n }\n async storeInCache(value) {\n RequireRatchet.notNullOrUndefined(value, 'value');\n RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');\n const toSave = Object.assign({}, value, this.createKeyObject(value.cacheKey));\n if (this.opts.dynamoExpiresColumnName && value.expiresEpochMS) {\n toSave[this.opts.dynamoExpiresColumnName] = Math.floor(value.expiresEpochMS / 1000);\n }\n const wrote = await this.dynamo.simplePut(this.opts.tableName, toSave);\n return !!wrote;\n }\n async removeFromCache(cacheKey) {\n await this.dynamo.simpleDelete(this.opts.tableName, this.createKeyObject(cacheKey));\n }\n async clearCache() {\n const allValues = await this.readAll();\n const allKeys = allValues.map((a) => this.extractKeysFromObject(a));\n const rval = await this.dynamo.deleteAllInBatches(this.opts.tableName, allKeys, 25);\n return rval;\n }\n async readAll() {\n let rval = null;\n if (this.opts.useRangeKeys) {\n const qry = {\n TableName: this.opts.tableName,\n KeyConditionExpression: '#cacheKey = :cacheKey',\n ExpressionAttributeNames: {\n '#cacheKey': this.opts.hashKeyName,\n },\n ExpressionAttributeValues: {\n ':cacheKey': this.opts.hashKeyValue,\n },\n };\n rval = await this.dynamo.fullyExecuteQuery(qry);\n }\n else {\n const scan = {\n TableName: this.opts.tableName,\n };\n rval = await this.dynamo.fullyExecuteScan(scan);\n }\n rval.forEach((r) => this.cleanDynamoFieldsFromObjectInPlace(r));\n return rval;\n }\n}\n//# sourceMappingURL=dynamo-db-storage-provider.js.map","import { RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class S3StorageProvider {\n s3CacheRatchet;\n prefix;\n constructor(s3CacheRatchet, prefix) {\n this.s3CacheRatchet = s3CacheRatchet;\n this.prefix = prefix;\n RequireRatchet.notNullOrUndefined(this.s3CacheRatchet, 's3CacheRatchet');\n RequireRatchet.notNullOrUndefined(this.s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');\n }\n keyToPath(cacheKey) {\n let rval = StringRatchet.trimToEmpty(this.prefix);\n if (rval.length > 0 && !rval.endsWith('/')) {\n rval += '/';\n }\n rval += cacheKey;\n return rval;\n }\n async readFromCache(cacheKey) {\n const rval = await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyToPath(cacheKey));\n return rval;\n }\n async storeInCache(value) {\n RequireRatchet.notNullOrUndefined(value, 'value');\n RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');\n const tmp = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyToPath(value.cacheKey), value);\n return !!tmp;\n }\n async removeFromCache(cacheKey) {\n await this.s3CacheRatchet.removeCacheFile(this.keyToPath(cacheKey));\n }\n async clearCache() {\n const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));\n const removed = await Promise.all(keys.map((k) => this.removeFromCache(k)));\n return keys.length;\n }\n async readAll() {\n const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));\n const rval = await Promise.all(keys.map((k) => this.readFromCache(k)));\n return rval;\n }\n}\n//# sourceMappingURL=s3-storage-provider.js.map","import { Logger } from '@bitblit/ratchet-common';\nexport class SimpleCache {\n provider;\n defaultTimeToLiveMS;\n constructor(provider, defaultTimeToLiveMS = 1_000 * 60) {\n this.provider = provider;\n this.defaultTimeToLiveMS = defaultTimeToLiveMS;\n }\n createDefaultReadOptions() {\n return {\n maxStalenessMS: null,\n timeToLiveMS: this.defaultTimeToLiveMS,\n cacheNullValues: false,\n };\n }\n async fetchWrapper(cacheKey, producer, opts = this.createDefaultReadOptions()) {\n Logger.silly('Fetching %s', cacheKey);\n const now = new Date().getTime();\n let rval = await this.provider.readFromCache(cacheKey);\n if (rval && rval.expiresEpochMS < now) {\n Logger.debug('Object found, but expired - removing');\n rval = null;\n }\n if (rval && opts && opts.maxStalenessMS && now - rval.createdEpochMS > opts.maxStalenessMS) {\n Logger.debug('Object found by too stale - removing');\n rval = null;\n }\n if (!rval) {\n Logger.debug('%s not found in cache, generating', cacheKey);\n const tmp = await producer();\n if (tmp || opts?.cacheNullValues) {\n Logger.debug('Writing %j to cache');\n rval = {\n cacheKey: cacheKey,\n createdEpochMS: now,\n expiresEpochMS: opts && opts.timeToLiveMS ? now + opts.timeToLiveMS : null,\n value: tmp,\n generated: false,\n };\n await this.provider.storeInCache(rval);\n rval.generated = true;\n }\n }\n return rval;\n }\n async fetch(cacheKey, producer, opts = null) {\n const wrapper = await this.fetchWrapper(cacheKey, producer, opts);\n return wrapper ? wrapper.value : null;\n }\n async removeFromCache(cacheKey, returnOldValue) {\n let rval = null;\n if (returnOldValue) {\n rval = await this.fetchWrapper(cacheKey, () => null);\n }\n await this.provider.removeFromCache(cacheKey);\n return rval;\n }\n async clearCache() {\n return this.provider.clearCache();\n }\n async readAll() {\n return this.provider.readAll();\n }\n}\n//# sourceMappingURL=simple-cache.js.map","import { CloudWatchLogsClient, DescribeLogStreamsCommand, FilterLogEventsCommand, } from '@aws-sdk/client-cloudwatch-logs';\nimport { Logger, StopWatch } from '@bitblit/ratchet-common';\nexport class CloudWatchLogGroupRatchet {\n logGroup;\n awsCWLogs;\n constructor(logGroup, awsCWLogs = new CloudWatchLogsClient({ region: 'us-east-1' })) {\n this.logGroup = logGroup;\n this.awsCWLogs = awsCWLogs;\n }\n get cloudWatchLogsClient() {\n return this.awsCWLogs;\n }\n async readLogStreams(startTimestamp = null, endTimestamp = null) {\n const params = {\n logGroupName: this.logGroup,\n orderBy: 'LastEventTime',\n };\n const rval = [];\n do {\n Logger.debug('Pulling more log streams (%d found so far)', rval.length);\n const temp = await this.awsCWLogs.send(new DescribeLogStreamsCommand(params));\n temp.logStreams.forEach((s) => {\n if (s.lastEventTimestamp !== null) {\n if (!startTimestamp || s.lastEventTimestamp >= startTimestamp) {\n if (!endTimestamp || s.firstEventTimestamp <= endTimestamp) {\n rval.push(s);\n }\n }\n }\n });\n params.nextToken = temp.nextToken;\n } while (!!params.nextToken);\n Logger.debug('Found %d total, returning', rval.length);\n return rval;\n }\n async readLogStreamNames(startTimestamp = null, endTimestamp = null) {\n const streams = await this.readLogStreams(startTimestamp, endTimestamp);\n const rval = streams.map((s) => s.logStreamName);\n return rval;\n }\n async readEvents(filter, startTimestamp = null, endTimestamp = null, sortEvents = true, maxEvents = null) {\n const sw = new StopWatch();\n const params = {\n logGroupName: this.logGroup,\n endTime: endTimestamp,\n startTime: startTimestamp,\n };\n if (filter) {\n params.filterPattern = filter;\n }\n Logger.debug('Reading log events matching : %j', params);\n let rval = [];\n do {\n Logger.debug('Pulling more log events (%d found so far) : %s', rval.length, sw.dump());\n const temp = await this.awsCWLogs.send(new FilterLogEventsCommand(params));\n rval = rval.concat(temp.events);\n params.nextToken = temp.nextToken;\n } while (!!params.nextToken && (!maxEvents || rval.length < maxEvents));\n Logger.debug('Found %d total in %s', rval.length, sw.dump());\n if (sortEvents) {\n Logger.debug('Sorting events by timestamp');\n rval = rval.sort((a, b) => {\n let rval = a.timestamp - b.timestamp;\n if (rval === 0) {\n rval = a.message.localeCompare(b.message);\n }\n return rval;\n });\n }\n sw.log();\n return rval;\n }\n}\n//# sourceMappingURL=cloud-watch-log-group-ratchet.js.map","import { CloudWatchLogsClient, DeleteLogGroupCommand, DeleteLogStreamCommand, DescribeLogGroupsCommand, DescribeLogStreamsCommand, GetQueryResultsCommand, StartQueryCommand, StopQueryCommand, } from '@aws-sdk/client-cloudwatch-logs';\nimport { Logger, PromiseRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class CloudWatchLogsRatchet {\n static MAX_DELETE_RETRIES = 5;\n cwLogs;\n constructor(cloudwatchLogs = null) {\n this.cwLogs = cloudwatchLogs ? cloudwatchLogs : new CloudWatchLogsClient({ region: 'us-east-1' });\n }\n get cloudWatchLogsClient() {\n return this.cwLogs;\n }\n async removeEmptyOrOldLogStreams(logGroupName, maxToRemove = 1000, oldestEventEpochMS = null) {\n Logger.info('Removing empty streams from %s, oldest event epoch MS : %d', logGroupName, oldestEventEpochMS);\n const streamSearchParams = {\n logGroupName: logGroupName,\n orderBy: 'LastEventTime',\n };\n const oldestEventTester = oldestEventEpochMS || 1;\n let totalStreams = 0;\n const removedStreams = [];\n const failedRemovedStreams = [];\n let waitPerDescribe = 10;\n do {\n Logger.debug('Executing search for streams');\n try {\n const streams = await this.cwLogs.send(new DescribeLogStreamsCommand(streamSearchParams));\n totalStreams += streams.logStreams.length;\n Logger.debug('Found %d streams (%d so far, %d to delete)', streams.logStreams.length, totalStreams, removedStreams.length);\n for (let i = 0; i < streams.logStreams.length && removedStreams.length < maxToRemove; i++) {\n const st = streams.logStreams[i];\n if (!st.firstEventTimestamp) {\n removedStreams.push(st);\n }\n else if (st.lastEventTimestamp < oldestEventTester) {\n removedStreams.push(st);\n }\n }\n streamSearchParams['nextToken'] = streams.nextToken;\n }\n catch (err) {\n const oldWait = waitPerDescribe;\n waitPerDescribe = Math.min(1000, waitPerDescribe * 1.5);\n Logger.info('Caught while describing %s, increasing wait between deletes (was %d, now %d)', err, oldWait, waitPerDescribe);\n }\n } while (!!streamSearchParams['nextToken'] && removedStreams.length < maxToRemove);\n Logger.info('Found %d streams to delete', removedStreams.length);\n let waitPer = 10;\n for (let i = 0; i < removedStreams.length; i++) {\n const delParams = {\n logGroupName: logGroupName,\n logStreamName: removedStreams[i].logStreamName,\n };\n const type = removedStreams[i].storedBytes === 0 ? 'empty' : 'old';\n Logger.info('Removing %s stream %s', type, removedStreams[i].logStreamName);\n let removed = false;\n let retry = 0;\n while (!removed && retry < CloudWatchLogsRatchet.MAX_DELETE_RETRIES) {\n try {\n await this.cwLogs.send(new DeleteLogStreamCommand(delParams));\n removed = true;\n await PromiseRatchet.wait(waitPer);\n }\n catch (err) {\n retry++;\n const oldWait = waitPer;\n waitPer = Math.min(1000, waitPer * 1.5);\n Logger.info('Caught %s, increasing wait between deletes and retrying (wait was %d, now %d) (Retry %d of %d)', err, oldWait, waitPer, retry, CloudWatchLogsRatchet.MAX_DELETE_RETRIES);\n }\n }\n if (!removed) {\n failedRemovedStreams.push(removedStreams[i]);\n }\n }\n Logger.warn('Failed to remove streams : %j', failedRemovedStreams);\n return removedStreams;\n }\n async findOldestEventTimestampInGroup(logGroupName) {\n const stream = await this.findStreamWithOldestEventInGroup(logGroupName);\n return stream ? stream.firstEventTimestamp : null;\n }\n async findStreamWithOldestEventInGroup(logGroupName) {\n Logger.info('Finding oldest event in : %s', logGroupName);\n let rval = null;\n try {\n const streamSearchParams = {\n logGroupName: logGroupName,\n orderBy: 'LastEventTime',\n };\n let totalStreams = 0;\n do {\n Logger.debug('Executing search for streams');\n const streams = await this.cwLogs.send(new DescribeLogStreamsCommand(streamSearchParams));\n totalStreams += streams.logStreams.length;\n Logger.debug('Found %d streams (%d so far)', streams.logStreams.length, totalStreams);\n streams.logStreams.forEach((s) => {\n if (s.firstEventTimestamp && (rval === null || s.firstEventTimestamp < rval.firstEventTimestamp)) {\n rval = s;\n }\n });\n streamSearchParams['nextToken'] = streams.nextToken;\n } while (!!streamSearchParams['nextToken']);\n }\n catch (err) {\n Logger.error('Error attempting to find oldest event in group : %s : %s', logGroupName, err, err);\n }\n return rval;\n }\n async findLogGroups(prefix) {\n RequireRatchet.notNullOrUndefined(prefix);\n const params = {\n logGroupNamePrefix: prefix,\n };\n let rval = [];\n do {\n Logger.info('%d found, pulling log groups : %j', rval.length, params);\n const res = await this.cwLogs.send(new DescribeLogGroupsCommand(params));\n rval = rval.concat(res.logGroups);\n params.nextToken = res.nextToken;\n } while (!!params.nextToken);\n return rval;\n }\n async removeLogGroups(groups) {\n RequireRatchet.notNullOrUndefined(groups);\n const rval = [];\n for (let i = 0; i < groups.length; i++) {\n try {\n Logger.info('Deleting %j', groups[i]);\n const req = {\n logGroupName: groups[i].logGroupName,\n };\n await this.cwLogs.send(new DeleteLogGroupCommand(req));\n rval.push(true);\n }\n catch (err) {\n Logger.error('Failure to delete %j : %s', groups[i], err);\n rval.push(false);\n }\n }\n return rval;\n }\n async removeLogGroupsWithPrefix(prefix) {\n RequireRatchet.notNullOrUndefined(prefix);\n RequireRatchet.true(StringRatchet.trimToEmpty(prefix).length > 0);\n Logger.info('Removing log groups with prefix %s', prefix);\n const groups = await this.findLogGroups(prefix);\n return await this.removeLogGroups(groups);\n }\n async fullyExecuteInsightsQuery(sqr) {\n RequireRatchet.notNullOrUndefined(sqr);\n Logger.debug('Starting insights query : %j', sqr);\n const resp = await this.cwLogs.send(new StartQueryCommand(sqr));\n Logger.debug('Got query id %j', resp);\n let rval = null;\n let delayMS = 100;\n while (!rval || ['Running', 'Scheduled'].includes(rval.status)) {\n rval = await this.cwLogs.send(new GetQueryResultsCommand({ queryId: resp.queryId }));\n await PromiseRatchet.wait(delayMS);\n delayMS *= 2;\n Logger.info('Got : %j', rval);\n }\n return rval;\n }\n async abortInsightsQuery(queryId) {\n let rval = null;\n if (!!queryId) {\n rval = await this.cwLogs.send(new StopQueryCommand({ queryId: queryId }));\n }\n return rval;\n }\n}\n//# sourceMappingURL=cloud-watch-logs-ratchet.js.map","export var CloudWatchMetricsUnit;\n(function (CloudWatchMetricsUnit) {\n CloudWatchMetricsUnit[\"Seconds\"] = \"Seconds\";\n CloudWatchMetricsUnit[\"Microseconds\"] = \"Microseconds\";\n CloudWatchMetricsUnit[\"Milliseconds\"] = \"Milliseconds\";\n CloudWatchMetricsUnit[\"Bytes\"] = \"Bytes\";\n CloudWatchMetricsUnit[\"Kilobytes\"] = \"Kilobytes\";\n CloudWatchMetricsUnit[\"Megabytes\"] = \"Megabytes\";\n CloudWatchMetricsUnit[\"Gigabytes\"] = \"Gigabytes\";\n CloudWatchMetricsUnit[\"Terabytes\"] = \"Terabytes\";\n CloudWatchMetricsUnit[\"Bits\"] = \"Bits\";\n CloudWatchMetricsUnit[\"Kilobits\"] = \"Kilobits\";\n CloudWatchMetricsUnit[\"Megabits\"] = \"Megabits\";\n CloudWatchMetricsUnit[\"Gigabits\"] = \"Gigabits\";\n CloudWatchMetricsUnit[\"Terabits\"] = \"Terabits\";\n CloudWatchMetricsUnit[\"Percent\"] = \"Percent\";\n CloudWatchMetricsUnit[\"Count\"] = \"Count\";\n CloudWatchMetricsUnit[\"BytesPerSecond\"] = \"Bytes/Second\";\n CloudWatchMetricsUnit[\"KilobytesPerSecond\"] = \"Kilobytes/Second\";\n CloudWatchMetricsUnit[\"MegabytesPerSecond\"] = \"Megabytes/Second\";\n CloudWatchMetricsUnit[\"GigabytesPerSecond\"] = \"Gigabytes/Second\";\n CloudWatchMetricsUnit[\"TerabytesPerSecond\"] = \"Terabytes/Second\";\n CloudWatchMetricsUnit[\"BitsPerSecond\"] = \"Terabytes/Second\";\n CloudWatchMetricsUnit[\"KilobitsPerSecond\"] = \"Kilobits/Second\";\n CloudWatchMetricsUnit[\"MegabitsPerSecond\"] = \"Megabits/Second\";\n CloudWatchMetricsUnit[\"GigabitsPerSecond\"] = \"Gigabits/Second\";\n CloudWatchMetricsUnit[\"TerabitsPerSecond\"] = \"Terabits/Second\";\n CloudWatchMetricsUnit[\"CountPerSecond\"] = \"Count/Second\";\n CloudWatchMetricsUnit[\"None\"] = \"None\";\n})(CloudWatchMetricsUnit || (CloudWatchMetricsUnit = {}));\n//# sourceMappingURL=cloud-watch-metrics-unit.js.map","import { CloudWatchClient, PutMetricDataCommand } from '@aws-sdk/client-cloudwatch';\nimport { Logger } from '@bitblit/ratchet-common';\nimport { CloudWatchMetricsUnit } from '../model/cloud-watch-metrics-unit.js';\nimport { DateTime } from 'luxon';\nexport class CloudWatchMetricsRatchet {\n cw;\n constructor(cloudWatch = null) {\n this.cw = cloudWatch ? cloudWatch : new CloudWatchClient({ region: 'us-east-1', apiVersion: '2010-08-01' });\n }\n get cloudWatchClient() {\n return this.cw;\n }\n async writeSingleMetric(namespace, metric, dims, unit = CloudWatchMetricsUnit.None, value, timestampDate = new Date(), highResolution = false) {\n const cwDims = [];\n if (!!dims && dims.length > 0) {\n dims.forEach((d) => {\n cwDims.push({ Name: d.key, Value: d.value });\n });\n }\n const storageResolution = highResolution ? 1 : 60;\n const metricData = {\n Namespace: namespace,\n MetricData: [\n {\n MetricName: metric,\n Dimensions: cwDims,\n Unit: String(unit),\n Value: value,\n Timestamp: timestampDate,\n StorageResolution: storageResolution,\n },\n ],\n };\n Logger.silly('Writing metric to cw : %j', metricData);\n const result = await this.cw.send(new PutMetricDataCommand(metricData));\n Logger.silly('Result: %j', result);\n return result;\n }\n async writeDynamoCountAsMinuteLevelMetric(req) {\n Logger.info('Publishing %s / %s metric for %s UTC', req.namespace, req.metric, req.minuteUTC);\n if (!!req.scan && !!req.query) {\n throw new Error('Must send query or scan, but not both');\n }\n if (!req.scan && !req.query) {\n throw new Error('You must specify either a scan or a query');\n }\n const cnt = !!req.query\n ? await req.dynamoRatchet.fullyExecuteQueryCount(req.query)\n : await req.dynamoRatchet.fullyExecuteScanCount(req.scan);\n Logger.debug('%s / %s for %s are %j', req.namespace, req.metric, req.minuteUTC, cnt);\n const parseDateString = req.minuteUTC.split(' ').join('T') + ':00Z';\n const parseDate = DateTime.fromISO(parseDateString).toJSDate();\n const metricRes = await this.writeSingleMetric(req.namespace, req.metric, req.dims, CloudWatchMetricsUnit.Count, cnt.count, parseDate, false);\n Logger.debug('Metrics response: %j', metricRes);\n return cnt.count;\n }\n}\n//# sourceMappingURL=cloud-watch-metrics-ratchet.js.map","import { Logger, StringRatchet } from '@bitblit/ratchet-common';\nimport { PutObjectCommand, } from '@aws-sdk/client-s3';\nimport { Upload } from '@aws-sdk/lib-storage';\nexport class DaemonUtil {\n static DEFAULT_CONTENT = Buffer.from('DAEMON_PLACEHOLDER');\n static DAEMON_METADATA_KEY = 'daemon_meta';\n static async start(cache, id, s3Key, options) {\n try {\n options.meta = options.meta || {};\n Logger.info('Starting daemon, key: %s, options: %j', s3Key, options);\n const now = new Date().getTime();\n const newState = {\n id: id,\n title: options.title,\n lastUpdatedEpochMS: now,\n lastUpdatedMessage: 'Created',\n targetFileName: options.targetFileName,\n startedEpochMS: now,\n completedEpochMS: null,\n meta: options.meta,\n error: null,\n link: null,\n contentType: options.contentType,\n };\n const rval = await DaemonUtil.writeState(cache, s3Key, newState, DaemonUtil.DEFAULT_CONTENT);\n return rval;\n }\n catch (err) {\n Logger.error('Error while trying to start a daemon: %j %s', options, err);\n throw err;\n }\n }\n static async writeState(cache, s3Key, newState, contents) {\n try {\n const s3meta = {};\n newState.lastUpdatedEpochMS = new Date().getTime();\n s3meta[DaemonUtil.DAEMON_METADATA_KEY] = JSON.stringify(newState);\n const params = {\n Bucket: cache.getDefaultBucket(),\n Key: s3Key,\n ContentType: newState.contentType,\n Metadata: s3meta,\n Body: new Blob([contents]),\n };\n if (newState.targetFileName) {\n params.ContentDisposition = 'attachment;filename=\"' + newState.targetFileName + '\"';\n }\n const written = await cache.getS3Client().send(new PutObjectCommand(params));\n Logger.silly('Daemon wrote : %s', written);\n return DaemonUtil.stat(cache, s3Key);\n }\n catch (err) {\n Logger.error('Error while trying to write a daemon stat: %j %s', newState, err);\n throw err;\n }\n }\n static async streamDataAndFinish(cache, s3Key, data, options) {\n Logger.debug('Streaming data to %s', s3Key);\n const inStat = await DaemonUtil.updateMessage(cache, s3Key, 'Streaming data');\n inStat.completedEpochMS = new Date().getTime();\n inStat.lastUpdatedMessage = 'Complete';\n const s3meta = {};\n s3meta[DaemonUtil.DAEMON_METADATA_KEY] = JSON.stringify(inStat);\n const params = {\n Bucket: cache.getDefaultBucket(),\n Key: s3Key,\n ContentType: inStat.contentType,\n Metadata: s3meta,\n Body: data,\n };\n const targetFileName = StringRatchet.trimToNull(options?.overrideTargetFileName) || StringRatchet.trimToNull(inStat?.targetFileName);\n if (targetFileName) {\n params.ContentDisposition = 'attachment;filename=\"' + targetFileName + '\"';\n }\n const upload = new Upload({\n client: cache.getS3Client(),\n params: params,\n tags: [],\n queueSize: 4,\n partSize: 1024 * 1024 * 5,\n leavePartsOnError: false,\n });\n upload.on('httpUploadProgress', (progress) => {\n Logger.info('Uploading : %s', progress);\n });\n const written = await upload.done();\n Logger.silly('Daemon wrote : %s', written);\n return DaemonUtil.stat(cache, s3Key);\n }\n static async updateMessage(cache, s3Key, newMessage) {\n try {\n const inStat = await DaemonUtil.stat(cache, s3Key);\n inStat.lastUpdatedMessage = newMessage;\n return DaemonUtil.writeState(cache, s3Key, inStat, DaemonUtil.DEFAULT_CONTENT);\n }\n catch (err) {\n Logger.error('Error while trying to update a daemon message: %j %s', s3Key, err);\n throw err;\n }\n }\n static async stat(s3Cache, path) {\n try {\n Logger.debug('Daemon stat for path %s / %s', s3Cache.getDefaultBucket(), path);\n let stat = null;\n const meta = await s3Cache.fetchMetaForCacheFile(path);\n Logger.debug('Daemon: Meta is %j', meta);\n const metaString = meta && meta.Metadata ? meta.Metadata[DaemonUtil.DAEMON_METADATA_KEY] : null;\n if (metaString) {\n stat = JSON.parse(metaString);\n if (stat.completedEpochMS && !stat.error) {\n stat.link = await s3Cache.preSignedDownloadUrlForCacheFile(path);\n }\n }\n else {\n Logger.warn('No metadata found! (Head was %j)', meta);\n }\n return stat;\n }\n catch (err) {\n Logger.error('Error while trying to fetch a daemon state: %j %s', path, err);\n throw err;\n }\n }\n static async abort(s3Cache, path) {\n return DaemonUtil.error(s3Cache, path, 'Aborted');\n }\n static async error(s3Cache, path, error) {\n try {\n const inStat = await DaemonUtil.stat(s3Cache, path);\n inStat.error = error;\n inStat.completedEpochMS = new Date().getTime();\n return DaemonUtil.writeState(s3Cache, path, inStat, DaemonUtil.DEFAULT_CONTENT);\n }\n catch (err) {\n Logger.error('Error while trying to write a daemon error: %j %s', path, err);\n throw err;\n }\n }\n static async finalize(s3Cache, path, contents) {\n try {\n Logger.info('Finalizing daemon %s with %d bytes', path, contents.length);\n const inStat = await DaemonUtil.stat(s3Cache, path);\n inStat.completedEpochMS = new Date().getTime();\n inStat.lastUpdatedMessage = 'Complete';\n return DaemonUtil.writeState(s3Cache, path, inStat, contents);\n }\n catch (err) {\n Logger.error('Error while trying to finalize a daemon: %j %s', path, err);\n throw err;\n }\n }\n}\n//# sourceMappingURL=daemon-util.js.map","import { CopyObjectCommand, DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsCommand, NoSuchKey, } from '@aws-sdk/client-s3';\nimport { Logger, RequireRatchet, StopWatch, WebStreamRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { Upload } from '@aws-sdk/lib-storage';\nexport class S3CacheRatchet {\n s3;\n defaultBucket;\n constructor(s3, defaultBucket = null) {\n this.s3 = s3;\n this.defaultBucket = defaultBucket;\n RequireRatchet.notNullOrUndefined(this.s3, 's3');\n }\n get s3Client() {\n return this.s3;\n }\n static applyCacheControlMaxAge(input, seconds) {\n if (input && seconds) {\n input.CacheControl = 'max-age=' + seconds;\n }\n return input;\n }\n static applyUserMetaData(input, key, value) {\n if (input && StringRatchet.trimToNull(key) && StringRatchet.trimToNull(value)) {\n input.Metadata = input.Metadata || {};\n input.Metadata[key] = value;\n }\n return input;\n }\n getDefaultBucket() {\n return this.defaultBucket;\n }\n getS3Client() {\n return this.s3;\n }\n async fileExists(key, bucket = null) {\n try {\n const head = await this.fetchMetaForCacheFile(key, this.bucketVal(bucket));\n return !!head;\n }\n catch (err) {\n Logger.silly('Error calling file exists (as expected) %s', err);\n return false;\n }\n }\n async fetchCacheFileAsS3GetObjectCommandOutput(key, bucket = null) {\n let rval = null;\n try {\n const params = {\n Bucket: this.bucketVal(bucket),\n Key: key,\n };\n rval = await this.s3.send(new GetObjectCommand(params));\n }\n catch (err) {\n if (err instanceof NoSuchKey) {\n Logger.debug('Key %s not found - returning null', key);\n rval = null;\n }\n else {\n throw err;\n }\n }\n return rval;\n }\n async fetchCacheFileAsReadableStream(key, bucket = null) {\n const out = await this.fetchCacheFileAsS3GetObjectCommandOutput(key, bucket);\n return out.Body.transformToWebStream();\n }\n async fetchCacheFileAsBuffer(key, bucket = null) {\n let rval = null;\n const out = await this.fetchCacheFileAsS3GetObjectCommandOutput(key, bucket);\n if (out?.Body) {\n const tmp = await out.Body.transformToByteArray();\n rval = Buffer.from(tmp);\n }\n return rval;\n }\n async fetchCacheFileAsString(key, bucket = null) {\n let rval = null;\n const out = await this.fetchCacheFileAsS3GetObjectCommandOutput(key, bucket);\n if (out?.Body) {\n rval = await out.Body.transformToString();\n }\n return rval;\n }\n async fetchCacheFileAsObject(key, bucket = null) {\n const value = await this.fetchCacheFileAsString(key, bucket);\n return value ? JSON.parse(value) : null;\n }\n async removeCacheFile(key, bucket = null) {\n let rval = null;\n const params = {\n Bucket: this.bucketVal(bucket),\n Key: key,\n };\n try {\n rval = await this.s3.send(new DeleteObjectCommand(params));\n }\n catch (err) {\n if (err && err['statusCode'] == 404) {\n Logger.info('Swallowing 404 deleting missing object %s %s', bucket, key);\n rval = null;\n }\n else {\n throw err;\n }\n }\n return rval;\n }\n async writeObjectToCacheFile(key, dataObject, template, bucket) {\n const json = JSON.stringify(dataObject);\n return this.writeStringToCacheFile(key, json, template, bucket);\n }\n async writeStringToCacheFile(key, dataString, template, bucket) {\n const stream = WebStreamRatchet.stringToWebReadableStream(dataString);\n return this.writeStreamToCacheFile(key, stream, template, bucket);\n }\n async writeStreamToCacheFile(key, data, template, bucket) {\n const params = Object.assign({}, template || {}, {\n Bucket: this.bucketVal(bucket),\n Key: key,\n Body: data,\n });\n const upload = new Upload({\n client: this.s3,\n params: params,\n tags: [],\n queueSize: 4,\n partSize: 1024 * 1024 * 5,\n leavePartsOnError: false,\n });\n upload.on('httpUploadProgress', (progress) => {\n Logger.info('Uploading : %s', progress);\n });\n const result = await upload.done();\n return result;\n }\n async synchronize(srcPrefix, targetPrefix, targetRatchet = this, recurseSubFolders = false) {\n RequireRatchet.notNullOrUndefined(srcPrefix, 'srcPrefix');\n RequireRatchet.notNullOrUndefined(targetPrefix, 'targetPrefix');\n RequireRatchet.true(srcPrefix.endsWith('/'), 'srcPrefix must end in /');\n RequireRatchet.true(targetPrefix.endsWith('/'), 'targetPrefix must end in /');\n let rval = [];\n const sourceFiles = await this.directChildrenOfPrefix(srcPrefix);\n const targetFiles = await targetRatchet.directChildrenOfPrefix(targetPrefix);\n const sw = new StopWatch();\n for (let i = 0; i < sourceFiles.length; i++) {\n const sourceFile = sourceFiles[i];\n Logger.info('Processing %s : %s', sourceFile, sw.dumpExpected(i / sourceFiles.length));\n if (sourceFile.endsWith('/')) {\n if (recurseSubFolders) {\n Logger.info('%s is a subfolder - recursing');\n const subs = await this.synchronize(srcPrefix + sourceFile, targetPrefix + sourceFile, targetRatchet, recurseSubFolders);\n Logger.info('Got %d back from %s', subs.length, sourceFile);\n rval = rval.concat(subs);\n }\n else {\n Logger.info('%s is a subfolder and recurse not specified - skipping', sourceFile);\n }\n }\n else {\n let shouldCopy = true;\n const srcMeta = await this.fetchMetaForCacheFile(srcPrefix + sourceFile);\n if (targetFiles.includes(sourceFile)) {\n const targetMeta = await targetRatchet.fetchMetaForCacheFile(targetPrefix + sourceFile);\n if (srcMeta.ETag === targetMeta.ETag) {\n Logger.debug('Skipping - identical');\n shouldCopy = false;\n }\n }\n if (shouldCopy) {\n Logger.debug('Copying...');\n const srcStream = await this.fetchCacheFileAsReadableStream(srcPrefix + sourceFile);\n try {\n const written = await targetRatchet.writeStreamToCacheFile(targetPrefix + sourceFile, srcStream, srcMeta, undefined);\n Logger.silly('Write result : %j', written);\n rval.push(sourceFile);\n }\n catch (err) {\n Logger.error('Failed to sync : %s : %s', sourceFile, err);\n }\n }\n }\n }\n Logger.info('Found %d files, copied %d', sourceFiles.length, rval.length);\n sw.log();\n return rval;\n }\n async fetchMetaForCacheFile(key, bucket = null) {\n let rval = null;\n try {\n rval = await this.s3.send(new HeadObjectCommand({\n Bucket: this.bucketVal(bucket),\n Key: key,\n }));\n }\n catch (err) {\n if (err && err['statusCode'] == 404) {\n Logger.info('Cache file %s %s not found returning null', this.bucketVal(bucket), key);\n rval = null;\n }\n else {\n Logger.error('Unrecognized error, rethrowing : %s', err, err);\n throw err;\n }\n }\n return rval;\n }\n async cacheFileAgeInSeconds(key, bucket = null) {\n try {\n const res = await this.fetchMetaForCacheFile(key, bucket);\n if (res && res.LastModified) {\n return Math.floor((new Date().getTime() - res.LastModified.getTime()) / 1000);\n }\n else {\n Logger.warn('Cache file %s %s had no last modified returning null', this.bucketVal(bucket), key);\n return null;\n }\n }\n catch (err) {\n if (err && err['statusCode'] == 404) {\n Logger.warn('Cache file %s %s not found returning null', this.bucketVal(bucket), key);\n return null;\n }\n else {\n throw err;\n }\n }\n }\n async copyFile(srcKey, dstKey, srcBucket = null, dstBucket = null) {\n const params = {\n CopySource: '/' + this.bucketVal(srcBucket) + '/' + srcKey,\n Bucket: this.bucketVal(dstBucket),\n Key: dstKey,\n MetadataDirective: 'COPY',\n };\n const rval = await this.s3.send(new CopyObjectCommand(params));\n return rval;\n }\n async quietCopyFile(srcKey, dstKey, srcBucket = null, dstBucket = null) {\n let rval = false;\n try {\n const tmp = await this.copyFile(srcKey, dstKey, srcBucket, dstBucket);\n rval = true;\n }\n catch (err) {\n Logger.silly('Failed to copy file in S3 : %s', err);\n }\n return rval;\n }\n async preSignedDownloadUrlForCacheFile(key, expirationSeconds = 3600, bucket = null) {\n const getCommand = {\n Bucket: this.bucketVal(bucket),\n Key: key,\n };\n const link = await getSignedUrl(this.s3, new GetObjectCommand(getCommand), { expiresIn: expirationSeconds });\n return link;\n }\n async directChildrenOfPrefix(prefix, expandFiles = false, bucket = null, maxToReturn = null) {\n const returnValue = [];\n const params = {\n Bucket: this.bucketVal(bucket),\n Prefix: prefix,\n Delimiter: '/',\n };\n let response = null;\n do {\n response = await this.s3.send(new ListObjectsCommand(params));\n const prefixLength = prefix.length;\n if (response['CommonPrefixes']) {\n response['CommonPrefixes'].forEach((cp) => {\n if (!maxToReturn || returnValue.length < maxToReturn) {\n const value = cp['Prefix'].substring(prefixLength);\n returnValue.push(value);\n }\n });\n }\n if (response['Contents']) {\n await Promise.all(response['Contents'].map(async (cp) => {\n if (!maxToReturn || returnValue.length < maxToReturn) {\n if (expandFiles) {\n const expanded = {\n link: await this.preSignedDownloadUrlForCacheFile(cp['Key'], 3600, bucket),\n name: cp['Key'].substring(prefixLength),\n size: cp['Size'],\n };\n returnValue.push(expanded);\n }\n else {\n returnValue.push(cp['Key'].substring(prefixLength));\n }\n }\n }));\n }\n params.Marker = response.NextMarker;\n } while (params.Marker && (!maxToReturn || returnValue.length < maxToReturn));\n return returnValue;\n }\n async allSubFoldersOfPrefix(prefix, bucket = null) {\n const returnValue = [prefix];\n let idx = 0;\n while (idx < returnValue.length) {\n const next = returnValue[idx++];\n Logger.debug('Pulling %s (%d remaining)', next, returnValue.length - idx);\n const req = {\n Bucket: this.bucketVal(bucket),\n Prefix: next,\n Delimiter: '/',\n };\n let resp = null;\n do {\n req.ContinuationToken = resp ? resp.NextContinuationToken : null;\n resp = await this.s3.send(new ListObjectsCommand(req));\n resp.CommonPrefixes.forEach((p) => {\n returnValue.push(p.Prefix);\n });\n Logger.debug('g:%j', resp);\n } while (resp.NextContinuationToken);\n }\n return returnValue;\n }\n bucketVal(explicitBucket) {\n const rval = explicitBucket ? explicitBucket : this.defaultBucket;\n if (!rval) {\n throw 'You must set either the default bucket or pass it explicitly';\n }\n return rval;\n }\n}\n//# sourceMappingURL=s3-cache-ratchet.js.map","import { Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { S3CacheRatchet } from '../s3/s3-cache-ratchet.js';\nimport { DaemonUtil } from './daemon-util.js';\nexport class Daemon {\n s3;\n bucket;\n prefix;\n _defaultGroup;\n jwtRatchet;\n static DEFAULT_DEFAULT_GROUP = 'DEFAULT';\n cache;\n constructor(s3, bucket, prefix = '', _defaultGroup = Daemon.DEFAULT_DEFAULT_GROUP, jwtRatchet) {\n this.s3 = s3;\n this.bucket = bucket;\n this.prefix = prefix;\n this._defaultGroup = _defaultGroup;\n this.jwtRatchet = jwtRatchet;\n this.cache = new S3CacheRatchet(this.s3, this.bucket);\n }\n get defaultGroup() {\n return this._defaultGroup;\n }\n async keyToPublicToken(key, expirationSeconds) {\n RequireRatchet.notNullOrUndefined(this.jwtRatchet, 'You must set jwtRatchet if you wish to use public tokens');\n RequireRatchet.notNullOrUndefined(key, 'key');\n RequireRatchet.true(expirationSeconds > 0, 'Expiration seconds must be larger than 0');\n const token = { daemonKey: key };\n const publicToken = await this.jwtRatchet.createTokenString(token, expirationSeconds);\n return publicToken;\n }\n keyToPath(key) {\n return Buffer.from(key, 'base64').toString();\n }\n pathToKey(path) {\n return Buffer.from(path).toString('base64');\n }\n generatePath(group = this._defaultGroup) {\n return this.generatePrefix(group) + StringRatchet.createType4Guid();\n }\n generatePrefix(group = this._defaultGroup) {\n return this.prefix + group + '/';\n }\n async start(options) {\n options.group = options.group || this._defaultGroup;\n const path = this.generatePath(options.group);\n const key = this.pathToKey(path);\n return DaemonUtil.start(this.cache, key, path, options);\n }\n async writeState(newState, contents) {\n const key = this.keyToPath(newState.id);\n return DaemonUtil.writeState(this.cache, key, newState, contents);\n }\n async clean(group = this._defaultGroup, olderThanSeconds = 60 * 60 * 24 * 7) {\n try {\n Logger.info('Daemon removing items older than %d seconds from group %s', olderThanSeconds, group);\n const original = await this.list(group);\n const now = new Date().getTime();\n const removed = [];\n for (let i = 0; i < original.length; i++) {\n const test = original[i];\n const ageSeconds = (now - test.startedEpochMS) / 1000;\n if (ageSeconds > olderThanSeconds) {\n const remove = await this.cache.removeCacheFile(this.keyToPath(test.id));\n removed.push(test);\n }\n }\n Logger.debug('Removed %d of %d items', removed.length, original.length);\n return removed;\n }\n catch (err) {\n Logger.error('Error while trying to clean a daemon: %j %s', group, err);\n throw err;\n }\n }\n async listKeys(group = this._defaultGroup) {\n try {\n const prefix = this.generatePrefix(group);\n Logger.info('Fetching children of %s', prefix);\n const rval = await this.cache.directChildrenOfPrefix(prefix);\n Logger.debug('Found : %j', rval);\n return rval;\n }\n catch (err) {\n Logger.error('Error while trying to list daemon keys: %j %s', group, err);\n throw err;\n }\n }\n async list(group = this._defaultGroup) {\n try {\n const prefix = this.generatePrefix(group);\n Logger.info('Fetching children of %s', prefix);\n const keys = await this.listKeys(group);\n const proms = keys.map((k) => this.stat(this.pathToKey(this.generatePrefix(group) + k)));\n const rval = await Promise.all(proms);\n return rval;\n }\n catch (err) {\n Logger.error('Error while trying to list daemon states: %j %s', group, err);\n throw err;\n }\n }\n async updateMessage(id, newMessage) {\n const itemPath = this.keyToPath(id);\n return DaemonUtil.updateMessage(this.cache, itemPath, newMessage);\n }\n async stat(key) {\n const itemPath = this.keyToPath(key);\n return DaemonUtil.stat(this.cache, itemPath);\n }\n async statFromPublicToken(publicToken) {\n RequireRatchet.notNullOrUndefined(this.jwtRatchet, 'You must set jwtRatchet if you wish to use public tokens');\n RequireRatchet.notNullOrUndefined(publicToken, 'publicToken');\n const parsed = await this.jwtRatchet.decodeToken(publicToken);\n const key = parsed?.daemonKey;\n return key ? this.stat(key) : null;\n }\n async abort(id) {\n return DaemonUtil.abort(this.cache, this.keyToPath(id));\n }\n async error(id, error) {\n return DaemonUtil.error(this.cache, this.keyToPath(id), error);\n }\n async finalize(id, contents) {\n return DaemonUtil.finalize(this.cache, this.keyToPath(id), contents);\n }\n}\n//# sourceMappingURL=daemon.js.map","import { MapRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { DateTime } from 'luxon';\nexport class PrototypeDao {\n provider;\n cfg;\n static defaultDaoConfig() {\n return {\n guidCreateFunction: StringRatchet.createType4Guid,\n guidFieldName: 'guid',\n createdEpochMSFieldName: 'createdEpochMS',\n updatedEpochMSFieldName: 'updatedEpochMS',\n createdUtcTimestampFieldName: null,\n updatedUtcTimestampFieldName: null,\n };\n }\n constructor(provider, cfg = PrototypeDao.defaultDaoConfig()) {\n this.provider = provider;\n this.cfg = cfg;\n RequireRatchet.notNullOrUndefined(provider, 'provider');\n RequireRatchet.notNullOrUndefined(cfg, 'cfg');\n RequireRatchet.notNullOrUndefined(cfg.guidCreateFunction, 'cfg.guidCreateFunction');\n RequireRatchet.notNullOrUndefined(cfg.guidFieldName, 'cfg.guidFieldName');\n }\n async fetchAll() {\n const db = await this.provider.loadDatabase();\n return db.items || [];\n }\n async resetDatabase() {\n await this.provider.storeDatabase({ items: [], lastModifiedEpochMS: Date.now() });\n }\n async removeItems(guids) {\n let old = await this.fetchAll();\n if (guids) {\n old = old.filter((t) => !guids.includes(t[this.cfg.guidFieldName]));\n await this.provider.storeDatabase({ items: old, lastModifiedEpochMS: Date.now() });\n }\n return old;\n }\n async store(value) {\n let old = await this.fetchAll();\n if (value) {\n value[this.cfg.guidFieldName] = value[this.cfg.guidFieldName] || this.cfg.guidCreateFunction();\n if (this.cfg.createdEpochMSFieldName) {\n value[this.cfg.createdEpochMSFieldName] = value[this.cfg.createdEpochMSFieldName] || Date.now();\n }\n if (this.cfg.createdUtcTimestampFieldName) {\n value[this.cfg.createdUtcTimestampFieldName] = value[this.cfg.createdUtcTimestampFieldName] || DateTime.utc().toISO();\n }\n if (this.cfg.updatedEpochMSFieldName) {\n value[this.cfg.updatedEpochMSFieldName] = Date.now();\n }\n if (this.cfg.updatedUtcTimestampFieldName) {\n value[this.cfg.updatedUtcTimestampFieldName] = DateTime.utc().toISO();\n }\n old = old.filter((t) => t[this.cfg.guidFieldName] !== value[this.cfg.guidFieldName]);\n old.push(value);\n await this.provider.storeDatabase({ items: old, lastModifiedEpochMS: Date.now() });\n }\n return value;\n }\n async fetchById(guid) {\n const old = await this.fetchAll();\n return old.find((t) => t[this.cfg.guidFieldName] === guid);\n }\n async searchByField(fieldDotPath, fieldValue) {\n RequireRatchet.notNullOrUndefined(fieldDotPath, 'fieldDotPath');\n RequireRatchet.notNullOrUndefined(fieldValue, 'fieldValue');\n const map = {};\n map[fieldDotPath] = fieldValue;\n return this.searchByFieldMap(map);\n }\n async searchByFieldMap(input) {\n RequireRatchet.notNullOrUndefined(input, 'input');\n let old = await this.fetchAll();\n old = old.filter((t) => {\n let matchAll = true;\n Object.keys(input).forEach((k) => {\n const val = MapRatchet.findValueDotPath(t, k);\n const fieldValue = input[k];\n matchAll = matchAll && val === fieldValue;\n });\n return matchAll;\n });\n return old;\n }\n}\n//# sourceMappingURL=prototype-dao.js.map","import { RequireRatchet } from '@bitblit/ratchet-common';\nexport class S3PrototypeDaoProvider {\n s3CacheRatchet;\n keyName;\n constructor(s3CacheRatchet, keyName) {\n this.s3CacheRatchet = s3CacheRatchet;\n this.keyName = keyName;\n RequireRatchet.notNullOrUndefined(s3CacheRatchet, 's3CacheRatchet');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(keyName, 'keyName');\n }\n async storeDatabase(inDb) {\n const toSave = inDb || { items: [], lastModifiedEpochMS: null };\n toSave.lastModifiedEpochMS = Date.now();\n const put = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyName, toSave);\n const rval = !!put;\n return rval;\n }\n async loadDatabase() {\n const rval = (await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyName)) || {\n items: [],\n lastModifiedEpochMS: Date.now(),\n };\n return rval;\n }\n}\n//# sourceMappingURL=s3-prototype-dao-provider.js.map","import { Logger, StringRatchet } from '@bitblit/ratchet-common';\nexport class S3SimpleDao {\n cache;\n prefix;\n constructor(cache, prefix) {\n this.cache = cache;\n this.prefix = prefix;\n if (!cache) {\n throw new Error('cache object may not be null');\n }\n if (!cache.getDefaultBucket()) {\n throw new Error('Supplied cache must have default bucket set');\n }\n }\n buildPathPrefix(path) {\n let rval = '';\n if (this.prefix) {\n rval += this.prefix;\n }\n if (path) {\n rval += path;\n }\n return rval;\n }\n buildFullPath(id, path) {\n let rval = this.buildPathPrefix(path);\n if (rval.length > 0) {\n rval += '/';\n }\n rval += id + '.json';\n return rval;\n }\n async exists(id, path) {\n const fullPath = this.buildFullPath(id, path);\n Logger.debug('Check file existence : %s', fullPath);\n return this.cache.fileExists(fullPath);\n }\n async fetch(id, path) {\n const fullPath = this.buildFullPath(id, path);\n Logger.debug('Fetching : %s', fullPath);\n const rval = (await this.cache.fetchCacheFileAsObject(fullPath));\n rval.id = id;\n rval.path = path;\n return rval;\n }\n async store(item, path) {\n item.id = item.id || StringRatchet.createType4Guid();\n item.lastModifiedEpochMS = new Date().getTime();\n const fullPath = this.buildFullPath(item.id, path);\n Logger.debug('Storing : %s', fullPath);\n const stored = await this.cache.writeObjectToCacheFile(fullPath, item);\n const read = await this.fetch(item.id, path);\n return read;\n }\n async listItems(path) {\n const fullPath = this.buildPathPrefix(path);\n Logger.debug('Listing : %s', fullPath);\n const rval = await this.cache.directChildrenOfPrefix(fullPath);\n return rval;\n }\n async fetchItemsInPath(path) {\n const fullPath = this.buildPathPrefix(path);\n Logger.debug('Full fetch of : %s', fullPath);\n const items = await this.listItems(path);\n const promises = items.map((s) => this.fetch(s, path));\n const rval = await Promise.all(promises);\n return rval;\n }\n async delete(id, path) {\n const fullPath = this.buildFullPath(id, path);\n Logger.debug('Deleting : %s', fullPath);\n const del = await this.cache.removeCacheFile(fullPath);\n return del != null;\n }\n}\n//# sourceMappingURL=s3-simple-dao.js.map","import { BatchGetCommand, BatchWriteCommand, DeleteCommand, GetCommand, PutCommand, QueryCommand, ScanCommand, } from '@aws-sdk/lib-dynamodb';\nimport { DurationRatchet, ErrorRatchet, Logger, NumberRatchet, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nimport { UpdateItemCommand, } from '@aws-sdk/client-dynamodb';\nexport class DynamoRatchet {\n awsDDB;\n constructor(awsDDB) {\n this.awsDDB = awsDDB;\n if (!awsDDB) {\n throw 'awsDDB may not be null';\n }\n }\n get dynamoDBDocumentClient() {\n return this.awsDDB;\n }\n getDDB() {\n return this.awsDDB;\n }\n async tableIsEmpty(tableName) {\n const scan = {\n TableName: tableName,\n Limit: 1,\n };\n const ScanCommandOutput = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n return ScanCommandOutput.Items.length === 0;\n }\n async scanPromise(input) {\n return this.awsDDB.send(new ScanCommand(input));\n }\n async queryPromise(input) {\n return this.awsDDB.send(new QueryCommand(input));\n }\n async throughputSafeScanOrQuery(proc, input, maxTries, inCurrentTry) {\n let rval = null;\n if (input) {\n let currentTry = inCurrentTry ?? 0;\n do {\n currentTry++;\n try {\n rval = await proc(input);\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded scan throughput for %j : Try %d of %d (Waiting %d ms)', input, currentTry, maxTries, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else {\n throw err;\n }\n }\n } while (!rval && (!maxTries || currentTry < maxTries));\n if (!rval) {\n ErrorRatchet.throwFormattedErr('throughputSafeScan failed - tried %d times, kept running into throughput exceeded : %j', maxTries, input);\n }\n }\n return rval;\n }\n async fullyExecuteQueryCount(qry, delayMS = 0) {\n try {\n qry.Select = 'COUNT';\n Logger.debug('Executing count query : %j', qry);\n const rval = {\n count: 0,\n scannedCount: 0,\n pages: 0,\n };\n const start = new Date().getTime();\n let qryResults = null;\n const myLimit = qry.Limit;\n qry.Limit = null;\n do {\n qryResults = await this.throughputSafeScanOrQuery((o) => this.queryPromise(o), qry);\n rval.count += qryResults['Count'];\n rval.scannedCount += qryResults['ScannedCount'];\n rval.pages++;\n qry['ExclusiveStartKey'] = qryResults.LastEvaluatedKey;\n await PromiseRatchet.wait(delayMS);\n Logger.silly('Rval is now %j', rval);\n if (myLimit && rval.count >= myLimit && qry['ExclusiveStartKey']) {\n Logger.info('Aborting query since hit limit of %d', myLimit);\n qry['ExclusiveStartKey'] = null;\n }\n } while (qry['ExclusiveStartKey']);\n const end = new Date().getTime();\n Logger.debug('Finished, returned %j in %s for %j', rval, DurationRatchet.formatMsDuration(end - start, true), qry);\n return rval;\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, qry, err);\n return null;\n }\n }\n async fullyExecuteQuery(qry, delayMS = 0, softLimit = null) {\n const rval = [];\n await this.fullyExecuteProcessOverQuery(qry, async (v) => {\n rval.push(v);\n }, delayMS, softLimit);\n return rval;\n }\n async fullyExecuteProcessOverQuery(qry, proc, delayMS = 0, softLimit = null) {\n let cnt = 0;\n try {\n Logger.debug('Executing query : %j', qry);\n const start = new Date().getTime();\n Logger.debug('Pulling %j', qry);\n let qryResults = await this.throughputSafeScanOrQuery((o) => this.queryPromise(o), qry);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n let pages = 0;\n let blankPages = 0;\n while (qryResults.LastEvaluatedKey && (softLimit === null || cnt < softLimit) && !qry.Limit) {\n Logger.silly('Found more rows - requery with key %j', qryResults.LastEvaluatedKey);\n qry['ExclusiveStartKey'] = qryResults.LastEvaluatedKey;\n qryResults = await this.throughputSafeScanOrQuery((o) => this.queryPromise(o), qry);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n Logger.silly('Have processed %d items', cnt);\n pages++;\n blankPages += qryResults.Count === 0 ? 1 : 0;\n await PromiseRatchet.wait(delayMS);\n }\n const end = new Date().getTime();\n Logger.debug('Finished, processed %d rows in %s for %j (%d blank pages, %d total pages)', cnt, DurationRatchet.formatMsDuration(end - start, true), qry, blankPages, pages);\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, qry, err);\n }\n return cnt;\n }\n async fullyExecuteScanCount(scan, delayMS = 0) {\n try {\n scan.Select = 'COUNT';\n const rval = {\n count: 0,\n scannedCount: 0,\n pages: 0,\n };\n Logger.debug('Executing scan count : %j', scan);\n const start = new Date().getTime();\n let qryResults = null;\n const myLimit = scan.Limit;\n scan.Limit = null;\n do {\n qryResults = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n rval.count += qryResults['Count'];\n rval.scannedCount += qryResults['ScannedCount'];\n rval.pages++;\n scan['ExclusiveStartKey'] = qryResults?.LastEvaluatedKey;\n await PromiseRatchet.wait(delayMS);\n Logger.silly('Rval is now %j', rval);\n if (myLimit && rval.count >= myLimit && scan['ExclusiveStartKey']) {\n Logger.info('Aborting scan since hit limit of %d', myLimit);\n scan['ExclusiveStartKey'] = null;\n }\n } while (scan['ExclusiveStartKey']);\n const end = new Date().getTime();\n Logger.debug('Finished, returned %j in %s for %j', rval, DurationRatchet.formatMsDuration(end - start, true), scan);\n return rval;\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, scan, err);\n return null;\n }\n }\n async fullyExecuteScan(scan, delayMS = 0, softLimit = null) {\n const rval = [];\n await this.fullyExecuteProcessOverScan(scan, async (v) => {\n rval.push(v);\n }, delayMS, softLimit);\n return rval;\n }\n async fullyExecuteProcessOverScan(scan, proc, delayMS = 0, softLimit = null) {\n let cnt = 0;\n try {\n Logger.debug('Executing scan : %j', scan);\n const start = new Date().getTime();\n Logger.debug('Pulling %j', scan);\n let qryResults = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n while (qryResults.LastEvaluatedKey && (softLimit === null || cnt < softLimit) && !scan.Limit) {\n Logger.silly('Found more rows - requery with key %j', qryResults.LastEvaluatedKey);\n scan['ExclusiveStartKey'] = qryResults.LastEvaluatedKey;\n qryResults = await this.throughputSafeScanOrQuery((o) => this.scanPromise(o), scan);\n for (let i = 0; i < qryResults.Items.length; i++) {\n await proc(qryResults.Items[i]);\n cnt++;\n }\n Logger.silly('Rval is now %d items', cnt);\n await PromiseRatchet.wait(delayMS);\n }\n const end = new Date().getTime();\n Logger.debug('Finished, processed %d results in %s for %j', cnt, DurationRatchet.formatMsDuration(end - start, true), scan);\n }\n catch (err) {\n Logger.error('Failed with %s, q: %j', err, scan, err);\n }\n return cnt;\n }\n async writeAllInBatches(tableName, elements, batchSize) {\n if (!batchSize || batchSize < 2) {\n throw new Error('Batch size needs to be at least 2, was ' + batchSize);\n }\n let rval = 0;\n if (!!elements && elements.length > 0) {\n let batchItems = [];\n elements.forEach((el) => {\n batchItems.push({\n PutRequest: {\n Item: el,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: tableName,\n },\n });\n });\n Logger.debug('Processing %d batch items to %s', batchItems.length, tableName);\n while (batchItems.length > 0) {\n const curBatch = batchItems.slice(0, Math.min(batchItems.length, batchSize));\n batchItems = batchItems.slice(curBatch.length);\n const params = {\n RequestItems: {},\n ReturnConsumedCapacity: 'TOTAL',\n ReturnItemCollectionMetrics: 'SIZE',\n };\n params.RequestItems[tableName] = curBatch;\n let tryCount = 1;\n let done = false;\n let batchResults = null;\n while (!done && tryCount < 7) {\n try {\n batchResults = await this.awsDDB.send(new BatchWriteCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n Logger.info('Caught ProvisionedThroughputExceededException - retrying delete');\n batchResults = { UnprocessedItems: params.RequestItems };\n }\n else {\n throw err;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n const backoff = Math.pow(2, tryCount);\n Logger.warn('Found %d unprocessed items. Backing off %d seconds and trying again', batchResults.UnprocessedItems[tableName].length, backoff);\n await PromiseRatchet.wait(backoff * 1000);\n tryCount++;\n params.RequestItems[tableName] = batchResults.UnprocessedItems[tableName];\n }\n else {\n done = true;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n Logger.error('After 6 tries there were still %d unprocessed items');\n rval += curBatch.length - batchResults.UnprocessedItems[tableName].length;\n Logger.warn('FIX Unprocessed : %j', batchResults.UnprocessedItems);\n }\n else {\n rval += curBatch.length;\n }\n }\n }\n return rval;\n }\n async fetchFullObjectsMatchingKeysOnlyIndexQuery(qry, keyNames, batchSize = 25) {\n RequireRatchet.notNullOrUndefined(qry);\n RequireRatchet.notNullOrUndefined(qry.TableName);\n RequireRatchet.notNullOrUndefined(keyNames);\n RequireRatchet.true(keyNames.length > 0);\n const keyDataSrc = await this.fullyExecuteQuery(qry);\n const keysOnly = DynamoRatchet.stripAllToKeysOnly(keyDataSrc, keyNames);\n const rval = await this.fetchAllInBatches(qry.TableName, keysOnly, batchSize);\n return rval;\n }\n async fetchAllInBatches(tableName, inKeys, batchSize) {\n if (!batchSize || batchSize < 2 || batchSize > 100) {\n throw new Error('Batch size needs to be at least 2 and no more than 100, was ' + batchSize);\n }\n let rval = [];\n const batches = [];\n let remain = Object.assign([], inKeys);\n while (remain.length > 0) {\n const curBatch = remain.slice(0, Math.min(remain.length, batchSize));\n remain = remain.slice(curBatch.length);\n const tableEntry = {};\n tableEntry[tableName] = {\n Keys: curBatch,\n };\n const nextBatch = {\n RequestItems: tableEntry,\n ReturnConsumedCapacity: 'TOTAL',\n };\n batches.push(nextBatch);\n }\n Logger.debug('Created %d batches', batches.length);\n for (let i = 0; i < batches.length; i++) {\n if (batches.length > 1) {\n Logger.info('Processing batch %d of %d', i + 1, batches.length);\n }\n const input = batches[i];\n let tryCount = 1;\n do {\n Logger.silly('Pulling %j', input);\n const res = await this.awsDDB.send(new BatchGetCommand(input));\n rval = rval.concat(res.Responses[tableName]);\n if (!!res.UnprocessedKeys && !!res.UnprocessedKeys[tableName] && res.UnprocessedKeys[tableName].Keys.length > 0 && tryCount < 15) {\n Logger.silly('Found %d unprocessed, waiting', res.UnprocessedKeys[tableName].Keys);\n await PromiseRatchet.wait(Math.pow(2, tryCount) * 1000);\n tryCount++;\n }\n input.RequestItems = res.UnprocessedKeys;\n } while (!input.RequestItems && input.RequestItems[tableName].Keys.length > 0);\n }\n return rval;\n }\n async deleteAllInBatches(tableName, keys, batchSize) {\n if (!batchSize || batchSize < 2) {\n throw new Error('Batch size needs to be at least 2, was ' + batchSize);\n }\n let rval = 0;\n if (!!keys && keys.length > 0) {\n let batchItems = [];\n keys.forEach((el) => {\n batchItems.push({\n DeleteRequest: {\n Key: el,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: tableName,\n },\n });\n });\n Logger.debug('Processing %d DeleteBatch items to %s', batchItems.length, tableName);\n while (batchItems.length > 0) {\n const curBatch = batchItems.slice(0, Math.min(batchItems.length, batchSize));\n batchItems = batchItems.slice(curBatch.length);\n const params = {\n RequestItems: {},\n ReturnConsumedCapacity: 'TOTAL',\n ReturnItemCollectionMetrics: 'SIZE',\n };\n params.RequestItems[tableName] = curBatch;\n let tryCount = 1;\n let done = false;\n let batchResults = null;\n while (!done && tryCount < 7) {\n try {\n batchResults = await this.awsDDB.send(new BatchWriteCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n Logger.info('Caught ProvisionedThroughputExceededException - retrying delete');\n batchResults = { UnprocessedItems: params.RequestItems };\n }\n else {\n throw err;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n const backoff = Math.pow(2, tryCount);\n Logger.warn('Found %d unprocessed items. Backing off %d seconds and trying again', batchResults.UnprocessedItems[tableName].length, backoff);\n await PromiseRatchet.wait(backoff * 1000);\n tryCount++;\n params.RequestItems[tableName] = batchResults.UnprocessedItems[tableName];\n }\n else {\n done = true;\n }\n }\n if (!!batchResults &&\n !!batchResults.UnprocessedItems &&\n !!batchResults.UnprocessedItems[tableName] &&\n batchResults.UnprocessedItems[tableName].length > 0) {\n Logger.error('After 6 tries there were still %d unprocessed items');\n rval += curBatch.length - batchResults.UnprocessedItems[tableName].length;\n Logger.warn('FIX Unprocessed : %j', batchResults.UnprocessedItems);\n }\n else {\n rval += curBatch.length;\n }\n Logger.debug('%d Remain, DeleteBatch Results : %j', batchItems.length, batchResults);\n }\n }\n return rval;\n }\n async simplePut(tableName, value, autoRetryCount = 3) {\n let rval = null;\n let currentTry = 0;\n const params = {\n Item: value,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: tableName,\n };\n while (!rval && currentTry < autoRetryCount) {\n try {\n rval = await this.awsDDB.send(new PutCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded write throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else {\n throw err;\n }\n }\n }\n if (!rval) {\n Logger.warn('Unable to write %j to DDB after %d tries, giving up', params, autoRetryCount);\n }\n return rval;\n }\n async simplePutOnlyIfFieldIsNullOrUndefined(tableName, value, fieldName) {\n let rval = false;\n const params = {\n Item: value,\n ReturnConsumedCapacity: 'TOTAL',\n ConditionExpression: 'attribute_not_exists(#fieldName) OR #fieldName = :null ',\n ExpressionAttributeNames: {\n '#fieldName': fieldName,\n },\n ExpressionAttributeValues: {\n ':null': null,\n },\n TableName: tableName,\n };\n try {\n const wrote = await this.awsDDB.send(new PutCommand(params));\n Logger.silly('Wrote : %j', wrote);\n rval = true;\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n Logger.debug('Exceeded write throughput for %j : (Waiting 2000 ms)', params);\n await PromiseRatchet.wait(2000);\n rval = await this.simplePutOnlyIfFieldIsNullOrUndefined(tableName, value, fieldName);\n }\n else if (err && err['code'] && err['code'] === 'ConditionalCheckFailedException') {\n Logger.debug('Failed to write %j due to null field failure');\n rval = false;\n }\n else {\n throw err;\n }\n }\n return rval;\n }\n async simplePutWithCollisionAvoidance(tableName, value, keyNames, adjustFunction, maxAdjusts = null, autoRetryCount = 3) {\n RequireRatchet.true(keyNames && keyNames.length > 0 && keyNames.length < 3, 'You must pass 1 or 2 key names');\n let pio = null;\n let currentTry = 0;\n const attrNames = {\n '#key0': keyNames[0],\n };\n const attrValues = {\n ':key0': value[keyNames[0]],\n };\n let condExp = '#key0 <> :key0';\n if (keyNames.length > 1) {\n condExp += ' AND #key1 <> :key1';\n attrNames['#key1'] = keyNames[1];\n attrValues[':key1'] = value[keyNames[1]];\n }\n const params = {\n Item: value,\n ReturnConsumedCapacity: 'TOTAL',\n ConditionExpression: condExp,\n ExpressionAttributeNames: attrNames,\n ExpressionAttributeValues: attrValues,\n TableName: tableName,\n };\n let adjustCount = 0;\n while (!pio && currentTry < autoRetryCount && (!maxAdjusts || adjustCount < maxAdjusts)) {\n try {\n pio = await this.awsDDB.send(new PutCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n currentTry++;\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded write throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n }\n else if (err && err['code'] && err['code'] === 'ConditionalCheckFailedException') {\n let newValue = Object.assign({}, params.Item);\n Logger.info('Failed to write %j due to collision - adjusting and retrying', newValue);\n newValue = adjustFunction(newValue);\n params.Item = newValue;\n params.ExpressionAttributeValues[':key0'] = newValue[keyNames[0]];\n if (keyNames.length > 1) {\n params.ExpressionAttributeValues[':key1'] = newValue[keyNames[1]];\n }\n adjustCount++;\n }\n else {\n throw err;\n }\n }\n }\n if (pio && adjustCount > 0) {\n Logger.info('After adjustment, wrote %j as %j', value, params.Item);\n }\n if (!pio) {\n Logger.warn('Unable to write %j to DDB after %d provision tries and %d adjusts, giving up', params, currentTry, adjustCount);\n }\n return pio ? params.Item : null;\n }\n async simpleGet(tableName, keys, autoRetryCount = 3) {\n let holder = null;\n let currentTry = 0;\n const params = {\n TableName: tableName,\n Key: keys,\n };\n while (!holder && currentTry < autoRetryCount) {\n try {\n holder = await this.awsDDB.send(new GetCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded read throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else {\n throw err;\n }\n }\n }\n if (!holder) {\n Logger.warn('Unable to read %j from DDB after %d tries, giving up', params, autoRetryCount);\n }\n const rval = !!holder && !!holder.Item ? Object.assign({}, holder.Item) : null;\n return rval;\n }\n static objectIsErrorWithProvisionedThroughputExceededExceptionCode(err) {\n return !!err && !!err['code'] && err['code'] === 'ProvisionedThroughputExceededException';\n }\n async simpleGetWithCounterDecrement(tableName, keys, counterAttributeName, deleteOnZero, autoRetryCount = 3) {\n let holder = null;\n let currentTry = 0;\n const params = {\n TableName: tableName,\n Key: keys,\n UpdateExpression: 'set #counter = #counter-:decVal',\n ExpressionAttributeNames: {\n '#counter': counterAttributeName,\n },\n ExpressionAttributeValues: {\n ':decVal': 1,\n ':minVal': 0,\n },\n ConditionExpression: '#counter > :minVal',\n ReturnValues: 'ALL_NEW',\n };\n let updateFailed = false;\n while (!holder && currentTry < autoRetryCount && !updateFailed) {\n try {\n holder = await this.awsDDB.send(new UpdateItemCommand(params));\n }\n catch (err) {\n if (DynamoRatchet.objectIsErrorWithProvisionedThroughputExceededExceptionCode(err)) {\n const wait = Math.pow(2, currentTry) * 1000;\n Logger.debug('Exceeded update throughput for %j : Try %d of %d (Waiting %d ms)', params, currentTry, autoRetryCount, wait);\n await PromiseRatchet.wait(wait);\n currentTry++;\n }\n else if (!!err && !!err['code'] && err['code'] === 'ConditionalCheckFailedException') {\n Logger.info('Cannot fetch requested row (%j) - the update check failed', keys);\n updateFailed = true;\n }\n else {\n throw err;\n }\n }\n }\n if (!holder && !updateFailed) {\n Logger.warn('Unable to update %j from DDB after %d tries, giving up', params, autoRetryCount);\n }\n const rval = !!holder && !!holder.Attributes ? Object.assign({}, holder.Attributes) : null;\n if (deleteOnZero && rval && rval[counterAttributeName] === 0) {\n Logger.info('Delete on 0 specified, removing');\n await this.simpleDelete(tableName, keys);\n }\n return rval;\n }\n async simpleDelete(tableName, keys) {\n const params = {\n TableName: tableName,\n Key: keys,\n };\n const holder = await this.awsDDB.send(new DeleteCommand(params));\n return holder;\n }\n async atomicCounter(tableName, keys, counterFieldName, increment = 1) {\n const update = {\n TableName: tableName,\n Key: keys,\n UpdateExpression: 'SET #counterFieldName = #counterFieldName + :inc',\n ExpressionAttributeNames: {\n '#counterFieldName': counterFieldName,\n },\n ExpressionAttributeValues: {\n ':inc': increment,\n },\n ReturnValues: 'UPDATED_NEW',\n };\n const ui = await this.awsDDB.send(new UpdateItemCommand(update));\n const rval = NumberRatchet.safeNumber(ui.Attributes[counterFieldName]);\n return rval;\n }\n static cleanObject(ob) {\n if (!!ob) {\n const rem = [];\n Object.keys(ob).forEach((k) => {\n const v = ob[k];\n if (v === '') {\n rem.push(k);\n }\n else if (v instanceof Object) {\n DynamoRatchet.cleanObject(v);\n }\n });\n Logger.silly('Removing keys : %j', rem);\n rem.forEach((k) => {\n delete ob[k];\n });\n }\n }\n static stripToKeysOnly(input, keysNames) {\n let rval = null;\n if (!!input && !!keysNames && keysNames.length > 0) {\n rval = {};\n keysNames.forEach((k) => {\n if (!input[k]) {\n ErrorRatchet.throwFormattedErr('Failed key extraction on %j - missing %s', input, k);\n }\n rval[k] = input[k];\n });\n }\n return rval;\n }\n static stripAllToKeysOnly(input, keys) {\n const rval = input.map((i) => DynamoRatchet.stripToKeysOnly(i, keys));\n return rval;\n }\n}\n//# sourceMappingURL=dynamo-ratchet.js.map","import { CreateTableCommand, DeleteTableCommand, DescribeTableCommand, ListTablesCommand, ResourceNotFoundException, } from '@aws-sdk/client-dynamodb';\nimport { ErrorRatchet, Logger, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nexport class DynamoTableRatchet {\n awsDDB;\n constructor(awsDDB) {\n this.awsDDB = awsDDB;\n if (!awsDDB) {\n throw 'awsDDB may not be null';\n }\n }\n async deleteTable(tableName, waitForDelete = true) {\n RequireRatchet.notNullOrUndefined(tableName);\n const input = {\n TableName: tableName,\n };\n Logger.debug('Deleting ddb table %s', tableName);\n const rval = await this.awsDDB.send(new DeleteTableCommand(input));\n if (waitForDelete) {\n Logger.debug('Table marked for delete, waiting for deletion');\n await this.waitForTableDelete(tableName);\n }\n return rval;\n }\n async createTable(input, waitForReady = true, replaceIfExists = false) {\n RequireRatchet.notNullOrUndefined(input);\n RequireRatchet.notNullOrUndefined(input.TableName);\n Logger.debug('Creating new table : %j', input);\n const exists = await this.tableExists(input.TableName);\n if (exists) {\n if (replaceIfExists) {\n Logger.debug('Table %s exists and replace specified - deleting', input.TableName);\n await this.deleteTable(input.TableName);\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot create table %s - exists already and replace not specified', input.TableName);\n }\n }\n const rval = await this.awsDDB.send(new CreateTableCommand(input));\n if (waitForReady) {\n Logger.debug('Table created, awaiting ready');\n await this.waitForTableReady(input.TableName);\n }\n return rval;\n }\n async waitForTableReady(tableName) {\n let rval = true;\n let out = await this.safeDescribeTable(tableName);\n while (!!out && !!out.Table && out.Table.TableStatus !== 'ACTIVE') {\n Logger.silly('Table not ready - waiting 2 seconds');\n await PromiseRatchet.wait(2000);\n out = await this.safeDescribeTable(tableName);\n }\n if (!out && !out.Table) {\n Logger.warn('Cannot wait for %s to be ready - table does not exist', tableName);\n rval = false;\n }\n return rval;\n }\n async waitForTableDelete(tableName) {\n let out = await this.safeDescribeTable(tableName);\n while (!!out) {\n Logger.silly('Table %s still exists, waiting 2 seconds (State is %s)', tableName, out.Table.TableStatus);\n await PromiseRatchet.wait(2000);\n out = await this.safeDescribeTable(tableName);\n }\n }\n async tableExists(tableName) {\n const desc = await this.safeDescribeTable(tableName);\n return !!desc;\n }\n async listAllTables() {\n const input = {};\n let rval = [];\n do {\n const out = await this.awsDDB.send(new ListTablesCommand(input));\n rval = rval.concat(out.TableNames);\n input.ExclusiveStartTableName = out.LastEvaluatedTableName;\n } while (input.ExclusiveStartTableName);\n return rval;\n }\n async safeDescribeTable(tableName) {\n try {\n const out = await this.awsDDB.send(new DescribeTableCommand({ TableName: tableName }));\n return out;\n }\n catch (err) {\n if (err instanceof ResourceNotFoundException) {\n return null;\n }\n else {\n throw err;\n }\n }\n }\n async copyTable(srcTableName, dstTableName, overrides, copyData) {\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(srcTableName, 'srcTableName');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(dstTableName, 'dstTableName');\n if (copyData) {\n throw ErrorRatchet.fErr('Cannot copy %s to %s - copy data not supported yet', srcTableName, dstTableName);\n }\n const srcTableDef = await this.safeDescribeTable(srcTableName);\n if (await this.tableExists(dstTableName)) {\n throw ErrorRatchet.fErr('Cannot copy to %s - table already exists', dstTableName);\n }\n if (!srcTableDef) {\n throw ErrorRatchet.fErr('Cannot copy %s - doesnt exist', srcTableName);\n }\n const ads = srcTableDef.Table.AttributeDefinitions;\n const ks = srcTableDef.Table.KeySchema;\n const gi = srcTableDef.Table.GlobalSecondaryIndexes;\n const createInput = Object.assign({}, overrides || {}, {\n AttributeDefinitions: srcTableDef.Table.AttributeDefinitions,\n TableName: dstTableName,\n KeySchema: srcTableDef.Table.KeySchema,\n LocalSecondaryIndexes: srcTableDef.Table.LocalSecondaryIndexes,\n GlobalSecondaryIndexes: srcTableDef.Table.GlobalSecondaryIndexes.map((gi) => {\n const output = gi;\n if (output.ProvisionedThroughput?.WriteCapacityUnits === 0 || output.ProvisionedThroughput?.ReadCapacityUnits === 0) {\n output.ProvisionedThroughput = undefined;\n }\n return output;\n }),\n BillingMode: srcTableDef.Table.BillingModeSummary.BillingMode,\n ProvisionedThroughput: srcTableDef.Table.BillingModeSummary.BillingMode === 'PROVISIONED'\n ? srcTableDef.Table.ProvisionedThroughput\n : undefined,\n StreamSpecification: srcTableDef.Table.StreamSpecification,\n SSESpecification: srcTableDef.Table.SSEDescription,\n Tags: undefined,\n TableClass: srcTableDef.Table.TableClassSummary?.TableClass,\n DeletionProtectionEnabled: srcTableDef.Table.DeletionProtectionEnabled,\n });\n const rval = await this.awsDDB.send(new CreateTableCommand(createInput));\n return rval;\n }\n}\n//# sourceMappingURL=dynamo-table-ratchet.js.map","import { ErrorRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class HashSpreader {\n spots;\n buckets;\n separator;\n alphabet;\n _allSlots;\n constructor(spots = 3, buckets = 16, separator = '_', alphabet = '0123456789ABCDEF') {\n this.spots = spots;\n this.buckets = buckets;\n this.separator = separator;\n this.alphabet = alphabet;\n RequireRatchet.true(spots > 0, 'Spots must be larger than 0');\n RequireRatchet.true(buckets > 1, 'Buckets must be larger than 1');\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(alphabet), 'Alphabet may not be null or empty');\n RequireRatchet.true(StringRatchet.allUnique(alphabet), 'Alphabet must be unique');\n RequireRatchet.true(StringRatchet.stringContainsOnlyAlphanumeric(alphabet), 'Alphabet must be alphanumeric');\n const permutations = Math.pow(alphabet.length, spots);\n RequireRatchet.true(buckets < permutations, 'Buckets must be less than permutations (' + buckets + ' / ' + permutations + ')');\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(this.separator), 'Separator must be nonnull and nonempty');\n const allPerms = StringRatchet.allPermutationsOfLength(spots, alphabet);\n this._allSlots = allPerms.slice(0, buckets);\n }\n get allBuckets() {\n return Object.assign([], this._allSlots);\n }\n get randomBucket() {\n return this._allSlots[Math.floor(Math.random() * this.buckets)];\n }\n allSpreadValues(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot spread null/empty value');\n const rval = this._allSlots.map((s) => input + this.separator + s);\n return rval;\n }\n allSpreadValuesForArray(inputs) {\n RequireRatchet.true(inputs && inputs.length > 0, 'Cannot spread null/empty array');\n let rval = [];\n inputs.forEach((i) => {\n rval = rval.concat(this.allSpreadValues(i));\n });\n return rval;\n }\n addSpreader(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot spread null/empty value');\n return input + this.separator + this.randomBucket;\n }\n extractBucket(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot extract from null or empty value');\n const loc = input.length - this.spots;\n if (loc < 0 || input.charAt(loc) !== this.separator) {\n ErrorRatchet.throwFormattedErr('Cannot extract bucket, not created by this spreader (missing %s at location %d)', this.separator, loc);\n }\n return input.substring(loc);\n }\n removeBucket(input) {\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(input), 'Cannot extract from null or empty value');\n const loc = input.length - this.spots;\n if (loc < 0 || input.charAt(loc) !== this.separator) {\n ErrorRatchet.throwFormattedErr('Cannot remove bucket, not created by this spreader (missing %s at location %d)', this.separator, loc);\n }\n return input.substring(0, loc);\n }\n}\n//# sourceMappingURL=hash-spreader.js.map","import { DescribeInstancesCommand, EC2Client, StartInstancesCommand, StopInstancesCommand, } from '@aws-sdk/client-ec2';\nimport { EC2InstanceConnectClient, SendSSHPublicKeyCommand, } from '@aws-sdk/client-ec2-instance-connect';\nimport { DurationRatchet, Logger, PromiseRatchet } from '@bitblit/ratchet-common';\nexport class Ec2Ratchet {\n region;\n availabilityZone;\n ec2;\n ec2InstanceConnect;\n constructor(region = 'us-east-1', availabilityZone = 'us-east-1a') {\n this.region = region;\n this.availabilityZone = availabilityZone;\n this.ec2 = new EC2Client({ region: region });\n this.ec2InstanceConnect = new EC2InstanceConnectClient({ region: region });\n }\n get eC2Client() {\n return this.ec2;\n }\n get eC2InstanceConnectClient() {\n return this.ec2InstanceConnect;\n }\n async stopInstance(instanceId, maxWaitForShutdownMS = 0) {\n let rval = true;\n try {\n const stopParams = {\n InstanceIds: [instanceId],\n DryRun: false,\n };\n Logger.info('About to stop instances : %j', stopParams);\n await this.ec2.send(new StopInstancesCommand(stopParams));\n Logger.info('Stop instance command sent, waiting on shutdown');\n let status = await this.describeInstance(instanceId);\n if (maxWaitForShutdownMS > 0) {\n const start = new Date().getTime();\n while (!!status && status.State.Code !== 16 && new Date().getTime() - start < maxWaitForShutdownMS) {\n Logger.debug('Instance status is %j - waiting for 5 seconds (up to %s)', status.State, DurationRatchet.formatMsDuration(maxWaitForShutdownMS));\n await PromiseRatchet.wait(5000);\n status = await this.describeInstance(instanceId);\n }\n }\n }\n catch (err) {\n Logger.error('Failed to stop instance %s : %s', instanceId, err, err);\n rval = false;\n }\n return rval;\n }\n async launchInstance(instanceId, maxWaitForStartupMS = 0) {\n let rval = true;\n try {\n const startParams = {\n InstanceIds: [instanceId],\n DryRun: false,\n };\n Logger.info('About to start instance : %j', startParams);\n await this.ec2.send(new StartInstancesCommand(startParams));\n Logger.info('Start instance command sent, waiting on startup');\n let status = await this.describeInstance(instanceId);\n if (maxWaitForStartupMS > 0) {\n const start = new Date().getTime();\n while (!!status && status.State.Code !== 16 && new Date().getTime() - start < maxWaitForStartupMS) {\n Logger.debug('Instance status is %j - waiting for 5 seconds (up to %s)', status.State, DurationRatchet.formatMsDuration(maxWaitForStartupMS));\n await PromiseRatchet.wait(5000);\n status = await this.describeInstance(instanceId);\n }\n }\n if (!!status && !!status.PublicIpAddress) {\n Logger.info('Instance address is %s', status.PublicIpAddress);\n Logger.info('SSH command : ssh -i path_to_pem_file ec2-user@%s', status.PublicIpAddress);\n }\n }\n catch (err) {\n Logger.error('Failed to start instance %s : %s', instanceId, err, err);\n rval = false;\n }\n return rval;\n }\n async describeInstance(instanceId) {\n const res = await this.listAllInstances([instanceId]);\n return res.length === 1 ? res[0] : null;\n }\n async listAllInstances(instanceIds = []) {\n let rval = [];\n const req = {\n NextToken: null,\n };\n if (instanceIds && instanceIds.length > 0) {\n req.InstanceIds = instanceIds;\n }\n do {\n Logger.debug('Pulling instances... (%j)', req);\n const res = await this.ec2.send(new DescribeInstancesCommand(req));\n res.Reservations.forEach((r) => {\n rval = rval.concat(r.Instances);\n });\n req.NextToken = res.NextToken;\n } while (req.NextToken);\n Logger.debug('Finished pulling instances (found %d)', rval.length);\n return rval;\n }\n async sendPublicKeyToEc2Instance(instanceId, publicKeyString, instanceOsUser) {\n const userName = instanceOsUser || 'ec2-user';\n const req = {\n InstanceId: instanceId,\n AvailabilityZone: this.availabilityZone,\n InstanceOSUser: userName,\n SSHPublicKey: publicKeyString,\n };\n const rval = await this.ec2InstanceConnect.send(new SendSSHPublicKeyCommand(req));\n return rval;\n }\n}\n//# sourceMappingURL=ec2-ratchet.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class CascadeEnvironmentServiceProvider {\n providers;\n constructor(providers) {\n this.providers = providers;\n RequireRatchet.notNullOrUndefined(providers);\n RequireRatchet.true(providers.length > 0);\n }\n async fetchConfig(name) {\n Logger.silly('CascadeEnvironmentServiceProvider fetch for %s', name);\n let rval = null;\n for (let i = 0; i < this.providers.length && !rval; i++) {\n try {\n rval = await this.providers[i].fetchConfig(name);\n }\n catch (err) {\n Logger.error('Provider %d failed - trying next : %s', i, err, err);\n rval = null;\n }\n }\n return rval;\n }\n}\n//# sourceMappingURL=cascade-environment-service-provider.js.map","import { ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class EnvVarEnvironmentServiceProvider {\n envVarName;\n constructor(envVarName) {\n this.envVarName = envVarName;\n RequireRatchet.notNullOrUndefined(envVarName);\n }\n async fetchConfig() {\n Logger.silly('EnvVarEnvironmentServiceProvider fetch for %s', this.envVarName);\n let rval = null;\n const src = process ? process.env : global ? global : {};\n const toParse = StringRatchet.trimToNull(src[this.envVarName]);\n if (toParse) {\n try {\n rval = JSON.parse(toParse);\n }\n catch (err) {\n Logger.error('Failed to read env - null or invalid JSON : %s : %s', err, toParse, err);\n throw err;\n }\n }\n else {\n ErrorRatchet.throwFormattedErr('Could not find env var with name : %s', this.envVarName);\n }\n return rval;\n }\n}\n//# sourceMappingURL=env-var-environment-service-provider.js.map","import { ErrorRatchet, Logger, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nexport class EnvironmentService {\n provider;\n cfg;\n readPromiseCache = new Map();\n static defaultEnvironmentServiceConfig() {\n const rval = {\n maxRetries: 3,\n backoffMultiplierMS: 500,\n };\n return rval;\n }\n constructor(provider, cfg = EnvironmentService.defaultEnvironmentServiceConfig()) {\n this.provider = provider;\n this.cfg = cfg;\n RequireRatchet.notNullOrUndefined(provider);\n RequireRatchet.notNullOrUndefined(cfg);\n }\n async getConfig(name) {\n Logger.silly('EnvService:Request to read config %s', name);\n if (!this.readPromiseCache.has(name)) {\n Logger.silly('EnvService: Nothing in cache - adding');\n this.readPromiseCache.set(name, this.getConfigUncached(name));\n }\n return this.readPromiseCache.get(name);\n }\n async getConfigUncached(name) {\n let tryCount = 1;\n let rval = null;\n while (!rval && tryCount < this.cfg.maxRetries) {\n tryCount++;\n Logger.silly('Attempting fetch of %s', name);\n try {\n rval = await this.provider.fetchConfig(name);\n }\n catch (err) {\n const waitMS = tryCount * this.cfg.backoffMultiplierMS;\n Logger.info('Error attempting to fetch config %s (try %d of %d, waiting %s MS): %s', name, tryCount, this.cfg.maxRetries, waitMS, err, err);\n await PromiseRatchet.wait(waitMS);\n }\n }\n if (!rval) {\n ErrorRatchet.throwFormattedErr('Was unable to fetch config %s even after %d retries', name, this.cfg.maxRetries);\n }\n return rval;\n }\n}\n//# sourceMappingURL=environment-service.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class FixedEnvironmentServiceProvider {\n value;\n constructor(value) {\n this.value = value;\n RequireRatchet.notNullOrUndefined(value);\n }\n static fromRecord(record) {\n const m = new Map();\n Object.keys(record).forEach((k) => {\n m.set(k, record[k]);\n });\n return new FixedEnvironmentServiceProvider(m);\n }\n async fetchConfig(name) {\n Logger.silly('FixedEnvironmentServiceProvider fetch for %s', name);\n const rval = this.value.get(name);\n return rval;\n }\n}\n//# sourceMappingURL=fixed-environment-service-provider.js.map","import { S3CacheRatchet } from '../s3/s3-cache-ratchet.js';\nimport { Logger, RequireRatchet, StopWatch, StringRatchet } from '@bitblit/ratchet-common';\nimport { S3Client } from '@aws-sdk/client-s3';\nexport class S3EnvironmentServiceProvider {\n cfg;\n ratchet;\n constructor(cfg) {\n this.cfg = cfg;\n RequireRatchet.notNullOrUndefined(cfg);\n RequireRatchet.notNullOrUndefined(cfg.bucketName);\n RequireRatchet.notNullOrUndefined(cfg.region);\n RequireRatchet.true(!!cfg.s3Override || !!cfg.region, 'You must set either region or S3Override');\n const s3 = cfg.s3Override || new S3Client({ region: cfg.region });\n this.ratchet = new S3CacheRatchet(s3, cfg.bucketName);\n }\n async fetchConfig(name) {\n const readPath = StringRatchet.trimToEmpty(this.cfg.pathPrefix) + name + StringRatchet.trimToEmpty(this.cfg.pathSuffix);\n Logger.silly('S3EnvironmentServiceProvider:Request to read config from : %s / %s', this.cfg.bucketName, readPath);\n const sw = new StopWatch();\n const rval = await this.ratchet.fetchCacheFileAsObject(readPath);\n sw.log();\n return rval;\n }\n}\n//# sourceMappingURL=s3-environment-service-provider.js.map","import { ErrorRatchet, Logger, PromiseRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { GetParameterCommand, SSMClient } from '@aws-sdk/client-ssm';\nexport class SsmEnvironmentServiceProvider {\n region;\n ssmEncrypted;\n ssm;\n constructor(region = 'us-east-1', ssmEncrypted = true) {\n this.region = region;\n this.ssmEncrypted = ssmEncrypted;\n RequireRatchet.notNullOrUndefined(region);\n RequireRatchet.notNullOrUndefined(ssmEncrypted);\n this.ssm = new SSMClient({ region: this.region });\n }\n async fetchConfig(name) {\n Logger.silly('SsmEnvironmentServiceProvider fetch for %s', name);\n const params = {\n Name: name,\n WithDecryption: this.ssmEncrypted,\n };\n let rval = null;\n let toParse = null;\n try {\n const value = await this.ssm.send(new GetParameterCommand(params));\n toParse = StringRatchet.trimToNull(value?.Parameter?.Value);\n }\n catch (err) {\n const errCode = err['code'] || '';\n if (errCode.toLowerCase().indexOf('throttlingexception') !== -1) {\n Logger.warn('Throttled while trying to read parameters - waiting 1 second before allowing retry');\n await PromiseRatchet.wait(1_000);\n }\n else if (errCode.toLowerCase().indexOf('parameternotfound') !== -1) {\n const errMsg = Logger.warn('AWS could not find parameter %s - are you using the right AWS key?', name);\n throw new Error(errMsg);\n }\n else {\n Logger.error('Final environment fetch error (cannot retry) : %s', err, err);\n throw err;\n }\n }\n if (toParse) {\n try {\n rval = JSON.parse(toParse);\n }\n catch (err) {\n Logger.error('Failed to read env - null or invalid JSON : %s : %s', err, toParse, err);\n throw err;\n }\n }\n else {\n ErrorRatchet.throwFormattedErr('Could not find system parameter with name : %s in this account', name);\n }\n return rval;\n }\n}\n//# sourceMappingURL=ssm-environment-service-provider.js.map","export class DynamoExpiringCodeProvider {\n tableName;\n dynamoRatchet;\n constructor(tableName, dynamoRatchet) {\n this.tableName = tableName;\n this.dynamoRatchet = dynamoRatchet;\n }\n async checkCode(code, context, deleteOnMatch) {\n const keys = { code: code, context: context };\n const expCode = await this.dynamoRatchet.simpleGet(this.tableName, keys);\n const rval = expCode && expCode.expiresEpochMS > Date.now();\n if (rval && deleteOnMatch) {\n await this.dynamoRatchet.simpleDelete(this.tableName, keys);\n }\n return rval;\n }\n async storeCode(code) {\n const output = await this.dynamoRatchet.simplePut(this.tableName, code);\n return output && output.ConsumedCapacity.CapacityUnits > 0;\n }\n async createTableIfMissing(dtr) {\n return null;\n }\n}\n//# sourceMappingURL=dynamo-expiring-code-provider.js.map","import { RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class ExpiringCodeRatchet {\n provider;\n constructor(provider) {\n this.provider = provider;\n }\n static generateCode(params) {\n RequireRatchet.notNullOrUndefined(params, 'params');\n RequireRatchet.notNullOrUndefined(params.context, 'params.context');\n RequireRatchet.notNullOrUndefined(params.length, 'params.length');\n RequireRatchet.notNullOrUndefined(params.alphabet, 'params.alphabet');\n let code = '';\n for (let i = 0; i < params.length; i++) {\n code += params.alphabet.charAt(Math.floor(params.alphabet.length * Math.random()));\n }\n const rval = {\n code: code,\n context: params.context,\n tags: params.tags,\n expiresEpochMS: Date.now() + params.timeToLiveSeconds * 1000,\n };\n return rval;\n }\n async createNewCode(params) {\n const value = ExpiringCodeRatchet.generateCode(params);\n const rval = await this.provider.storeCode(value);\n return rval ? value : null;\n }\n async checkCode(code, context, deleteOnMatch) {\n const rval = await this.provider.checkCode(StringRatchet.trimToEmpty(code), StringRatchet.trimToEmpty(context), deleteOnMatch);\n return rval;\n }\n}\n//# sourceMappingURL=expiring-code-ratchet.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class S3ExpiringCodeProvider {\n s3CacheRatchet;\n keyName;\n constructor(s3CacheRatchet, keyName) {\n this.s3CacheRatchet = s3CacheRatchet;\n this.keyName = keyName;\n RequireRatchet.notNullOrUndefined(s3CacheRatchet, 's3CacheRatchet');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');\n RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(keyName, 'keyName');\n }\n async fetchFile() {\n const rval = (await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyName)) || {\n data: [],\n lastModifiedEpochMS: Date.now(),\n };\n return rval;\n }\n async updateFile(vals) {\n const next = {\n data: vals || [],\n lastModifiedEpochMS: Date.now(),\n };\n next.data = next.data.filter((d) => d.expiresEpochMS > Date.now());\n Logger.info('Updating code file to %s codes', next.data.length);\n const rval = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyName, next);\n return rval;\n }\n async checkCode(code, context, deleteOnMatch) {\n const val = await this.fetchFile();\n const rval = val.data.find((d) => d?.code?.toUpperCase() === code?.toUpperCase() && d?.context?.toUpperCase() === context?.toUpperCase());\n if (rval) {\n if (deleteOnMatch || rval.expiresEpochMS < Date.now()) {\n Logger.info('Stripping used/expired code from the database');\n const newData = val.data.filter((d) => d != rval);\n await this.updateFile(newData);\n }\n }\n return !!rval && rval.expiresEpochMS > Date.now();\n }\n async storeCode(code) {\n const old = await this.fetchFile();\n old.data.push(code);\n const wrote = await this.updateFile(old.data);\n return !!wrote;\n }\n}\n//# sourceMappingURL=s3-expiring-code-provider.js.map","import { ErrorRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class AwsCredentialsRatchet {\n constructor() { }\n static applySetProfileEnvironmentalVariable(newProfile) {\n if (!!process.env) {\n if (StringRatchet.trimToNull(newProfile)) {\n process.env['AWS_PROFILE'] = newProfile;\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot set profile to null/empty string');\n }\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot set profile - not in a node environment - process missing');\n }\n }\n}\n//# sourceMappingURL=aws-credentials-ratchet.js.map","export class LambdaEventDetector {\n static isValidCronEvent(event) {\n return event && event.source == 'aws.events' && event.resources && event.resources.length > 0;\n }\n static isValidSnsEvent(event) {\n return event && event.Records && event.Records.length > 0 && event.Records[0].EventSource == 'aws:sns';\n }\n static isValidDynamoDBEvent(event) {\n return event && event.Records && event.Records.length > 0 && event.Records[0].eventSource == 'aws:dynamodb';\n }\n static isValidS3Event(event) {\n return event && event.Records && event.Records.length > 0 && event.Records[0].eventSource == 'aws:s3';\n }\n static isValidApiGatewayV2WithRequestContextEvent(event) {\n return event && event.rawPath && event.requestContext && event.routeKey;\n }\n static isValidApiGatewayEvent(event) {\n return event && event.httpMethod && event.path && event.requestContext;\n }\n static isValidApiGatewayAuthorizerEvent(event) {\n return event && event.authorizationToken && event.methodArn;\n }\n static isSingleCronEvent(event) {\n return this.isValidCronEvent(event) && LambdaEventDetector.isSingleEntryEvent(event, 'resources');\n }\n static isSingleSnsEvent(event) {\n return this.isValidSnsEvent(event) && LambdaEventDetector.isSingleEntryEvent(event);\n }\n static isSingleDynamoDBEvent(event) {\n return this.isValidDynamoDBEvent(event) && LambdaEventDetector.isSingleEntryEvent(event);\n }\n static isSingleS3Event(event) {\n return this.isValidS3Event(event) && LambdaEventDetector.isSingleEntryEvent(event);\n }\n static isSingleEntryEvent(event, entryName = 'Records') {\n return event && event[entryName] && event[entryName] instanceof Array && event[entryName].length === 1;\n }\n}\n//# sourceMappingURL=lambda-event-detector.js.map","import { LambdaEventDetector } from './lambda-event-detector.js';\nexport class LambdaEventTypeGuards {\n static isValidCronEvent(event) {\n return LambdaEventDetector.isValidCronEvent(event);\n }\n static isValidSnsEvent(event) {\n return LambdaEventDetector.isValidSnsEvent(event);\n }\n static isValidDynamoDBEvent(event) {\n return LambdaEventDetector.isValidDynamoDBEvent(event);\n }\n static isValidS3Event(event) {\n return LambdaEventDetector.isValidS3Event(event);\n }\n static isValidApiGatewayV2WithRequestContextEvent(event) {\n return LambdaEventDetector.isValidApiGatewayV2WithRequestContextEvent(event);\n }\n static isValidApiGatewayEvent(event) {\n return LambdaEventDetector.isValidApiGatewayEvent(event);\n }\n static isValidApiGatewayAuthorizerEvent(event) {\n return LambdaEventDetector.isValidApiGatewayAuthorizerEvent(event);\n }\n}\n//# sourceMappingURL=lambda-event-type-guards.js.map","import { Logger } from '@bitblit/ratchet-common';\nimport { ChangeResourceRecordSetsCommand, waitUntilResourceRecordSetsChanged, } from '@aws-sdk/client-route-53';\nimport { WaiterState } from '@smithy/util-waiter';\nexport class Route53Ratchet {\n route53;\n hostedZoneId;\n constructor(route53, hostedZoneId) {\n this.route53 = route53;\n this.hostedZoneId = hostedZoneId;\n if (!this.route53) {\n throw 'route53 may not be null';\n }\n }\n get route53Client() {\n return this.route53;\n }\n async changeCnameRecordTarget(domainName, target, hostedZoneId = this.hostedZoneId, ttlSeconds = 600) {\n Logger.info('Updating %s to point to %s', domainName, target);\n try {\n const params = {\n ChangeBatch: {\n Changes: [\n {\n Action: 'UPSERT',\n ResourceRecordSet: {\n Name: domainName,\n ResourceRecords: [\n {\n Value: target,\n },\n ],\n TTL: ttlSeconds,\n Type: 'CNAME',\n },\n },\n ],\n },\n HostedZoneId: hostedZoneId,\n };\n const result = await this.route53.send(new ChangeResourceRecordSetsCommand(params));\n Logger.debug('Updated domain result: %j', result);\n const waitParams = {\n Id: result.ChangeInfo.Id,\n };\n const waitResult = await waitUntilResourceRecordSetsChanged({ client: this.route53, maxWaitTime: 300 }, waitParams);\n Logger.debug('Wait responsed: %j', waitResult);\n if (waitResult.state === WaiterState.SUCCESS) {\n Logger.info('Updated %s to point to %s', domainName, hostedZoneId);\n return true;\n }\n }\n catch (err) {\n Logger.warn('Error update CName for %s with value %s: %j', domainName, target, err);\n }\n Logger.info('Cannot update %s to point to %s', domainName, target);\n return false;\n }\n}\n//# sourceMappingURL=route-53-ratchet.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class DynamoRuntimeParameterProvider {\n dynamo;\n tableName;\n constructor(dynamo, tableName) {\n this.dynamo = dynamo;\n this.tableName = tableName;\n RequireRatchet.notNullOrUndefined(this.dynamo);\n RequireRatchet.notNullOrUndefined(this.tableName);\n }\n async readParameter(groupId, paramKey) {\n Logger.silly('Reading %s / %s from underlying db', groupId, paramKey);\n const req = {\n groupId: groupId,\n paramKey: paramKey,\n };\n const rval = await this.dynamo.simpleGet(this.tableName, req);\n return rval;\n }\n async readAllParametersForGroup(groupId) {\n const qry = {\n TableName: this.tableName,\n KeyConditionExpression: 'groupId = :groupId',\n ExpressionAttributeValues: {\n ':groupId': groupId,\n },\n };\n const all = await this.dynamo.fullyExecuteQuery(qry);\n return all;\n }\n async writeParameter(toStore) {\n const rval = await this.dynamo.simplePut(this.tableName, toStore);\n return !!rval;\n }\n}\n//# sourceMappingURL=dynamo-runtime-parameter-provider.js.map","import { ErrorRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nexport class GlobalVariableOverrideRuntimeParameterProvider {\n wrapped;\n options = {\n globalTTL: 1,\n separator: '.',\n prefix: 'RuntimeEnv-',\n suffix: '',\n };\n constructor(wrapped, opts) {\n this.wrapped = wrapped;\n RequireRatchet.notNullOrUndefined(this.wrapped, 'wrapped');\n RequireRatchet.notNullOrUndefined(global?.process?.env, '\"process\" not found - this only runs in Node, not the browser');\n if (opts) {\n this.options = opts;\n }\n RequireRatchet.notNullOrUndefined(this.options.globalTTL, 'this.options.globalTTL');\n RequireRatchet.notNullOrUndefined(this.options.separator, 'this.options.separator');\n RequireRatchet.true(this.options.globalTTL > 0, 'this.options.globalTTL must be larger than 0');\n }\n generateName(groupId, paramKey) {\n return (StringRatchet.trimToEmpty(this.options.prefix) +\n groupId +\n StringRatchet.trimToEmpty(this.options.separator) +\n paramKey +\n StringRatchet.trimToEmpty(this.options.suffix));\n }\n async readParameter(groupId, paramKey) {\n const asString = StringRatchet.trimToNull(process.env[this.generateName(groupId, paramKey)]);\n if (asString && !StringRatchet.canParseAsJson(asString)) {\n ErrorRatchet.throwFormattedErr('Cannot parse ENV override (%s / %s) as JSON - did you forget the quotes on a string?', groupId, paramKey);\n }\n const rval = asString\n ? {\n groupId: groupId,\n paramKey: paramKey,\n paramValue: asString,\n ttlSeconds: this.options.globalTTL,\n }\n : await this.wrapped.readParameter(groupId, paramKey);\n return rval;\n }\n async readAllParametersForGroup(groupId) {\n return this.wrapped.readAllParametersForGroup(groupId);\n }\n async writeParameter(toStore) {\n return this.wrapped.writeParameter(toStore);\n }\n}\n//# sourceMappingURL=global-variable-override-runtime-parameter-provider.js.map","import { Logger } from '@bitblit/ratchet-common';\nexport class MemoryRuntimeParameterProvider {\n data;\n constructor(data = Promise.resolve({})) {\n this.data = data;\n }\n async readParameter(groupId, paramKey) {\n Logger.silly('Reading %s / %s from underlying db', groupId, paramKey);\n const d = await this.data;\n return d[groupId + '::' + paramKey];\n }\n async readAllParametersForGroup(groupId) {\n const d = await this.data;\n const out = [];\n Object.keys(d).forEach((k) => {\n if (k.startsWith(groupId)) {\n out.push(d[k]);\n }\n });\n return out;\n }\n async writeParameter(toStore) {\n const d = await this.data;\n d[toStore.groupId + '::' + toStore.paramKey] = toStore;\n return true;\n }\n}\n//# sourceMappingURL=memory-runtime-parameter-provider.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class RuntimeParameterRatchet {\n provider;\n cache = new Map();\n constructor(provider) {\n this.provider = provider;\n RequireRatchet.notNullOrUndefined(this.provider);\n }\n async fetchParameter(groupId, paramKey, defaultValue = null, forceFreshRead = false) {\n Logger.debug('Reading parameter %s / %s / Force : %s', groupId, paramKey, forceFreshRead);\n const cached = this.cache.get(RuntimeParameterRatchet.toCacheStoreKey(groupId, paramKey));\n let rval = null;\n const now = new Date().getTime();\n if (!forceFreshRead && !!cached) {\n const oldest = !!cached.ttlSeconds ? now - cached.ttlSeconds * 1000 : 0;\n if (cached.storedEpochMS > oldest) {\n Logger.silly('Fetched %s / %s from cache', groupId, paramKey);\n rval = JSON.parse(cached.paramValue);\n }\n }\n if (!rval) {\n const temp = await this.readUnderlyingEntry(groupId, paramKey);\n if (!!temp) {\n this.addToCache(temp);\n rval = JSON.parse(temp.paramValue);\n }\n }\n rval = rval || defaultValue;\n return rval;\n }\n async fetchAllParametersForGroup(groupId) {\n const all = await this.readUnderlyingEntries(groupId);\n const rval = new Map();\n all.forEach((t) => {\n rval.set(t.paramKey, JSON.parse(t.paramValue));\n this.addToCache(t);\n });\n return rval;\n }\n async readUnderlyingEntry(groupId, paramKey) {\n return this.provider.readParameter(groupId, paramKey);\n }\n async readUnderlyingEntries(groupId) {\n return this.provider.readAllParametersForGroup(groupId);\n }\n async storeParameter(groupId, paramKey, paramValue, ttlSeconds) {\n const toStore = {\n groupId: groupId,\n paramKey: paramKey,\n paramValue: JSON.stringify(paramValue),\n ttlSeconds: ttlSeconds,\n };\n const wrote = await this.provider.writeParameter(toStore);\n return this.provider.readParameter(groupId, paramKey);\n }\n static toCacheStoreKey(groupId, paramKey) {\n return groupId + ':::' + paramKey;\n }\n addToCache(temp) {\n if (!!temp) {\n const now = new Date().getTime();\n const toStore = Object.assign({ storedEpochMS: now }, temp);\n this.cache.set(RuntimeParameterRatchet.toCacheStoreKey(temp.groupId, temp.paramKey), toStore);\n }\n }\n clearCache() {\n Logger.debug('Clearing runtime parameter cache');\n this.cache = new Map();\n }\n}\n//# sourceMappingURL=runtime-parameter-ratchet.js.map","import { CopyObjectCommand, GetObjectCommand, ListObjectsV2Command, } from '@aws-sdk/client-s3';\nimport { Logger, PromiseRatchet, RequireRatchet } from '@bitblit/ratchet-common';\nimport { Upload } from '@aws-sdk/lib-storage';\nexport class S3LocationSyncRatchet {\n config;\n constructor(config) {\n RequireRatchet.notNullOrUndefined(config, 'config');\n this.config = config;\n if (!this.config.maxNumThreads) {\n this.config.maxNumThreads = 15;\n }\n if (!this.config.maxRetries) {\n this.config.maxRetries = 5;\n }\n }\n updateSrcPrefix(prefix) {\n this.config.srcPrefix = prefix;\n }\n updateDstPrefix(prefix) {\n this.config.dstPrefix = prefix;\n }\n async copyObject(key, size, express = false) {\n const dstKey = key.replace(this.config.srcPrefix, this.config.dstPrefix);\n let completedCopying = false;\n let retries = 0;\n while (!completedCopying && retries < this.config.maxRetries) {\n Logger.debug(`${retries > 0 ? `Retry ${retries} ` : ''}${express ? 'Express' : 'Slow'} copying\n [${[this.config.srcBucket, key].join('/')} ---> ${[this.config.dstBucket, dstKey].join('/')}]`);\n try {\n if (express) {\n const params = {\n CopySource: encodeURIComponent([this.config.srcBucket, key].join('/')),\n Bucket: this.config.dstBucket,\n Key: dstKey,\n MetadataDirective: 'COPY',\n };\n await this.config.dstS3.send(new CopyObjectCommand(params));\n }\n else {\n const fetched = await this.config.srcS3.send(new GetObjectCommand({ Bucket: this.config.srcBucket, Key: key }));\n const params = {\n Bucket: this.config.dstBucket,\n Key: dstKey,\n Body: fetched.Body,\n ContentLength: size,\n };\n const upload = new Upload({\n client: this.config.dstS3,\n params: params,\n tags: [],\n queueSize: 4,\n partSize: 1024 * 1024 * 5,\n leavePartsOnError: false,\n });\n upload.on('httpUploadProgress', (progress) => {\n Logger.info('Uploading : %s', progress);\n });\n await upload.done();\n }\n completedCopying = true;\n }\n catch (err) {\n Logger.warn(`Can't ${express ? 'express' : 'slow'} copy\n [${[this.config.srcBucket, key].join('/')} ---> ${[this.config.dstBucket, dstKey].join('/')}]: %j`, err);\n retries++;\n }\n }\n Logger.debug(`Finished ${express ? 'express' : 'slow'} copying\n [${[this.config.srcBucket, key].join('/')} ---> ${[this.config.dstBucket, dstKey].join('/')}]`);\n }\n async listObjects(bucket, prefix, s3) {\n Logger.info(`Scanning bucket [${[bucket, prefix].join('/')}]`);\n const params = {\n Bucket: bucket,\n Prefix: prefix,\n };\n let more = true;\n const rval = {};\n while (more) {\n const response = await s3.send(new ListObjectsV2Command(params));\n more = response.IsTruncated;\n response.Contents.forEach((obj) => {\n rval[obj.Key] = { Key: obj.Key, LastModified: obj.LastModified, ETag: obj.ETag, Size: obj.Size };\n });\n if (more) {\n params.ContinuationToken = response.NextContinuationToken;\n }\n }\n return rval;\n }\n async startSyncing() {\n Logger.info(`Syncing [${this.config.srcBucket}/${this.config.srcPrefix}\n ---> ${this.config.dstBucket}/${this.config.dstPrefix}]`);\n const cp = async (obj) => {\n await this.copyObject(obj.Key, obj.Size);\n };\n let cmpResult = await this.compareSrcAndDst();\n if (cmpResult.needCopy.length > 0 || cmpResult.diff.length > 0) {\n await PromiseRatchet.runBoundedParallelSingleParam(cp, cmpResult.needCopy, this, this.config.maxNumThreads);\n await PromiseRatchet.runBoundedParallelSingleParam(cp, cmpResult.diff, this, this.config.maxNumThreads);\n Logger.info('Verifying...');\n cmpResult = await this.compareSrcAndDst();\n Logger.debug('Compare result %j', cmpResult);\n }\n return cmpResult.needCopy.length === 0 && cmpResult.diff.length === 0;\n }\n async compareSrcAndDst() {\n const getSrc = this.listObjects(this.config.srcBucket, this.config.srcPrefix, this.config.srcS3);\n const getDst = this.listObjects(this.config.dstBucket, this.config.dstPrefix, this.config.dstS3);\n const srcObjs = await getSrc;\n const dstObjs = await getDst;\n const rval = {\n needCopy: [],\n existed: [],\n diff: [],\n };\n await PromiseRatchet.runBoundedParallelSingleParam((key) => {\n const sObj = srcObjs[key];\n const dstKey = key.replace(this.config.srcPrefix, this.config.dstPrefix);\n const dObj = dstObjs.hasOwnProperty(dstKey) ? dstObjs[dstKey] : undefined;\n if (!dObj) {\n rval.needCopy.push(sObj);\n return;\n }\n if (sObj.Size !== dObj.Size) {\n rval.diff.push(sObj);\n return;\n }\n if (sObj.LastModified.getTime() <= dObj.LastModified.getTime()) {\n rval.existed.push(sObj);\n return;\n }\n rval.diff.push(sObj);\n }, Object.keys(srcObjs), this, this.config.maxNumThreads);\n return rval;\n }\n}\n//# sourceMappingURL=s3-location-sync-ratchet.js.map","import { RequireRatchet } from '@bitblit/ratchet-common';\nexport class S3Ratchet {\n static checkS3UrlForValidity(value) {\n let rval = false;\n if (value) {\n rval = value.startsWith('s3://') && value.trim().length > 5;\n }\n return rval;\n }\n static extractBucketFromURL(value) {\n RequireRatchet.true(S3Ratchet.checkS3UrlForValidity(value), 'invalid s3 url');\n const idx1 = value.indexOf('/', 5);\n const rval = idx1 > 0 ? value.substring(5, idx1) : value.substring(5);\n return rval;\n }\n static extractKeyFromURL(value) {\n RequireRatchet.true(S3Ratchet.checkS3UrlForValidity(value), 'invalid s3 url');\n const idx1 = value.indexOf('/', 5);\n const rval = idx1 > 0 ? value.substring(idx1 + 1) : null;\n return rval;\n }\n}\n//# sourceMappingURL=s3-ratchet.js.map","import { Base64Ratchet, ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { SendRawEmailCommand } from '@aws-sdk/client-ses';\nimport { DateTime } from 'luxon';\nexport class Mailer {\n ses;\n config;\n static EMAIL = new RegExp('.+@.+\\\\.[a-z]+');\n constructor(ses, config = {}) {\n this.ses = ses;\n this.config = config;\n RequireRatchet.notNullOrUndefined(this.ses);\n if (!!config.archive && !config.archive.getDefaultBucket()) {\n throw new Error('If archive specified, must set a default bucket');\n }\n }\n get sESClient() {\n return this.ses;\n }\n async fillEmailBody(rts, context, htmlTemplateName, txtTemplateName = null, layoutName = null, partialNames = null) {\n RequireRatchet.notNullOrUndefined(htmlTemplateName);\n if (!this.config.templateRenderer) {\n ErrorRatchet.throwFormattedErr('Cannot use fill body if template renderer not set');\n }\n rts.htmlMessage = await this.config.templateRenderer.renderTemplate(htmlTemplateName, context, layoutName, partialNames);\n rts.txtMessage = !!txtTemplateName ? await this.config.templateRenderer.renderTemplate(txtTemplateName, context) : null;\n return rts;\n }\n async fillEmailBodyAndSend(rts, context, htmlTemplateName, txtTemplateName = null, layoutName = null, partialNames = null) {\n const newVal = await this.fillEmailBody(rts, context, htmlTemplateName, txtTemplateName, layoutName, partialNames);\n const rval = await this.sendEmail(newVal);\n return rval;\n }\n filterEmailsToValid(emails) {\n const rval = (emails || []).filter((e) => {\n if (!this.config.allowedDestinationEmails || this.config.allowedDestinationEmails.length == 0) {\n return true;\n }\n else {\n const match = this.config.allowedDestinationEmails.find((s) => s.test(e));\n return !!match;\n }\n });\n return rval;\n }\n async archiveEmailIfConfigured(rts) {\n let rval = false;\n if (!!rts && !!this.config.archive && !rts.doNotArchive) {\n Logger.debug('Archiving outbound email to : %j', rts.destinationAddresses);\n let targetPath = StringRatchet.trimToEmpty(this.config.archivePrefix);\n if (!targetPath.endsWith('/')) {\n targetPath += '/';\n }\n const now = DateTime.utc();\n targetPath +=\n 'year=' +\n now.toFormat('yyyy') +\n '/month=' +\n now.toFormat('MM') +\n '/day=' +\n now.toFormat('dd') +\n '/hour=' +\n now.toFormat('HH') +\n '/' +\n now.toFormat('mm_ss__SSS');\n targetPath += '.json';\n try {\n await this.config.archive.writeObjectToCacheFile(targetPath, rts);\n rval = true;\n }\n catch (err) {\n Logger.warn('Failed to archive email %s %j : %s', targetPath, rts, err);\n }\n }\n return rval;\n }\n applyLimitsToBodySizesIfAnyInPlace(rts) {\n if (this.config.maxMessageBodySizeInBytes) {\n const txtSize = StringRatchet.trimToEmpty(rts.txtMessage).length;\n const htmlSize = StringRatchet.trimToEmpty(rts.htmlMessage).length;\n const totalSize = txtSize + htmlSize;\n if (totalSize > this.config.maxMessageBodySizeInBytes) {\n Logger.warn('Max message size is %d but size is %d - converting', this.config.maxMessageBodySizeInBytes, totalSize);\n rts.attachments = rts.attachments || [];\n if (StringRatchet.trimToNull(rts.txtMessage)) {\n const txtAttach = {\n filename: 'original-txt-body.txt',\n contentType: 'text/plain',\n base64Data: Base64Ratchet.generateBase64VersionOfString(rts.txtMessage),\n };\n rts.attachments.push(txtAttach);\n }\n if (StringRatchet.trimToNull(rts.htmlMessage)) {\n const htmlAttach = {\n filename: 'original-html-body.html',\n contentType: 'text/html',\n base64Data: Base64Ratchet.generateBase64VersionOfString(rts.htmlMessage),\n };\n rts.attachments.push(htmlAttach);\n }\n rts.htmlMessage = null;\n rts.txtMessage = 'The message was too large and was converted to attachment(s). Please see attached files for content';\n }\n }\n }\n applyLimitsToAttachmentSizesIfAnyInPlace(rts) {\n if (this.config.maxAttachmentSizeInBase64Bytes) {\n const filtered = [];\n if (rts.attachments) {\n rts.attachments.forEach((a) => {\n if (a.base64Data && a.base64Data.length < this.config.maxAttachmentSizeInBase64Bytes) {\n filtered.push(a);\n }\n else {\n Logger.warn('Removing too-large attachment : %s : %s : %d', a.filename, a.contentType, a.base64Data.length);\n filtered.push({\n filename: 'attachment-removed-notice-' + StringRatchet.createRandomHexString(4) + '.txt',\n contentType: 'text/plain',\n base64Data: Base64Ratchet.generateBase64VersionOfString('Attachment ' +\n a.filename +\n ' of type ' +\n a.contentType +\n ' was removed since it was ' +\n a.base64Data.length +\n ' bytes but max allowed is ' +\n this.config.maxAttachmentSizeInBase64Bytes),\n });\n }\n });\n }\n rts.attachments = filtered;\n }\n }\n async sendEmail(inRts) {\n RequireRatchet.notNullOrUndefined(inRts, 'RTS must be defined');\n RequireRatchet.notNullOrUndefined(inRts.destinationAddresses, 'Destination addresses must be defined');\n let rval = null;\n let toAddresses = this.filterEmailsToValid(inRts.destinationAddresses);\n const autoBcc = inRts.doNotAutoBcc ? [] : this.config.autoBccAddresses || [];\n const bccAddresses = (inRts.bccAddresses || []).concat(autoBcc);\n if (toAddresses.length === 0 && bccAddresses.length > 0) {\n Logger.debug('Destination emails filtered to none but BCC defined, copying BCC');\n toAddresses = bccAddresses;\n }\n const rts = Object.assign({}, inRts);\n rts.srcDestinationAddresses = inRts.destinationAddresses;\n rts.srcBccAddresses = inRts.bccAddresses;\n rts.destinationAddresses = toAddresses;\n rts.bccAddresses = bccAddresses;\n this.applyLimitsToBodySizesIfAnyInPlace(rts);\n this.applyLimitsToAttachmentSizesIfAnyInPlace(rts);\n await this.archiveEmailIfConfigured(rts);\n if (rts.destinationAddresses.length === 0) {\n Logger.info('After cleaning email lists, no destination addresses left - not sending email');\n }\n else {\n const toLine = 'To: ' + rts.destinationAddresses.join(', ') + '\\n';\n const bccLine = !!rts.bccAddresses && rts.bccAddresses.length > 0 ? 'Bcc: ' + rts.bccAddresses.join(', ') + '\\n' : '';\n try {\n const from = rts.fromAddress || this.config.defaultSendingAddress;\n const boundary = 'NextPart';\n const altBoundary = 'AltPart';\n let rawMail = 'From: ' + from + '\\n';\n rawMail += toLine;\n rawMail += bccLine;\n rawMail += 'Subject: ' + rts.subject + '\\n';\n rawMail += 'MIME-Version: 1.0\\n';\n rawMail += 'Content-Type: multipart/mixed; boundary=\"' + boundary + '\"\\n';\n rawMail += '\\n\\n--' + boundary + '\\n';\n rawMail += 'Content-Type: multipart/alternative; boundary=\"' + altBoundary + '\"\\n';\n if (!!StringRatchet.trimToNull(rts.htmlMessage)) {\n rawMail += '\\n\\n--' + altBoundary + '\\n';\n rawMail += 'Content-Type: text/html; charset=\"UTF-8\"\\n\\n';\n rawMail += rts.htmlMessage;\n }\n if (!!StringRatchet.trimToNull(rts.txtMessage)) {\n rawMail += '\\n\\n--' + altBoundary + '\\n';\n rawMail += 'Content-Type: text/plain\\n\\n';\n rawMail += rts.txtMessage;\n }\n rawMail += '\\n\\n--' + altBoundary + '--\\n';\n if (rts.attachments) {\n rts.attachments.forEach((a) => {\n rawMail += '\\n\\n--' + boundary + '\\n';\n rawMail += 'Content-Type: ' + a.contentType + '; name=\"' + a.filename + '\"\\n';\n rawMail += 'Content-Transfer-Encoding: base64\\n';\n rawMail += 'Content-Disposition: attachment\\n\\n';\n rawMail += a.base64Data.replace(/([^\\0]{76})/g, '$1\\n') + '\\n\\n';\n });\n }\n rawMail += '\\n\\n--' + boundary + '--\\n';\n const params = {\n RawMessage: { Data: new TextEncoder().encode(rawMail) },\n };\n rval = await this.ses.send(new SendRawEmailCommand(params));\n }\n catch (err) {\n Logger.error('Error while processing email: %s', err, err);\n }\n }\n return rval;\n }\n static validEmail(email) {\n return email !== null && Mailer.EMAIL.test(email);\n }\n}\n//# sourceMappingURL=mailer.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nimport { PublishCommand, SNSClient } from '@aws-sdk/client-sns';\nexport class SnsRatchet {\n sns;\n topicArn;\n constructor(sns = new SNSClient({ region: 'us-east-1' }), topicArn) {\n this.sns = sns;\n this.topicArn = topicArn;\n RequireRatchet.notNullOrUndefined(this.sns, 'sns');\n RequireRatchet.notNullOrUndefined(this.topicArn, 'topicArn');\n }\n get snsClient() {\n return this.sns;\n }\n async sendMessage(inMsg, suppressErrors = false) {\n let result = null;\n try {\n const safeInMsg = inMsg ? inMsg : 'NO-MESSAGE-PROVIDED';\n const msg = typeof safeInMsg === 'string' ? safeInMsg : JSON.stringify(safeInMsg);\n const params = {\n TopicArn: this.topicArn,\n Message: msg,\n };\n Logger.debug('Sending via SNS : %j', params);\n result = await this.sns.send(new PublishCommand(params));\n }\n catch (err) {\n if (suppressErrors) {\n Logger.error('Failed to fire SNS notification : %j : %s', inMsg, err);\n }\n else {\n throw err;\n }\n }\n return result;\n }\n async conditionallySendMessage(inMsg, condition, suppressErrors = false) {\n let rval = null;\n if (condition) {\n rval = await this.sendMessage(inMsg, suppressErrors);\n }\n else {\n Logger.info('Not sending message, condition was false : %j', inMsg);\n }\n return rval;\n }\n}\n//# sourceMappingURL=sns-ratchet.js.map","import { Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport { PutItemCommand } from '@aws-sdk/client-dynamodb';\nexport class DynamoDbSyncLock {\n ratchet;\n tableName;\n constructor(ratchet, tableName) {\n this.ratchet = ratchet;\n this.tableName = tableName;\n RequireRatchet.notNullOrUndefined(ratchet, 'ratchet');\n RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(this.tableName), 'tableName');\n }\n async acquireLock(lockKey, expirationSeconds = 30) {\n let rval = false;\n if (!!lockKey && !!expirationSeconds) {\n const nowSeconds = Math.floor(new Date().getTime() / 1000);\n const row = {\n lockingKey: lockKey,\n timestamp: nowSeconds,\n expires: nowSeconds + expirationSeconds,\n };\n const params = {\n Item: row,\n ReturnConsumedCapacity: 'TOTAL',\n TableName: this.tableName,\n ConditionExpression: 'attribute_not_exists(lockingKey)',\n };\n try {\n const pio = await this.ratchet.getDDB().send(new PutItemCommand(params));\n rval = true;\n }\n catch (err) {\n if (String(err).indexOf('ConditionalCheckFailedException') > -1) {\n Logger.silly('Unable to acquire lock on %s', lockKey);\n }\n }\n }\n return rval;\n }\n async releaseLock(lockKey) {\n if (StringRatchet.trimToNull(lockKey)) {\n try {\n const dio = await this.ratchet.simpleDelete(this.tableName, { lockingKey: lockKey });\n Logger.silly('Released lock %s : %s', lockKey, dio);\n }\n catch (err) {\n Logger.warn('Failed to release lock key : %s : %s', lockKey, err, err);\n }\n }\n }\n async clearExpiredSyncLocks() {\n const nowSeconds = Math.floor(new Date().getTime() / 1000);\n const scan = {\n TableName: this.tableName,\n FilterExpression: 'expires < :now',\n ExpressionAttributeValues: {\n ':now': nowSeconds,\n },\n };\n const vals = await this.ratchet.fullyExecuteScan(scan);\n const keysOnly = vals.map((v) => {\n const next = { lockingKey: v['lockingKey'] };\n return next;\n });\n const removed = await this.ratchet.deleteAllInBatches(this.tableName, keysOnly, 25);\n return removed;\n }\n}\n//# sourceMappingURL=dynamo-db-sync-lock.js.map","import { StringRatchet } from '@bitblit/ratchet-common';\nexport class MemorySyncLock {\n _locks = new Map();\n constructor() { }\n async acquireLock(lockKey, expirationSeconds = 30) {\n let rval = false;\n if (StringRatchet.trimToNull(lockKey)) {\n const now = Date.now();\n const val = this._locks.get(lockKey);\n if (!val || val < now) {\n this._locks.set(lockKey, now + expirationSeconds * 1000);\n rval = true;\n }\n }\n return rval;\n }\n async releaseLock(lockKey) {\n if (StringRatchet.trimToNull(lockKey)) {\n this._locks.delete(lockKey);\n }\n }\n async clearExpiredSyncLocks() {\n const toRemove = [];\n const now = Date.now();\n this._locks.forEach((v, k) => {\n if (v < now) {\n toRemove.push(k);\n }\n });\n toRemove.forEach((k) => {\n this._locks.delete(k);\n });\n return toRemove.length;\n }\n}\n//# sourceMappingURL=memory-sync-lock.js.map"],"names":["AwsBatchBackgroundProcessor","batchRatchet","validTaskNames","constructor","this","RequireRatchet","notNullOrUndefined","batchClient","defaultJobDefinition","defaultQueueName","scheduleBackgroundTask","taskName","data","meta","length","StringRatchet","trimToNull","includes","ErrorRatchet","throwFormattedErr","Logger","info","rval","jobName","DateTime","utc","toFormat","options","jobDefinition","jobQueue","parameters","taskData","JSON","stringify","taskMetadata","scheduleJob","jobId","err","error","AwsBatchRatchet","_batchClient","_defaultQueueName","_defaultJobDefinition","send","SubmitJobCommand","jobCountInState","jobStatus","queueName","listJobs","request","nextToken","tmp","ListJobsCommand","concat","jobSummaryList","RatchetAwsInfo","buildInformation","version","hash","branch","tag","timeBuiltISO","notes","DynamoDbStorageProvider","dynamo","opts","tableName","hashKeyName","true","useRangeKeys","rangeKeyName","hashKeyValue","createDefaultOptions","createKeyObject","cacheKey","keys","cleanDynamoFieldsFromObjectInPlace","dynamoExpiresColumnName","extractKeysFromObject","readFromCache","dKey","simpleGet","storeInCache","value","toSave","Object","assign","expiresEpochMS","Math","floor","simplePut","removeFromCache","simpleDelete","clearCache","allKeys","readAll","map","a","deleteAllInBatches","qry","TableName","KeyConditionExpression","ExpressionAttributeNames","ExpressionAttributeValues","fullyExecuteQuery","scan","fullyExecuteScan","forEach","r","S3StorageProvider","s3CacheRatchet","prefix","getDefaultBucket","keyToPath","trimToEmpty","endsWith","fetchCacheFileAsObject","writeObjectToCacheFile","removeCacheFile","directChildrenOfPrefix","Promise","all","k","SimpleCache","provider","defaultTimeToLiveMS","createDefaultReadOptions","maxStalenessMS","timeToLiveMS","cacheNullValues","fetchWrapper","producer","silly","now","Date","getTime","debug","createdEpochMS","generated","fetch","wrapper","returnOldValue","CloudWatchLogGroupRatchet","logGroup","awsCWLogs","CloudWatchLogsClient","region","cloudWatchLogsClient","readLogStreams","startTimestamp","endTimestamp","params","logGroupName","orderBy","temp","DescribeLogStreamsCommand","logStreams","s","lastEventTimestamp","firstEventTimestamp","push","readLogStreamNames","logStreamName","readEvents","filter","sortEvents","maxEvents","sw","StopWatch","endTime","startTime","filterPattern","dump","FilterLogEventsCommand","events","sort","b","timestamp","message","localeCompare","log","CloudWatchLogsRatchet","static","cwLogs","cloudwatchLogs","removeEmptyOrOldLogStreams","maxToRemove","oldestEventEpochMS","streamSearchParams","oldestEventTester","totalStreams","removedStreams","failedRemovedStreams","waitPerDescribe","streams","i","st","oldWait","min","waitPer","delParams","type","storedBytes","removed","retry","MAX_DELETE_RETRIES","DeleteLogStreamCommand","PromiseRatchet","wait","warn","findOldestEventTimestampInGroup","stream","findStreamWithOldestEventInGroup","findLogGroups","logGroupNamePrefix","res","DescribeLogGroupsCommand","logGroups","removeLogGroups","groups","req","DeleteLogGroupCommand","removeLogGroupsWithPrefix","fullyExecuteInsightsQuery","sqr","resp","StartQueryCommand","delayMS","status","GetQueryResultsCommand","queryId","abortInsightsQuery","StopQueryCommand","CloudWatchMetricsUnit","CloudWatchMetricsRatchet","cw","cloudWatch","CloudWatchClient","apiVersion","cloudWatchClient","writeSingleMetric","namespace","metric","dims","unit","None","timestampDate","highResolution","cwDims","d","Name","key","Value","storageResolution","metricData","Namespace","MetricData","MetricName","Dimensions","Unit","String","Timestamp","StorageResolution","result","PutMetricDataCommand","writeDynamoCountAsMinuteLevelMetric","minuteUTC","query","Error","cnt","dynamoRatchet","fullyExecuteQueryCount","fullyExecuteScanCount","parseDateString","split","join","parseDate","fromISO","toJSDate","metricRes","Count","count","DaemonUtil","Buffer","from","start","cache","id","s3Key","newState","title","lastUpdatedEpochMS","lastUpdatedMessage","targetFileName","startedEpochMS","completedEpochMS","link","contentType","writeState","DEFAULT_CONTENT","contents","s3meta","DAEMON_METADATA_KEY","Bucket","Key","ContentType","Metadata","Body","Blob","ContentDisposition","written","getS3Client","PutObjectCommand","stat","streamDataAndFinish","inStat","updateMessage","overrideTargetFileName","upload","Upload","client","tags","queueSize","partSize","leavePartsOnError","on","progress","done","newMessage","s3Cache","path","fetchMetaForCacheFile","metaString","parse","preSignedDownloadUrlForCacheFile","abort","finalize","S3CacheRatchet","s3","defaultBucket","s3Client","applyCacheControlMaxAge","input","seconds","CacheControl","applyUserMetaData","fileExists","bucket","bucketVal","fetchCacheFileAsS3GetObjectCommandOutput","GetObjectCommand","NoSuchKey","fetchCacheFileAsReadableStream","transformToWebStream","fetchCacheFileAsBuffer","out","transformToByteArray","fetchCacheFileAsString","transformToString","DeleteObjectCommand","dataObject","template","json","writeStringToCacheFile","dataString","WebStreamRatchet","stringToWebReadableStream","writeStreamToCacheFile","synchronize","srcPrefix","targetPrefix","targetRatchet","recurseSubFolders","sourceFiles","targetFiles","sourceFile","dumpExpected","subs","shouldCopy","srcMeta","targetMeta","ETag","srcStream","undefined","HeadObjectCommand","cacheFileAgeInSeconds","LastModified","copyFile","srcKey","dstKey","srcBucket","dstBucket","CopySource","MetadataDirective","CopyObjectCommand","quietCopyFile","expirationSeconds","getCommand","getSignedUrl","expiresIn","expandFiles","maxToReturn","returnValue","Prefix","Delimiter","response","ListObjectsCommand","prefixLength","cp","substring","async","expanded","name","size","Marker","NextMarker","allSubFoldersOfPrefix","idx","next","ContinuationToken","NextContinuationToken","CommonPrefixes","p","explicitBucket","Daemon","_defaultGroup","jwtRatchet","DEFAULT_DEFAULT_GROUP","defaultGroup","keyToPublicToken","token","daemonKey","createTokenString","toString","pathToKey","generatePath","group","generatePrefix","createType4Guid","clean","olderThanSeconds","original","list","test","listKeys","proms","itemPath","statFromPublicToken","publicToken","parsed","decodeToken","PrototypeDao","cfg","defaultDaoConfig","guidCreateFunction","guidFieldName","createdEpochMSFieldName","updatedEpochMSFieldName","createdUtcTimestampFieldName","updatedUtcTimestampFieldName","fetchAll","loadDatabase","items","resetDatabase","storeDatabase","lastModifiedEpochMS","removeItems","guids","old","t","store","toISO","fetchById","guid","find","searchByField","fieldDotPath","fieldValue","searchByFieldMap","matchAll","val","MapRatchet","findValueDotPath","S3PrototypeDaoProvider","keyName","notNullUndefinedOrOnlyWhitespaceString","inDb","S3SimpleDao","buildPathPrefix","buildFullPath","exists","fullPath","item","listItems","fetchItemsInPath","promises","DynamoRatchet","awsDDB","dynamoDBDocumentClient","getDDB","tableIsEmpty","Limit","throughputSafeScanOrQuery","o","scanPromise","Items","ScanCommand","queryPromise","QueryCommand","proc","maxTries","inCurrentTry","currentTry","objectIsErrorWithProvisionedThroughputExceededExceptionCode","pow","Select","scannedCount","pages","qryResults","myLimit","LastEvaluatedKey","end","DurationRatchet","formatMsDuration","softLimit","fullyExecuteProcessOverQuery","v","blankPages","fullyExecuteProcessOverScan","writeAllInBatches","elements","batchSize","batchItems","el","PutRequest","Item","ReturnConsumedCapacity","curBatch","slice","RequestItems","ReturnItemCollectionMetrics","tryCount","batchResults","BatchWriteCommand","UnprocessedItems","backoff","fetchFullObjectsMatchingKeysOnlyIndexQuery","keyNames","keyDataSrc","keysOnly","stripAllToKeysOnly","fetchAllInBatches","inKeys","batches","remain","tableEntry","Keys","nextBatch","BatchGetCommand","Responses","UnprocessedKeys","DeleteRequest","autoRetryCount","PutCommand","simplePutOnlyIfFieldIsNullOrUndefined","fieldName","ConditionExpression","wrote","simplePutWithCollisionAvoidance","adjustFunction","maxAdjusts","pio","attrNames","attrValues","condExp","adjustCount","newValue","holder","GetCommand","simpleGetWithCounterDecrement","counterAttributeName","deleteOnZero","UpdateExpression","ReturnValues","updateFailed","UpdateItemCommand","Attributes","DeleteCommand","atomicCounter","counterFieldName","increment","update","ui","NumberRatchet","safeNumber","cleanObject","ob","rem","stripToKeysOnly","keysNames","DynamoTableRatchet","deleteTable","waitForDelete","DeleteTableCommand","waitForTableDelete","createTable","waitForReady","replaceIfExists","tableExists","CreateTableCommand","waitForTableReady","safeDescribeTable","Table","TableStatus","listAllTables","ListTablesCommand","TableNames","ExclusiveStartTableName","LastEvaluatedTableName","DescribeTableCommand","ResourceNotFoundException","copyTable","srcTableName","dstTableName","overrides","copyData","fErr","srcTableDef","AttributeDefinitions","KeySchema","GlobalSecondaryIndexes","createInput","LocalSecondaryIndexes","gi","output","ProvisionedThroughput","WriteCapacityUnits","ReadCapacityUnits","BillingMode","BillingModeSummary","StreamSpecification","SSESpecification","SSEDescription","Tags","TableClass","TableClassSummary","DeletionProtectionEnabled","HashSpreader","spots","buckets","separator","alphabet","_allSlots","allUnique","stringContainsOnlyAlphanumeric","permutations","allPerms","allPermutationsOfLength","allBuckets","randomBucket","random","allSpreadValues","allSpreadValuesForArray","inputs","addSpreader","extractBucket","loc","charAt","removeBucket","Ec2Ratchet","availabilityZone","ec2","ec2InstanceConnect","EC2Client","EC2InstanceConnectClient","eC2Client","eC2InstanceConnectClient","stopInstance","instanceId","maxWaitForShutdownMS","stopParams","InstanceIds","DryRun","StopInstancesCommand","describeInstance","State","Code","launchInstance","maxWaitForStartupMS","startParams","StartInstancesCommand","PublicIpAddress","listAllInstances","instanceIds","NextToken","DescribeInstancesCommand","Reservations","Instances","sendPublicKeyToEc2Instance","publicKeyString","instanceOsUser","userName","InstanceId","AvailabilityZone","InstanceOSUser","SSHPublicKey","SendSSHPublicKeyCommand","CascadeEnvironmentServiceProvider","providers","fetchConfig","EnvVarEnvironmentServiceProvider","envVarName","src","process","env","global","toParse","EnvironmentService","readPromiseCache","Map","defaultEnvironmentServiceConfig","maxRetries","backoffMultiplierMS","getConfig","has","set","getConfigUncached","get","waitMS","FixedEnvironmentServiceProvider","fromRecord","record","m","S3EnvironmentServiceProvider","ratchet","bucketName","s3Override","S3Client","readPath","pathPrefix","pathSuffix","SsmEnvironmentServiceProvider","ssmEncrypted","ssm","SSMClient","WithDecryption","GetParameterCommand","Parameter","errCode","toLowerCase","indexOf","errMsg","DynamoExpiringCodeProvider","checkCode","code","context","deleteOnMatch","expCode","storeCode","ConsumedCapacity","CapacityUnits","createTableIfMissing","dtr","ExpiringCodeRatchet","generateCode","timeToLiveSeconds","createNewCode","S3ExpiringCodeProvider","fetchFile","updateFile","vals","toUpperCase","newData","AwsCredentialsRatchet","applySetProfileEnvironmentalVariable","newProfile","LambdaEventDetector","isValidCronEvent","event","source","resources","isValidSnsEvent","Records","EventSource","isValidDynamoDBEvent","eventSource","isValidS3Event","isValidApiGatewayV2WithRequestContextEvent","rawPath","requestContext","routeKey","isValidApiGatewayEvent","httpMethod","isValidApiGatewayAuthorizerEvent","authorizationToken","methodArn","isSingleCronEvent","isSingleEntryEvent","isSingleSnsEvent","isSingleDynamoDBEvent","isSingleS3Event","entryName","Array","LambdaEventTypeGuards","Route53Ratchet","route53","hostedZoneId","route53Client","changeCnameRecordTarget","domainName","target","ttlSeconds","ChangeBatch","Changes","Action","ResourceRecordSet","ResourceRecords","TTL","Type","HostedZoneId","ChangeResourceRecordSetsCommand","waitParams","Id","ChangeInfo","waitResult","waitUntilResourceRecordSetsChanged","maxWaitTime","state","WaiterState","SUCCESS","DynamoRuntimeParameterProvider","readParameter","groupId","paramKey","readAllParametersForGroup","writeParameter","toStore","GlobalVariableOverrideRuntimeParameterProvider","wrapped","globalTTL","suffix","generateName","asString","canParseAsJson","paramValue","MemoryRuntimeParameterProvider","resolve","startsWith","RuntimeParameterRatchet","fetchParameter","defaultValue","forceFreshRead","cached","toCacheStoreKey","oldest","storedEpochMS","readUnderlyingEntry","addToCache","fetchAllParametersForGroup","readUnderlyingEntries","storeParameter","S3LocationSyncRatchet","config","maxNumThreads","updateSrcPrefix","updateDstPrefix","dstPrefix","copyObject","express","replace","completedCopying","retries","encodeURIComponent","dstS3","fetched","srcS3","ContentLength","listObjects","more","ListObjectsV2Command","IsTruncated","Contents","obj","Size","startSyncing","cmpResult","compareSrcAndDst","needCopy","diff","runBoundedParallelSingleParam","getSrc","getDst","srcObjs","dstObjs","existed","sObj","dObj","hasOwnProperty","S3Ratchet","checkS3UrlForValidity","trim","extractBucketFromURL","idx1","extractKeyFromURL","Mailer","ses","RegExp","archive","sESClient","fillEmailBody","rts","htmlTemplateName","txtTemplateName","layoutName","partialNames","templateRenderer","htmlMessage","renderTemplate","txtMessage","fillEmailBodyAndSend","newVal","sendEmail","filterEmailsToValid","emails","e","allowedDestinationEmails","archiveEmailIfConfigured","doNotArchive","destinationAddresses","targetPath","archivePrefix","applyLimitsToBodySizesIfAnyInPlace","maxMessageBodySizeInBytes","totalSize","attachments","txtAttach","filename","base64Data","Base64Ratchet","generateBase64VersionOfString","htmlAttach","applyLimitsToAttachmentSizesIfAnyInPlace","maxAttachmentSizeInBase64Bytes","filtered","createRandomHexString","inRts","toAddresses","autoBcc","doNotAutoBcc","autoBccAddresses","bccAddresses","srcDestinationAddresses","srcBccAddresses","toLine","bccLine","fromAddress","defaultSendingAddress","boundary","altBoundary","rawMail","subject","RawMessage","Data","TextEncoder","encode","SendRawEmailCommand","validEmail","email","EMAIL","SnsRatchet","sns","topicArn","SNSClient","snsClient","sendMessage","inMsg","suppressErrors","safeInMsg","msg","TopicArn","Message","PublishCommand","conditionallySendMessage","condition","DynamoDbSyncLock","acquireLock","lockKey","nowSeconds","lockingKey","expires","PutItemCommand","releaseLock","dio","clearExpiredSyncLocks","FilterExpression","MemorySyncLock","_locks","delete","toRemove"],"mappings":"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"}