faros-airbyte-common 0.12.0 → 0.12.2
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/common/bucket-set.d.ts +6 -0
- package/lib/common/bucket-set.js +71 -0
- package/lib/common/bucket-set.js.map +1 -0
- package/lib/common/bucketing.d.ts +2 -1
- package/lib/common/bucketing.js +17 -1
- package/lib/common/bucketing.js.map +1 -1
- package/lib/common/index.d.ts +1 -1
- package/lib/common/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
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
|
+
exports.BucketSet = void 0;
|
|
7
|
+
const verror_1 = __importDefault(require("verror"));
|
|
8
|
+
class BucketSet {
|
|
9
|
+
constructor(bucketTotal, bucketRanges) {
|
|
10
|
+
if (bucketTotal < 1) {
|
|
11
|
+
throw new verror_1.default('bucket_total must be a positive integer');
|
|
12
|
+
}
|
|
13
|
+
const rangeStrings = (typeof bucketRanges === 'string' ? bucketRanges.split(',') : bucketRanges).filter((s) => s.trim());
|
|
14
|
+
if (!(rangeStrings === null || rangeStrings === void 0 ? void 0 : rangeStrings.length)) {
|
|
15
|
+
throw new verror_1.default('bucket_ranges cannot be empty');
|
|
16
|
+
}
|
|
17
|
+
const buckets = new Set();
|
|
18
|
+
for (const range of rangeStrings) {
|
|
19
|
+
const [start, end] = this.parseRange(range);
|
|
20
|
+
if (start < 1 || end > bucketTotal) {
|
|
21
|
+
throw new verror_1.default(`Invalid bucket range ${range}: values must be between 1 and ${bucketTotal}`);
|
|
22
|
+
}
|
|
23
|
+
for (let i = start; i <= end; i++) {
|
|
24
|
+
buckets.add(i);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
this.sortedBuckets = Array.from(buckets).sort((a, b) => a - b);
|
|
28
|
+
}
|
|
29
|
+
parseRange(range) {
|
|
30
|
+
const parts = range.split('-').map((p) => p.trim());
|
|
31
|
+
if (parts.length > 2) {
|
|
32
|
+
throw new verror_1.default(`Invalid range format: ${range}. Valid formats are: single number (e.g., '7') or number range (e.g., '3-5')`);
|
|
33
|
+
}
|
|
34
|
+
const start = parseInt(parts[0]);
|
|
35
|
+
if (isNaN(start)) {
|
|
36
|
+
throw new verror_1.default(`Invalid number in range: ${parts[0]}`);
|
|
37
|
+
}
|
|
38
|
+
// If it's a single number, both start and end are the same
|
|
39
|
+
if (parts.length === 1) {
|
|
40
|
+
return [start, start];
|
|
41
|
+
}
|
|
42
|
+
const end = parseInt(parts[1]);
|
|
43
|
+
if (isNaN(end)) {
|
|
44
|
+
throw new verror_1.default(`Invalid number in range: ${parts[1]}`);
|
|
45
|
+
}
|
|
46
|
+
if (end < start) {
|
|
47
|
+
throw new verror_1.default(`Invalid range ${range}: end cannot be less than start`);
|
|
48
|
+
}
|
|
49
|
+
return [start, end];
|
|
50
|
+
}
|
|
51
|
+
next(bucketId) {
|
|
52
|
+
let low = 0;
|
|
53
|
+
let high = this.sortedBuckets.length - 1;
|
|
54
|
+
while (low <= high) {
|
|
55
|
+
const mid = Math.floor((low + high) / 2);
|
|
56
|
+
if (this.sortedBuckets[mid] <= bucketId) {
|
|
57
|
+
low = mid + 1;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
high = mid - 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (low < this.sortedBuckets.length) {
|
|
64
|
+
return this.sortedBuckets[low];
|
|
65
|
+
}
|
|
66
|
+
// Wrap around to first bucket if no larger bucket found
|
|
67
|
+
return this.sortedBuckets[0];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.BucketSet = BucketSet;
|
|
71
|
+
//# sourceMappingURL=bucket-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-set.js","sourceRoot":"","sources":["../../src/common/bucket-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,11 +7,12 @@ export interface BucketExecutionState {
|
|
|
7
7
|
export interface RoundRobinConfig {
|
|
8
8
|
round_robin_bucket_execution?: boolean;
|
|
9
9
|
bucket_id?: number;
|
|
10
|
+
bucket_ranges?: string | ReadonlyArray<string>;
|
|
10
11
|
bucket_total?: number;
|
|
11
12
|
[key: string]: any;
|
|
12
13
|
}
|
|
13
14
|
export declare function bucket(key: string, data: string, bucketTotal: number): number;
|
|
14
|
-
export declare function validateBucketingConfig(
|
|
15
|
+
export declare function validateBucketingConfig(config: RoundRobinConfig, logger?: (message: string) => void): void;
|
|
15
16
|
export declare function nextBucketId(config: RoundRobinConfig, state?: BucketExecutionState): number;
|
|
16
17
|
export declare function applyRoundRobinBucketing(config: RoundRobinConfig, state?: BucketExecutionState, logger?: (message: string) => void): {
|
|
17
18
|
config: RoundRobinConfig;
|
package/lib/common/bucketing.js
CHANGED
|
@@ -9,24 +9,40 @@ exports.nextBucketId = nextBucketId;
|
|
|
9
9
|
exports.applyRoundRobinBucketing = applyRoundRobinBucketing;
|
|
10
10
|
const crypto_1 = require("crypto");
|
|
11
11
|
const verror_1 = __importDefault(require("verror"));
|
|
12
|
+
const bucket_set_1 = require("./bucket-set");
|
|
12
13
|
function bucket(key, data, bucketTotal) {
|
|
13
14
|
const md5 = (0, crypto_1.createHmac)('md5', key);
|
|
14
15
|
md5.update(data);
|
|
15
16
|
const hex = md5.digest('hex').substring(0, 8);
|
|
16
17
|
return (parseInt(hex, 16) % bucketTotal) + 1; // 1-index for readability
|
|
17
18
|
}
|
|
18
|
-
function validateBucketingConfig(
|
|
19
|
+
function validateBucketingConfig(config, logger) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
const bucketTotal = (_a = config.bucket_total) !== null && _a !== void 0 ? _a : 1;
|
|
22
|
+
const bucketId = (_b = config.bucket_id) !== null && _b !== void 0 ? _b : 1;
|
|
19
23
|
if (bucketTotal < 1) {
|
|
20
24
|
throw new verror_1.default('bucket_total must be a positive integer');
|
|
21
25
|
}
|
|
22
26
|
if (bucketId < 1 || bucketId > bucketTotal) {
|
|
23
27
|
throw new verror_1.default(`bucket_id must be between 1 and ${bucketTotal}`);
|
|
24
28
|
}
|
|
29
|
+
if (config.bucket_ranges) {
|
|
30
|
+
if (!config.round_robin_bucket_execution) {
|
|
31
|
+
logger === null || logger === void 0 ? void 0 : logger(`bucket_ranges ${config.bucket_ranges} ignored because round_robin_bucket_execution is not enabled`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
new bucket_set_1.BucketSet(bucketTotal, config.bucket_ranges);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
25
37
|
}
|
|
26
38
|
function nextBucketId(config, state) {
|
|
27
39
|
var _a, _b, _c;
|
|
28
40
|
const bucketTotal = (_a = config.bucket_total) !== null && _a !== void 0 ? _a : 1;
|
|
29
41
|
const lastExecutedBucketId = (_c = (_b = state === null || state === void 0 ? void 0 : state.__bucket_execution_state) === null || _b === void 0 ? void 0 : _b.last_executed_bucket_id) !== null && _c !== void 0 ? _c : bucketTotal;
|
|
42
|
+
if (config.round_robin_bucket_execution && config.bucket_ranges) {
|
|
43
|
+
const bucketSet = new bucket_set_1.BucketSet(bucketTotal, config.bucket_ranges);
|
|
44
|
+
return bucketSet.next(lastExecutedBucketId);
|
|
45
|
+
}
|
|
30
46
|
return (lastExecutedBucketId % bucketTotal) + 1;
|
|
31
47
|
}
|
|
32
48
|
function applyRoundRobinBucketing(config, state, logger) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucketing.js","sourceRoot":"","sources":["../../src/common/bucketing.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"bucketing.js","sourceRoot":"","sources":["../../src/common/bucketing.ts"],"names":[],"mappings":";;;;;AAoBA,wBAKC;AAED,0DAuBC;AAED,oCAcC;AAED,4DAwBC;AA5FD,mCAAkC;AAClC,oDAA4B;AAE5B,6CAAuC;AAiBvC,SAAgB,MAAM,CAAC,GAAW,EAAE,IAAY,EAAE,WAAmB;IACnE,MAAM,GAAG,GAAG,IAAA,mBAAU,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B;AAC1E,CAAC;AAED,SAAgB,uBAAuB,CACrC,MAAwB,EACxB,MAAkC;;IAElC,MAAM,WAAW,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAA,MAAM,CAAC,SAAS,mCAAI,CAAC,CAAC;IAEvC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,gBAAM,CAAC,yCAAyC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,gBAAM,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;YACzC,MAAM,aAAN,MAAM,uBAAN,MAAM,CACJ,iBAAiB,MAAM,CAAC,aAAa,8DAA8D,CACpG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,sBAAS,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAC1B,MAAwB,EACxB,KAA4B;;IAE5B,MAAM,WAAW,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,CAAC,CAAC;IAC7C,MAAM,oBAAoB,GACxB,MAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,wBAAwB,0CAAE,uBAAuB,mCAAI,WAAW,CAAC;IAE1E,IAAI,MAAM,CAAC,4BAA4B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACnE,OAAO,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,oBAAoB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,wBAAwB,CACtC,MAAwB,EACxB,KAA4B,EAC5B,MAAkC;IAElC,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;QACzC,OAAO,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,kDAAkD,IAAI,EAAE,CAAC,CAAC;IAEnE,OAAO;QACL,MAAM,EAAE;YACN,GAAG,MAAM;YACT,SAAS,EAAE,IAAI;SAChB;QACD,KAAK,EAAE;YACL,GAAG,KAAK;YACR,wBAAwB,EAAE;gBACxB,uBAAuB,EAAE,IAAI;aAC9B;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/lib/common/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FarosClient } from 'faros-js-client';
|
|
2
|
-
export { bucket, validateBucketingConfig, nextBucketId, applyRoundRobinBucketing, } from './bucketing';
|
|
2
|
+
export { bucket, validateBucketingConfig, nextBucketId, applyRoundRobinBucketing, RoundRobinConfig, } from './bucketing';
|
|
3
3
|
export interface FileDiff {
|
|
4
4
|
deletions: number;
|
|
5
5
|
additions: number;
|
package/lib/common/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"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"}
|