@forzalabs/remora 1.0.21 → 1.1.1

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.
Files changed (111) hide show
  1. package/actions/automap.js +26 -42
  2. package/actions/compile.js +27 -43
  3. package/actions/create_consumer.js +24 -40
  4. package/actions/create_producer.js +16 -32
  5. package/actions/debug.js +18 -34
  6. package/actions/deploy.js +30 -46
  7. package/actions/discover.js +13 -29
  8. package/actions/init.js +29 -45
  9. package/actions/mock.js +16 -32
  10. package/actions/run.js +34 -52
  11. package/actions/sample.js +42 -58
  12. package/index.js +38 -43
  13. package/package.json +4 -4
  14. package/workers/ExecutorWorker.js +18 -32
  15. package/Constants.js +0 -34
  16. package/core/Affirm.js +0 -42
  17. package/core/Algo.js +0 -160
  18. package/core/dste/DSTE.js +0 -113
  19. package/core/logger/DebugLogService.js +0 -48
  20. package/core/logger/DevelopmentLogService.js +0 -70
  21. package/core/logger/LocalLogService.js +0 -70
  22. package/core/logger/Logger.js +0 -54
  23. package/database/DatabaseEngine.js +0 -149
  24. package/database/DatabaseStructure.js +0 -27
  25. package/definitions/DatasetDefinitions.js +0 -2
  26. package/definitions/ExecutorDefinitions.js +0 -2
  27. package/definitions/ProcessENV.js +0 -2
  28. package/definitions/agents/DestinationDriver.js +0 -2
  29. package/definitions/agents/SourceDriver.js +0 -2
  30. package/definitions/cli.js +0 -2
  31. package/definitions/database/ApiKeys.js +0 -2
  32. package/definitions/database/Stored.js +0 -7
  33. package/definitions/database/UsageStat.js +0 -2
  34. package/definitions/database/User.js +0 -2
  35. package/definitions/json_schemas/consumer-schema.json +0 -1226
  36. package/definitions/json_schemas/producer-schema.json +0 -308
  37. package/definitions/json_schemas/project-schema.json +0 -100
  38. package/definitions/json_schemas/source-schema.json +0 -249
  39. package/definitions/requests/ConsumerRequest.js +0 -2
  40. package/definitions/requests/Developer.js +0 -2
  41. package/definitions/requests/Mapping.js +0 -2
  42. package/definitions/requests/ProducerRequest.js +0 -2
  43. package/definitions/requests/Request.js +0 -2
  44. package/definitions/resources/Compiled.js +0 -2
  45. package/definitions/resources/Consumer.js +0 -2
  46. package/definitions/resources/Environment.js +0 -2
  47. package/definitions/resources/Library.js +0 -2
  48. package/definitions/resources/Producer.js +0 -2
  49. package/definitions/resources/Project.js +0 -2
  50. package/definitions/resources/Schema.js +0 -2
  51. package/definitions/resources/Source.js +0 -2
  52. package/definitions/temp.js +0 -2
  53. package/definitions/transform/Transformations.js +0 -2
  54. package/drivers/DeltaShareDriver.js +0 -186
  55. package/drivers/DriverFactory.js +0 -72
  56. package/drivers/DriverHelper.js +0 -248
  57. package/drivers/HttpApiDriver.js +0 -208
  58. package/drivers/RedshiftDriver.js +0 -184
  59. package/drivers/files/LocalDestinationDriver.js +0 -146
  60. package/drivers/files/LocalSourceDriver.js +0 -405
  61. package/drivers/s3/S3DestinationDriver.js +0 -197
  62. package/drivers/s3/S3SourceDriver.js +0 -495
  63. package/engines/CryptoEngine.js +0 -75
  64. package/engines/Environment.js +0 -170
  65. package/engines/ProcessENVManager.js +0 -83
  66. package/engines/RandomEngine.js +0 -47
  67. package/engines/SecretManager.js +0 -23
  68. package/engines/UserManager.js +0 -66
  69. package/engines/ai/AutoMapperEngine.js +0 -37
  70. package/engines/ai/DeveloperEngine.js +0 -497
  71. package/engines/ai/LLM.js +0 -255
  72. package/engines/consumer/ConsumerManager.js +0 -218
  73. package/engines/consumer/ConsumerOnFinishManager.js +0 -202
  74. package/engines/dataset/Dataset.js +0 -824
  75. package/engines/dataset/DatasetManager.js +0 -211
  76. package/engines/dataset/DatasetRecord.js +0 -120
  77. package/engines/dataset/DatasetRecordPool.js +0 -77
  78. package/engines/execution/RequestExecutor.js +0 -67
  79. package/engines/parsing/CSVParser.js +0 -60
  80. package/engines/parsing/LineParser.js +0 -71
  81. package/engines/parsing/ParseCompression.js +0 -101
  82. package/engines/parsing/ParseHelper.js +0 -18
  83. package/engines/parsing/ParseManager.js +0 -54
  84. package/engines/parsing/XLSParser.js +0 -87
  85. package/engines/parsing/XMLParser.js +0 -115
  86. package/engines/producer/ProducerEngine.js +0 -127
  87. package/engines/producer/ProducerManager.js +0 -43
  88. package/engines/scheduler/CronScheduler.js +0 -222
  89. package/engines/scheduler/QueueManager.js +0 -314
  90. package/engines/schema/SchemaValidator.js +0 -67
  91. package/engines/transform/JoinEngine.js +0 -232
  92. package/engines/transform/TransformationEngine.js +0 -277
  93. package/engines/transform/TypeCaster.js +0 -59
  94. package/engines/usage/DataframeManager.js +0 -55
  95. package/engines/usage/UsageDataManager.js +0 -151
  96. package/engines/usage/UsageManager.js +0 -65
  97. package/engines/validation/Validator.js +0 -216
  98. package/executors/ConsumerExecutor.js +0 -280
  99. package/executors/Executor.js +0 -177
  100. package/executors/ExecutorOrchestrator.js +0 -331
  101. package/executors/ExecutorPerformance.js +0 -17
  102. package/executors/ExecutorProgress.js +0 -54
  103. package/executors/ExecutorScope.js +0 -52
  104. package/executors/OutputExecutor.js +0 -118
  105. package/executors/ProducerExecutor.js +0 -108
  106. package/helper/Helper.js +0 -149
  107. package/helper/Logger.js +0 -84
  108. package/helper/Runtime.js +0 -20
  109. package/helper/Settings.js +0 -13
  110. package/licencing/LicenceManager.js +0 -64
  111. package/settings.js +0 -12
@@ -1,108 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Affirm_1 = __importDefault(require("../core/Affirm"));
16
- const DriverFactory_1 = __importDefault(require("../drivers/DriverFactory"));
17
- const Environment_1 = __importDefault(require("../engines/Environment"));
18
- const CSVParser_1 = __importDefault(require("../engines/parsing/CSVParser"));
19
- const ProducerManager_1 = __importDefault(require("../engines/producer/ProducerManager"));
20
- const Algo_1 = __importDefault(require("../core/Algo"));
21
- const LineParser_1 = __importDefault(require("../engines/parsing/LineParser"));
22
- const CryptoEngine_1 = __importDefault(require("../engines/CryptoEngine"));
23
- const path_1 = __importDefault(require("path"));
24
- class ProducerExecutorClass {
25
- constructor() {
26
- this.ready = (producer, scope) => __awaiter(this, void 0, void 0, function* () {
27
- (0, Affirm_1.default)(producer, 'Invalid producer');
28
- const source = Environment_1.default.getSource(producer.source);
29
- (0, Affirm_1.default)(source, `Invalid source ${producer.source} on producer ${producer.name}`);
30
- const driver = yield DriverFactory_1.default.instantiateSource(source);
31
- return yield driver.ready({ producer, scope });
32
- });
33
- this.processHeader = (line, producer) => {
34
- const { settings: { fileType, hasHeaderRow, delimiter } } = producer;
35
- switch (fileType) {
36
- case 'PARQUET':
37
- case 'XML':
38
- case 'XLS':
39
- case 'XLSX':
40
- case 'CSV': {
41
- const parts = CSVParser_1.default.parseRow(line, delimiter);
42
- return parts;
43
- }
44
- case 'TXT': {
45
- if (hasHeaderRow) {
46
- const parts = CSVParser_1.default.parseRow(line, delimiter);
47
- return parts;
48
- }
49
- else {
50
- return producer.dimensions.map(x => { var _a; return (_a = x.alias) !== null && _a !== void 0 ? _a : x.name; });
51
- }
52
- }
53
- case 'JSON':
54
- case 'JSONL': {
55
- const keys = Object.keys(JSON.parse(line));
56
- return keys;
57
- }
58
- }
59
- };
60
- this.reconcileHeader = (header, producer) => {
61
- var _a;
62
- const myHeader = [...header];
63
- const producerDimensions = producer.dimensions;
64
- if (producerDimensions.some(x => x.sourceFilename === true))
65
- myHeader.push(...producerDimensions.filter(x => x.sourceFilename === true).map(x => x.name));
66
- const dimensions = [];
67
- for (const dimension of producerDimensions) {
68
- const key = (_a = dimension.alias) !== null && _a !== void 0 ? _a : dimension.name;
69
- const index = myHeader.findIndex(x => x === key);
70
- if (index < 0)
71
- throw new Error(`The dimension "${dimension.name}" (with key "${key}") of producer "${producer.name}" doesn't exist in the underlying dataset.`);
72
- dimensions.push({
73
- index,
74
- name: dimension.name,
75
- prodDimension: dimension
76
- });
77
- }
78
- return dimensions;
79
- };
80
- this.processLine = (options) => {
81
- var _a;
82
- const { line, dimensions, index, producer, tracker, chunk } = options;
83
- Affirm_1.default.hasValue(line, 'Invalid line');
84
- Affirm_1.default.hasValue(index, 'Invalid index');
85
- (0, Affirm_1.default)(producer, 'Invalid producer');
86
- if (!line)
87
- return null;
88
- // 1. map the underlying aliases to the new names AND cast to the correct type
89
- let counter = performance.now();
90
- const record = LineParser_1.default.parse(line.trim(), producer, dimensions, tracker);
91
- tracker.measure('process-line:line-parse', performance.now() - counter);
92
- counter = performance.now();
93
- for (const dimension of dimensions) {
94
- // 2. apply source file name
95
- if (dimension.prodDimension.sourceFilename === true)
96
- record[dimension.name] = path_1.default.basename(chunk.fileUri);
97
- // 3. mask
98
- const maskType = ProducerManager_1.default.getMask(dimension.prodDimension);
99
- if (Algo_1.default.hasVal(maskType))
100
- record[dimension.name] = CryptoEngine_1.default.hashValue(maskType, (_a = record[dimension.name]) === null || _a === void 0 ? void 0 : _a.toString(), dimension.prodDimension.type);
101
- }
102
- tracker.measure('process-line:dimensions-filename-mask', performance.now() - counter);
103
- return record;
104
- };
105
- }
106
- }
107
- const ProducerExecutor = new ProducerExecutorClass();
108
- exports.default = ProducerExecutor;
package/helper/Helper.js DELETED
@@ -1,149 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const fs = __importStar(require("fs"));
40
- const path = __importStar(require("path"));
41
- const uuid_1 = require("uuid");
42
- const ProcessENVManager_1 = __importDefault(require("../engines/ProcessENVManager"));
43
- const Helper = {
44
- isDev: () => ProcessENVManager_1.default.getEnvVariable('NODE_ENV') !== 'production',
45
- uuid: () => (0, uuid_1.v4)(),
46
- asError: (error) => error instanceof Error ? error : new Error(error),
47
- readFile: (directory) => {
48
- const functionFiles = [];
49
- function read(directory) {
50
- const files = fs.readdirSync(directory);
51
- files.forEach(filename => {
52
- const fullPath = path.join(directory, filename);
53
- if (fs.statSync(fullPath).isDirectory()) {
54
- read(fullPath);
55
- }
56
- else if (filename.endsWith('.json')) {
57
- functionFiles.push({
58
- name: path.parse(filename).name,
59
- relativePath: directory
60
- });
61
- }
62
- });
63
- }
64
- read(directory);
65
- return functionFiles;
66
- },
67
- formatDateToYYYYMM(date) {
68
- if (!date)
69
- return '';
70
- const year = date.getFullYear();
71
- const month = ('0' + (date.getMonth() + 1)).slice(-2);
72
- return `${year}-${month}`;
73
- },
74
- formatDuration: (milliseconds) => {
75
- if (!milliseconds || milliseconds < 0)
76
- return '0ms';
77
- if (milliseconds < 1000) {
78
- return `${Math.round(milliseconds)}ms`;
79
- }
80
- const seconds = milliseconds / 1000;
81
- if (seconds < 60) {
82
- return `${seconds.toFixed(1)}s`;
83
- }
84
- const minutes = Math.floor(seconds / 60);
85
- const remainingSeconds = seconds % 60;
86
- if (minutes < 60) {
87
- return `${minutes}m ${remainingSeconds.toFixed(1)}s`;
88
- }
89
- const hours = Math.floor(minutes / 60);
90
- const remainingMinutes = minutes % 60;
91
- return `${hours}h ${remainingMinutes}m`;
92
- },
93
- matchPattern: (pattern, items) => {
94
- let patternParts = [];
95
- let hasWildcard = false;
96
- let result = [...items];
97
- if (pattern) {
98
- if (pattern.includes('%')) {
99
- hasWildcard = true;
100
- const parts = pattern.split('%').filter(part => part.length > 0);
101
- // Store all non-empty parts for pattern matching
102
- patternParts = parts;
103
- }
104
- }
105
- // Apply additional filtering for patterns with wildcards
106
- if (hasWildcard && patternParts.length > 0) {
107
- result = result.filter(key => {
108
- // Create a function to check if the key matches the SQL-like pattern
109
- const matchesPattern = (fileName, pattern) => {
110
- if (!pattern.includes('%')) {
111
- return fileName === pattern;
112
- }
113
- const parts = pattern.split('%');
114
- let currentIndex = 0;
115
- for (let i = 0; i < parts.length; i++) {
116
- const part = parts[i];
117
- if (part === '')
118
- continue; // Skip empty parts from consecutive %% or leading/trailing %
119
- if (i === 0 && !pattern.startsWith('%')) {
120
- // First part must be at the beginning
121
- if (!fileName.startsWith(part)) {
122
- return false;
123
- }
124
- currentIndex = part.length;
125
- }
126
- else if (i === parts.length - 1 && !pattern.endsWith('%')) {
127
- // Last part must be at the end
128
- if (!fileName.endsWith(part)) {
129
- return false;
130
- }
131
- }
132
- else {
133
- // Middle parts must exist somewhere after the current position
134
- const foundIndex = fileName.indexOf(part, currentIndex);
135
- if (foundIndex === -1) {
136
- return false;
137
- }
138
- currentIndex = foundIndex + part.length;
139
- }
140
- }
141
- return true;
142
- };
143
- return matchesPattern(key, pattern);
144
- });
145
- }
146
- return result;
147
- }
148
- };
149
- exports.default = Helper;
package/helper/Logger.js DELETED
@@ -1,84 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const chalk_1 = __importDefault(require("chalk"));
7
- class Logger {
8
- constructor() {
9
- this.setLevel = (level) => this._level = level;
10
- this.log = (message, level) => {
11
- const myLevel = level !== null && level !== void 0 ? level : this._level;
12
- if (myLevel !== 'debug')
13
- return;
14
- console.log(chalk_1.default.cyanBright('DEBUG'), message);
15
- };
16
- this.info = (message) => {
17
- console.info(message);
18
- };
19
- this.error = (error) => {
20
- console.error(error);
21
- };
22
- this.formatObject = (obj, depth = 0) => {
23
- if (obj === null || obj === undefined)
24
- return chalk_1.default.gray(String(obj));
25
- if (typeof obj !== 'object')
26
- return String(obj);
27
- if (Array.isArray(obj))
28
- return this.formatList(obj);
29
- try {
30
- const keys = Object.keys(obj);
31
- if (keys.length === 0)
32
- return chalk_1.default.gray('{}');
33
- const indent = ' '.repeat(depth);
34
- // Calculate column widths
35
- const keyWidth = Math.max(...keys.map(key => key.length), 8) + 2;
36
- const valueWidth = 40;
37
- const rows = keys.map(key => {
38
- const value = obj[key];
39
- const formattedKey = chalk_1.default.yellow(key.padEnd(keyWidth));
40
- if (value === null || value === undefined) {
41
- const formattedValue = chalk_1.default.gray(String(value));
42
- return `${indent} ${formattedKey} : ${formattedValue}`;
43
- }
44
- if (typeof value === 'object' && !Array.isArray(value)) {
45
- const nestedObject = this.formatObject(value, depth + 1);
46
- const lines = nestedObject.split('\n');
47
- const firstLine = `${indent} ${formattedKey} : ${''.padEnd(valueWidth)}`;
48
- const nestedLines = lines.map(line => `${indent} ${''.padEnd(keyWidth)} : ${line.padEnd(valueWidth)}`);
49
- return [firstLine, ...nestedLines].join('\n');
50
- }
51
- if (Array.isArray(value)) {
52
- const arrayData = this.formatList(value);
53
- const nested = `${arrayData}`;
54
- return `${indent} ${formattedKey} : ${nested}`;
55
- }
56
- const formattedValue = String(value).padEnd(valueWidth);
57
- return `${indent} ${formattedKey} : ${formattedValue}`;
58
- });
59
- const result = rows.join('\n');
60
- return result;
61
- }
62
- catch (error) {
63
- return chalk_1.default.red('Error formatting object: ') + String(error) + '\n' + String(obj);
64
- }
65
- };
66
- this.formatList = (list) => {
67
- if (!Array.isArray(list)) {
68
- return chalk_1.default.yellow('Warning: formatList called with non-array') + '\n' + this.formatObject(list);
69
- }
70
- const header = chalk_1.default.blue(`Array (${list.length} items):`);
71
- if (list.length === 0)
72
- return header;
73
- const items = list.map((item, index) => {
74
- const formattedItem = this.formatObject(item);
75
- const indentedItem = formattedItem.split('\n').map(line => ' ' + line).join('\n');
76
- return chalk_1.default.cyan(` [${index}]:`) + '\n' + indentedItem;
77
- });
78
- return header + '\n' + items.join('\n');
79
- };
80
- this._level = 'prod';
81
- }
82
- }
83
- const logger = new Logger();
84
- exports.default = logger;
package/helper/Runtime.js DELETED
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_v8_1 = __importDefault(require("node:v8"));
7
- class RuntimeClass {
8
- constructor() {
9
- this.getHeap = () => {
10
- const { heap_size_limit, used_heap_size } = node_v8_1.default.getHeapStatistics();
11
- return {
12
- heapSizeMB: this._toMB(heap_size_limit),
13
- usedHeapMB: this._toMB(used_heap_size)
14
- };
15
- };
16
- this._toMB = (bytes) => Math.round(bytes / (1024 * 1024) * 100) / 100;
17
- }
18
- }
19
- const Runtime = new RuntimeClass();
20
- exports.default = Runtime;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const SETTINGS = {
4
- db: {
5
- name: 'remora-db',
6
- collections: {
7
- usage: 'usage',
8
- users: 'users',
9
- apiKeys: 'apiKeys'
10
- }
11
- }
12
- };
13
- exports.default = SETTINGS;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const crypto_1 = __importDefault(require("crypto"));
7
- const PUBLICK_KEY = `-----BEGIN PUBLIC KEY-----
8
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7BWugM83YKGzTyZ6kJyy
9
- M01JoGYBQYn/9H9utQQyC/uugV4g9d7vv87I2yUfqiHtx7BQj0mOGctqnK7vuRcg
10
- py7fghTjsUj0MDhs8cEpc+47m0xdsU9MQQ8Xze8B3FcdvCc4xtT5nruTAUWMGIAM
11
- WLHG8lWxkHjTSZn4S0RdpRBB7fw4jyVkc+vXCTtVtYQwMWjcErNFrdCenvci4Vus
12
- nKlyfKS6ccLQphOc/I2w6zllFwD/l90vQeQ6kDO01aJLOmJPzvlU/TSP/lcxCYTA
13
- TgQJQxd5UdnTSDjNw+Uu/jzZ5mVlCbtYH1RoJ6cGNglzN8Q50mVk/iVyoZCZ94b4
14
- bwIDAQAB
15
- -----END PUBLIC KEY-----`;
16
- class LicenceManagerClass {
17
- constructor() {
18
- this.generate = (customer, expirationDays, features, privateKey) => {
19
- const now = new Date();
20
- const expirationDate = new Date(now.getTime() + expirationDays * 24 * 60 * 60 * 1000);
21
- const licenceData = {
22
- customer,
23
- features,
24
- issued: now.toISOString(),
25
- expires: expirationDate.toISOString()
26
- };
27
- const licenceString = JSON.stringify(licenceData);
28
- const sign = crypto_1.default.createSign('SHA256');
29
- sign.update(licenceString);
30
- sign.end();
31
- const signature = sign.sign(privateKey, 'base64');
32
- const licence = { data: licenceData, signature };
33
- return Buffer.from(JSON.stringify(licence)).toString('base64');
34
- };
35
- this.validate = (licence) => {
36
- try {
37
- const licenceJSON = Buffer.from(licence, 'base64').toString();
38
- const licenceData = JSON.parse(licenceJSON);
39
- const { data, signature } = licenceData;
40
- const now = new Date();
41
- const expirationDate = new Date(data.expires);
42
- if (now > expirationDate)
43
- return { valid: false, reason: 'License expired', expiryDate: expirationDate };
44
- const verify = crypto_1.default.createVerify('SHA256');
45
- verify.update(JSON.stringify(data));
46
- const isSignatureValid = verify.verify(PUBLICK_KEY, signature, 'base64');
47
- if (!isSignatureValid)
48
- return { valid: false, reason: 'Invalid license signature' };
49
- return {
50
- valid: true,
51
- expiryDate: expirationDate,
52
- daysRemaining: Math.ceil((expirationDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000)),
53
- features: data.features,
54
- customer: data.customer
55
- };
56
- }
57
- catch (error) {
58
- return { valid: false, reason: 'License parsing error', details: error.message };
59
- }
60
- };
61
- }
62
- }
63
- const LicenceManager = new LicenceManagerClass();
64
- exports.default = LicenceManager;
package/settings.js DELETED
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.REMORA_WORKER_USER = void 0;
4
- exports.REMORA_WORKER_USER = {
5
- _id: '__remora_worker__',
6
- auth: { oid: '', provider: 'internal' },
7
- email: '',
8
- name: 'Remora Worker',
9
- roles: ['root'],
10
- _signature: '',
11
- lastLogin: new Date().toJSON()
12
- };