@rsdk/common 6.0.0-next.2 → 6.0.0-next.20

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 (38) hide show
  1. package/dist/convert/convert.class.d.ts +11 -0
  2. package/dist/convert/convert.class.js +18 -0
  3. package/dist/convert/convert.class.js.map +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/parsers/index.d.ts +1 -0
  8. package/dist/parsers/index.js +1 -0
  9. package/dist/parsers/index.js.map +1 -1
  10. package/dist/parsers/regex/index.d.ts +1 -0
  11. package/dist/parsers/regex/index.js +6 -0
  12. package/dist/parsers/regex/index.js.map +1 -0
  13. package/dist/parsers/regex/regex.parser.d.ts +15 -0
  14. package/dist/parsers/regex/regex.parser.js +26 -0
  15. package/dist/parsers/regex/regex.parser.js.map +1 -0
  16. package/dist/validation/index.d.ts +1 -0
  17. package/dist/{observable → validation}/index.js +1 -1
  18. package/dist/validation/index.js.map +1 -0
  19. package/dist/validation/typebox.validator.d.ts +26 -0
  20. package/dist/validation/typebox.validator.js +38 -0
  21. package/dist/validation/typebox.validator.js.map +1 -0
  22. package/package.json +9 -4
  23. package/src/convert/convert.class.ts +21 -0
  24. package/src/convert/convert.spec.ts +55 -0
  25. package/src/index.ts +1 -1
  26. package/src/parsers/index.ts +1 -0
  27. package/src/parsers/regex/index.ts +1 -0
  28. package/src/parsers/regex/regex.parser.spec.ts +5 -0
  29. package/src/parsers/regex/regex.parser.ts +25 -0
  30. package/src/validation/index.ts +1 -0
  31. package/src/validation/typebox.validator.ts +38 -0
  32. package/dist/observable/index.d.ts +0 -1
  33. package/dist/observable/index.js.map +0 -1
  34. package/dist/observable/observable-to-async-iterable.d.ts +0 -7
  35. package/dist/observable/observable-to-async-iterable.js +0 -107
  36. package/dist/observable/observable-to-async-iterable.js.map +0 -1
  37. package/src/observable/index.ts +0 -1
  38. package/src/observable/observable-to-async-iterable.ts +0 -115
@@ -52,9 +52,20 @@ export declare class Convert {
52
52
  * @memberof Convert
53
53
  */
54
54
  static enum<E>(value: unknown, e: EnumLike): E;
55
+ /**
56
+ * Converts unknown value to member of specified regexp or throws error.
57
+ *
58
+ * @static
59
+ * @param {*} value Unknown input value.
60
+ * @returns {E}
61
+ * @throws {Error} Throws if conversion is impossible.
62
+ * @memberof Convert
63
+ */
64
+ static regex(value: unknown): RegExp;
55
65
  private static numberError;
56
66
  private static intError;
57
67
  private static booleanError;
58
68
  private static wrapIfString;
59
69
  private static enumError;
70
+ private static regexError;
60
71
  }
@@ -116,6 +116,21 @@ class Convert {
116
116
  }
117
117
  return result;
118
118
  }
119
+ /**
120
+ * Converts unknown value to member of specified regexp or throws error.
121
+ *
122
+ * @static
123
+ * @param {*} value Unknown input value.
124
+ * @returns {E}
125
+ * @throws {Error} Throws if conversion is impossible.
126
+ * @memberof Convert
127
+ */
128
+ static regex(value) {
129
+ if (typeof value !== 'string' || value === '') {
130
+ throw this.regexError(value);
131
+ }
132
+ return new RegExp(value);
133
+ }
119
134
  static numberError(value) {
120
135
  return new Error(`Value <${value}> can't be converted to number.`);
121
136
  }
@@ -138,6 +153,9 @@ class Convert {
138
153
  .join(', ')}>
139
154
  `);
140
155
  }
156
+ static regexError(value) {
157
+ return new Error(`Value <${value}> can't be converted to regex.`);
158
+ }
141
159
  }
142
160
  exports.Convert = Convert;
143
161
  //# sourceMappingURL=convert.class.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert.class.js","sourceRoot":"","sources":["../../src/convert/convert.class.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.class.js","sourceRoot":"","sources":["../../src/convert/convert.class.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,5 +5,5 @@ export * from './time';
5
5
  export * from './functions';
6
6
  export * from './size';
7
7
  export * from './strings';
8
- export * from './observable';
9
8
  export * from './parsers';
9
+ export * from './validation';
package/dist/index.js CHANGED
@@ -21,6 +21,6 @@ __exportStar(require("./time"), exports);
21
21
  __exportStar(require("./functions"), exports);
22
22
  __exportStar(require("./size"), exports);
23
23
  __exportStar(require("./strings"), exports);
24
- __exportStar(require("./observable"), exports);
25
24
  __exportStar(require("./parsers"), exports);
25
+ __exportStar(require("./validation"), exports);
26
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,0CAAwB;AACxB,4CAA0B;AAC1B,yCAAuB;AACvB,8CAA4B;AAC5B,yCAAuB;AACvB,4CAA0B;AAC1B,+CAA6B;AAC7B,4CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,0CAAwB;AACxB,4CAA0B;AAC1B,yCAAuB;AACvB,8CAA4B;AAC5B,yCAAuB;AACvB,4CAA0B;AAC1B,4CAA0B;AAC1B,+CAA6B"}
@@ -8,4 +8,5 @@ export * from './timespan';
8
8
  export * from './url';
9
9
  export * from './array';
10
10
  export * from './json';
11
+ export * from './regex';
11
12
  export * from './parser.interface';
@@ -24,5 +24,6 @@ __exportStar(require("./timespan"), exports);
24
24
  __exportStar(require("./url"), exports);
25
25
  __exportStar(require("./array"), exports);
26
26
  __exportStar(require("./json"), exports);
27
+ __exportStar(require("./regex"), exports);
27
28
  __exportStar(require("./parser.interface"), exports);
28
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,yCAAuB;AACvB,wCAAsB;AACtB,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,6CAA2B;AAC3B,wCAAsB;AACtB,0CAAwB;AACxB,yCAAuB;AACvB,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,yCAAuB;AACvB,wCAAsB;AACtB,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,6CAA2B;AAC3B,wCAAsB;AACtB,0CAAwB;AACxB,yCAAuB;AACvB,0CAAwB;AACxB,qDAAmC"}
@@ -0,0 +1 @@
1
+ export { RegexParser } from './regex.parser';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RegexParser = void 0;
4
+ var regex_parser_1 = require("./regex.parser");
5
+ Object.defineProperty(exports, "RegexParser", { enumerable: true, get: function () { return regex_parser_1.RegexParser; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/regex/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,15 @@
1
+ import type { PropertyParser } from '../parser.interface';
2
+ /**
3
+ * Parser for RegExp patterns from environment variables.
4
+ * Supports both string patterns and full regex syntax with flags.
5
+ *
6
+ * Examples:
7
+ * - "SELECT 1" -> /SELECT 1/
8
+ * - "/^BEGIN/i" -> /^BEGIN/i
9
+ * - "/COMMIT$/m" -> /COMMIT$/m
10
+ */
11
+ export declare class RegexParser implements PropertyParser<RegExp> {
12
+ type(): string;
13
+ description(): string;
14
+ parse(value: unknown): RegExp;
15
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RegexParser = void 0;
4
+ const convert_1 = require("../../convert");
5
+ /**
6
+ * Parser for RegExp patterns from environment variables.
7
+ * Supports both string patterns and full regex syntax with flags.
8
+ *
9
+ * Examples:
10
+ * - "SELECT 1" -> /SELECT 1/
11
+ * - "/^BEGIN/i" -> /^BEGIN/i
12
+ * - "/COMMIT$/m" -> /COMMIT$/m
13
+ */
14
+ class RegexParser {
15
+ type() {
16
+ return 'regex';
17
+ }
18
+ description() {
19
+ return 'Extracts RegExp pattern. Use format "/pattern/flags" for regex with flags, or plain string for literal match.';
20
+ }
21
+ parse(value) {
22
+ return convert_1.Convert.regex(value);
23
+ }
24
+ }
25
+ exports.RegexParser = RegexParser;
26
+ //# sourceMappingURL=regex.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.parser.js","sourceRoot":"","sources":["../../../src/parsers/regex/regex.parser.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAGxC;;;;;;;;GAQG;AACH,MAAa,WAAW;IACtB,IAAI;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW;QACT,OAAO,+GAA+G,CAAC;IACzH,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,OAAO,iBAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAZD,kCAYC"}
@@ -0,0 +1 @@
1
+ export * from './typebox.validator';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./observable-to-async-iterable"), exports);
17
+ __exportStar(require("./typebox.validator"), exports);
18
18
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC"}
@@ -0,0 +1,26 @@
1
+ import type { TSchema } from '@sinclair/typebox';
2
+ import type { ValueError } from '@sinclair/typebox/compiler';
3
+ /**
4
+ * Wrapper around Typebox's type validation.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const validator = new Validator(t.Object({ name: t.String() }));
9
+ * const { isValid, errors } = validator.run({ name: 'John' });
10
+ * ...
11
+ * ```
12
+ */
13
+ export declare class TypeBoxValidator<T extends TSchema> {
14
+ private readonly validator;
15
+ constructor(schema: T);
16
+ /**
17
+ * Run the validator on the given data.
18
+ *
19
+ * @param data - The data to validate.
20
+ * @returns The validation result.
21
+ */
22
+ check(data: unknown): {
23
+ isValid: boolean;
24
+ errors: ValueError[];
25
+ };
26
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeBoxValidator = void 0;
4
+ const compiler_1 = require("@sinclair/typebox/compiler");
5
+ /**
6
+ * Wrapper around Typebox's type validation.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const validator = new Validator(t.Object({ name: t.String() }));
11
+ * const { isValid, errors } = validator.run({ name: 'John' });
12
+ * ...
13
+ * ```
14
+ */
15
+ class TypeBoxValidator {
16
+ validator;
17
+ constructor(schema) {
18
+ this.validator = compiler_1.TypeCompiler.Compile(schema);
19
+ }
20
+ /**
21
+ * Run the validator on the given data.
22
+ *
23
+ * @param data - The data to validate.
24
+ * @returns The validation result.
25
+ */
26
+ check(data) {
27
+ /**
28
+ * TODO: При случае, придумать, как нормально распечатывать ошибки для union'ов.
29
+ * Сейчас они ужасно неинформативные.
30
+ */
31
+ return {
32
+ isValid: this.validator.Check(data),
33
+ errors: [...this.validator.Errors(data)],
34
+ };
35
+ }
36
+ }
37
+ exports.TypeBoxValidator = TypeBoxValidator;
38
+ //# sourceMappingURL=typebox.validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typebox.validator.js","sourceRoot":"","sources":["../../src/validation/typebox.validator.ts"],"names":[],"mappings":";;;AAEA,yDAA0D;AAE1D;;;;;;;;;GASG;AACH,MAAa,gBAAgB;IACV,SAAS,CAAe;IAEzC,YAAY,MAAS;QACnB,IAAI,CAAC,SAAS,GAAG,uBAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAa;QACjB;;;WAGG;QACH,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACzC,CAAC;IACJ,CAAC;CACF;AAvBD,4CAuBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdk/common",
3
- "version": "6.0.0-next.2",
3
+ "version": "6.0.0-next.20",
4
4
  "description": "Useful common classes, functions and types",
5
5
  "license": "Apache License 2.0",
6
6
  "publishConfig": {
@@ -13,8 +13,13 @@
13
13
  "scripts": {
14
14
  "prepublishOnly": "npm run build"
15
15
  },
16
- "dependencies": {
17
- "rxjs": "^7.8.1"
16
+ "peerDependencies": {
17
+ "@sinclair/typebox": "^0.34.9"
18
18
  },
19
- "gitHead": "d051ee5232602e26554ea95e39df20c8f77a5ac3"
19
+ "peerDependenciesMeta": {
20
+ "@sinclair/typebox": {
21
+ "optional": true
22
+ }
23
+ },
24
+ "gitHead": "8967e1d9b691808f5e0b4c6d6dff0fefae3b2c32"
20
25
  }
@@ -140,6 +140,23 @@ export class Convert {
140
140
  return result as unknown as E;
141
141
  }
142
142
 
143
+ /**
144
+ * Converts unknown value to member of specified regexp or throws error.
145
+ *
146
+ * @static
147
+ * @param {*} value Unknown input value.
148
+ * @returns {E}
149
+ * @throws {Error} Throws if conversion is impossible.
150
+ * @memberof Convert
151
+ */
152
+ static regex(value: unknown): RegExp {
153
+ if (typeof value !== 'string' || value === '') {
154
+ throw this.regexError(value);
155
+ }
156
+
157
+ return new RegExp(value);
158
+ }
159
+
143
160
  private static numberError(value: unknown): Error {
144
161
  return new Error(`Value <${value}> can't be converted to number.`);
145
162
  }
@@ -168,4 +185,8 @@ export class Convert {
168
185
  .join(', ')}>
169
186
  `);
170
187
  }
188
+
189
+ private static regexError(value: unknown): Error {
190
+ return new Error(`Value <${value}> can't be converted to regex.`);
191
+ }
171
192
  }
@@ -684,4 +684,59 @@ describe('Convert', () => {
684
684
  });
685
685
  }
686
686
  });
687
+
688
+ describe('regex', () => {
689
+ it('should parse simple pattern', () => {
690
+ const result = Convert.regex('^SELECT 1$');
691
+
692
+ expect(result).toBeInstanceOf(RegExp);
693
+ expect(result.test('SELECT 1')).toBe(true);
694
+ expect(result.test('SELECT 2')).toBe(false);
695
+ });
696
+
697
+ it('should parse pattern with alternation for transaction queries', () => {
698
+ const result = Convert.regex(
699
+ '^(BEGIN|START TRANSACTION|COMMIT|ROLLBACK)$',
700
+ );
701
+
702
+ expect(result).toBeInstanceOf(RegExp);
703
+ expect(result.test('BEGIN')).toBe(true);
704
+ expect(result.test('START TRANSACTION')).toBe(true);
705
+ expect(result.test('COMMIT')).toBe(true);
706
+ expect(result.test('ROLLBACK')).toBe(true);
707
+ expect(result.test('SELECT 1')).toBe(false);
708
+ });
709
+
710
+ it('should parse pattern with prefix match for SAVEPOINT', () => {
711
+ const result = Convert.regex(String.raw`^SAVEPOINT\s+`);
712
+
713
+ expect(result).toBeInstanceOf(RegExp);
714
+ expect(result.test('SAVEPOINT typeorm_1')).toBe(true);
715
+ expect(result.test('SAVEPOINT my_savepoint')).toBe(true);
716
+ expect(result.test('ROLLBACK TO SAVEPOINT')).toBe(false);
717
+ });
718
+
719
+ it('should parse combined pattern for low-level queries', () => {
720
+ const result = Convert.regex(
721
+ String.raw`^(SELECT 1|BEGIN|COMMIT|START TRANSACTION|SAVEPOINT\s+\w+)$`,
722
+ );
723
+
724
+ expect(result).toBeInstanceOf(RegExp);
725
+ expect(result.test('SELECT 1')).toBe(true);
726
+ expect(result.test('BEGIN')).toBe(true);
727
+ expect(result.test('COMMIT')).toBe(true);
728
+ expect(result.test('START TRANSACTION')).toBe(true);
729
+ expect(result.test('SAVEPOINT sp_1')).toBe(true);
730
+ });
731
+
732
+ it('should throw error for non-string input', () => {
733
+ expect(() => Convert.regex(123)).toThrow();
734
+ expect(() => Convert.regex(null)).toThrow();
735
+ expect(() => Convert.regex(undefined as unknown)).toThrow();
736
+ });
737
+
738
+ it('should throw error for empty string', () => {
739
+ expect(() => Convert.regex('')).toThrow();
740
+ });
741
+ });
687
742
  });
package/src/index.ts CHANGED
@@ -5,5 +5,5 @@ export * from './time';
5
5
  export * from './functions';
6
6
  export * from './size';
7
7
  export * from './strings';
8
- export * from './observable';
9
8
  export * from './parsers';
9
+ export * from './validation';
@@ -8,4 +8,5 @@ export * from './timespan';
8
8
  export * from './url';
9
9
  export * from './array';
10
10
  export * from './json';
11
+ export * from './regex';
11
12
  export * from './parser.interface';
@@ -0,0 +1 @@
1
+ export { RegexParser } from './regex.parser';
@@ -0,0 +1,5 @@
1
+ describe('RegexParser', () => {
2
+ /* eslint-disable @typescript-eslint/no-empty-function */
3
+ it('See tests for Convert.regex() in @rsdk/common', () =>
4
+ expect(true).toBe(true));
5
+ });
@@ -0,0 +1,25 @@
1
+ import { Convert } from '../../convert';
2
+ import type { PropertyParser } from '../parser.interface';
3
+
4
+ /**
5
+ * Parser for RegExp patterns from environment variables.
6
+ * Supports both string patterns and full regex syntax with flags.
7
+ *
8
+ * Examples:
9
+ * - "SELECT 1" -> /SELECT 1/
10
+ * - "/^BEGIN/i" -> /^BEGIN/i
11
+ * - "/COMMIT$/m" -> /COMMIT$/m
12
+ */
13
+ export class RegexParser implements PropertyParser<RegExp> {
14
+ type(): string {
15
+ return 'regex';
16
+ }
17
+
18
+ description(): string {
19
+ return 'Extracts RegExp pattern. Use format "/pattern/flags" for regex with flags, or plain string for literal match.';
20
+ }
21
+
22
+ parse(value: unknown): RegExp {
23
+ return Convert.regex(value);
24
+ }
25
+ }
@@ -0,0 +1 @@
1
+ export * from './typebox.validator';
@@ -0,0 +1,38 @@
1
+ import type { TSchema } from '@sinclair/typebox';
2
+ import type { TypeCheck, ValueError } from '@sinclair/typebox/compiler';
3
+ import { TypeCompiler } from '@sinclair/typebox/compiler';
4
+
5
+ /**
6
+ * Wrapper around Typebox's type validation.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const validator = new Validator(t.Object({ name: t.String() }));
11
+ * const { isValid, errors } = validator.run({ name: 'John' });
12
+ * ...
13
+ * ```
14
+ */
15
+ export class TypeBoxValidator<T extends TSchema> {
16
+ private readonly validator: TypeCheck<T>;
17
+
18
+ constructor(schema: T) {
19
+ this.validator = TypeCompiler.Compile(schema);
20
+ }
21
+
22
+ /**
23
+ * Run the validator on the given data.
24
+ *
25
+ * @param data - The data to validate.
26
+ * @returns The validation result.
27
+ */
28
+ check(data: unknown): { isValid: boolean; errors: ValueError[] } {
29
+ /**
30
+ * TODO: При случае, придумать, как нормально распечатывать ошибки для union'ов.
31
+ * Сейчас они ужасно неинформативные.
32
+ */
33
+ return {
34
+ isValid: this.validator.Check(data),
35
+ errors: [...this.validator.Errors(data)],
36
+ };
37
+ }
38
+ }
@@ -1 +0,0 @@
1
- export * from './observable-to-async-iterable';
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observable/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C"}
@@ -1,7 +0,0 @@
1
- import type { Observable } from 'rxjs';
2
- export type Callback = (value?: any) => any;
3
- /**
4
- * Утилита для создания асинк итератора из обзервабл
5
- * поиском "observableToAsyncIterable" можно найти тесты в которых есть пример использования
6
- */
7
- export declare function observableToAsyncIterable<T>(observable: Observable<T>): AsyncIterableIterator<T>;
@@ -1,107 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.observableToAsyncIterable = observableToAsyncIterable;
4
- /**
5
- * Утилита для создания асинк итератора из обзервабл
6
- * поиском "observableToAsyncIterable" можно найти тесты в которых есть пример использования
7
- */
8
- function observableToAsyncIterable(observable) {
9
- const pullQueue = [];
10
- const pushQueue = [];
11
- let listening = true;
12
- const pushValue = (value) => {
13
- if (pullQueue.length > 0) {
14
- // It is safe to use the ! operator here as we check the length.
15
- pullQueue.shift()({
16
- value,
17
- done: false,
18
- });
19
- }
20
- else {
21
- pushQueue.push({
22
- value,
23
- done: false,
24
- });
25
- }
26
- };
27
- const pushError = (error) => {
28
- if (pullQueue.length > 0) {
29
- // It is safe to use the ! operator here as we check the length.
30
- pullQueue.shift()({
31
- value: { errors: [error] },
32
- done: false,
33
- });
34
- }
35
- else {
36
- pushQueue.push({
37
- value: { errors: [error] },
38
- done: false,
39
- });
40
- }
41
- };
42
- const pushDone = () => {
43
- if (pullQueue.length > 0) {
44
- // It is safe to use the ! operator here as we check the length.
45
- pullQueue.shift()({ done: true });
46
- }
47
- else {
48
- pushQueue.push({ done: true });
49
- }
50
- };
51
- const pullValue = () => new Promise((resolve) => {
52
- if (pushQueue.length > 0) {
53
- const element = pushQueue.shift();
54
- // either {value: {errors: [...]}} or {value: ...}
55
- resolve(element);
56
- }
57
- else {
58
- pullQueue.push(resolve);
59
- }
60
- });
61
- const subscription = observable.subscribe({
62
- next(value) {
63
- pushValue(value);
64
- },
65
- error(err) {
66
- pushError(err);
67
- },
68
- complete() {
69
- pushDone();
70
- },
71
- });
72
- const emptyQueue = () => {
73
- if (listening) {
74
- listening = false;
75
- subscription.unsubscribe();
76
- for (const resolve of pullQueue) {
77
- resolve({
78
- value: undefined,
79
- done: true,
80
- });
81
- }
82
- pullQueue.length = 0;
83
- pushQueue.length = 0;
84
- }
85
- };
86
- return {
87
- next() {
88
- // return is a defined method, so it is safe to call it.
89
- return listening ? pullValue() : this.return();
90
- },
91
- return() {
92
- emptyQueue();
93
- return Promise.resolve({
94
- value: undefined,
95
- done: true,
96
- });
97
- },
98
- throw(error) {
99
- emptyQueue();
100
- return Promise.reject(error);
101
- },
102
- [Symbol.asyncIterator]() {
103
- return this;
104
- },
105
- };
106
- }
107
- //# sourceMappingURL=observable-to-async-iterable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observable-to-async-iterable.js","sourceRoot":"","sources":["../../src/observable/observable-to-async-iterable.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export * from './observable-to-async-iterable';
@@ -1,115 +0,0 @@
1
- import type { Observable } from 'rxjs';
2
-
3
- export type Callback = (value?: any) => any;
4
-
5
- /**
6
- * Утилита для создания асинк итератора из обзервабл
7
- * поиском "observableToAsyncIterable" можно найти тесты в которых есть пример использования
8
- */
9
- export function observableToAsyncIterable<T>(
10
- observable: Observable<T>,
11
- ): AsyncIterableIterator<T> {
12
- const pullQueue: Array<Callback> = [];
13
- const pushQueue: Array<any> = [];
14
-
15
- let listening = true;
16
-
17
- const pushValue = (value: any): void => {
18
- if (pullQueue.length > 0) {
19
- // It is safe to use the ! operator here as we check the length.
20
- pullQueue.shift()!({
21
- value,
22
- done: false,
23
- });
24
- } else {
25
- pushQueue.push({
26
- value,
27
- done: false,
28
- });
29
- }
30
- };
31
-
32
- const pushError = (error: any): void => {
33
- if (pullQueue.length > 0) {
34
- // It is safe to use the ! operator here as we check the length.
35
- pullQueue.shift()!({
36
- value: { errors: [error] },
37
- done: false,
38
- });
39
- } else {
40
- pushQueue.push({
41
- value: { errors: [error] },
42
- done: false,
43
- });
44
- }
45
- };
46
-
47
- const pushDone = (): void => {
48
- if (pullQueue.length > 0) {
49
- // It is safe to use the ! operator here as we check the length.
50
- pullQueue.shift()!({ done: true });
51
- } else {
52
- pushQueue.push({ done: true });
53
- }
54
- };
55
-
56
- const pullValue = (): Promise<IteratorResult<T>> =>
57
- new Promise<IteratorResult<T>>((resolve) => {
58
- if (pushQueue.length > 0) {
59
- const element = pushQueue.shift();
60
-
61
- // either {value: {errors: [...]}} or {value: ...}
62
- resolve(element);
63
- } else {
64
- pullQueue.push(resolve);
65
- }
66
- });
67
-
68
- const subscription = observable.subscribe({
69
- next(value: any) {
70
- pushValue(value);
71
- },
72
- error(err: Error) {
73
- pushError(err);
74
- },
75
- complete() {
76
- pushDone();
77
- },
78
- });
79
-
80
- const emptyQueue = (): void => {
81
- if (listening) {
82
- listening = false;
83
- subscription.unsubscribe();
84
- for (const resolve of pullQueue) {
85
- resolve({
86
- value: undefined,
87
- done: true,
88
- });
89
- }
90
- pullQueue.length = 0;
91
- pushQueue.length = 0;
92
- }
93
- };
94
-
95
- return {
96
- next(): Promise<IteratorResult<T>> {
97
- // return is a defined method, so it is safe to call it.
98
- return listening ? pullValue() : this.return!();
99
- },
100
- return(): Promise<IteratorResult<T>> {
101
- emptyQueue();
102
- return Promise.resolve({
103
- value: undefined,
104
- done: true,
105
- });
106
- },
107
- throw(error): Promise<IteratorResult<T>> {
108
- emptyQueue();
109
- return Promise.reject(error);
110
- },
111
- [Symbol.asyncIterator](): AsyncIterableIterator<T> {
112
- return this;
113
- },
114
- };
115
- }