@naturalcycles/nodejs-lib 13.18.0 → 13.20.0

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/dist/index.d.ts CHANGED
@@ -37,6 +37,7 @@ export * from './stream/progressLogger';
37
37
  export * from './stream/transform/transformChunk';
38
38
  export * from './stream/transform/transformFilter';
39
39
  export * from './stream/transform/transformLimit';
40
+ export * from './stream/transform/transformOffset';
40
41
  export * from './stream/transform/transformLogProgress';
41
42
  export * from './stream/transform/transformMap';
42
43
  export * from './stream/transform/transformMapSimple';
package/dist/index.js CHANGED
@@ -41,6 +41,7 @@ tslib_1.__exportStar(require("./stream/progressLogger"), exports);
41
41
  tslib_1.__exportStar(require("./stream/transform/transformChunk"), exports);
42
42
  tslib_1.__exportStar(require("./stream/transform/transformFilter"), exports);
43
43
  tslib_1.__exportStar(require("./stream/transform/transformLimit"), exports);
44
+ tslib_1.__exportStar(require("./stream/transform/transformOffset"), exports);
44
45
  tslib_1.__exportStar(require("./stream/transform/transformLogProgress"), exports);
45
46
  tslib_1.__exportStar(require("./stream/transform/transformMap"), exports);
46
47
  tslib_1.__exportStar(require("./stream/transform/transformMapSimple"), exports);
@@ -34,7 +34,4 @@ export interface TransformLimitOptions extends TransformOptions {
34
34
  */
35
35
  export declare class TransformLimit extends AbortableTransform {
36
36
  }
37
- /**
38
- * 0 or falsy value means "no limit"
39
- */
40
- export declare function transformLimit<IN>(opt?: TransformLimitOptions): TransformTyped<IN, IN>;
37
+ export declare function transformLimit<IN>(opt: TransformLimitOptions): TransformTyped<IN, IN>;
@@ -10,10 +10,7 @@ const stream_util_1 = require("../stream.util");
10
10
  class TransformLimit extends index_1.AbortableTransform {
11
11
  }
12
12
  exports.TransformLimit = TransformLimit;
13
- /**
14
- * 0 or falsy value means "no limit"
15
- */
16
- function transformLimit(opt = {}) {
13
+ function transformLimit(opt) {
17
14
  const { logger = console, limit, debug } = opt;
18
15
  if (!limit) {
19
16
  // No limit - returning pass-through transform
@@ -18,7 +18,10 @@ export interface TransformMapOptions<IN = any, OUT = IN> {
18
18
  /**
19
19
  * Number of concurrently pending promises returned by `mapper`.
20
20
  *
21
- * @default 16 (to match default highWatermark option for objectMode streams)
21
+ * Default is 32.
22
+ * It was recently changed up from 16, after some testing that shown that
23
+ * for simple low-cpu mapper functions 32 produces almost 2x throughput.
24
+ * For example, in scenarios like streaming a query from Datastore.
22
25
  */
23
26
  concurrency?: number;
24
27
  /**
@@ -83,7 +86,7 @@ export interface TransformMapStatsSummary extends TransformMapStats {
83
86
  *
84
87
  * Only works in objectMode (due to through2Concurrent).
85
88
  *
86
- * Concurrency defaults to 16.
89
+ * Concurrency defaults to 32.
87
90
  *
88
91
  * If an Array is returned by `mapper` - it will be flattened and multiple results will be emitted from it. Tested by Array.isArray().
89
92
  */
@@ -15,12 +15,12 @@ const stream_util_1 = require("../stream.util");
15
15
  *
16
16
  * Only works in objectMode (due to through2Concurrent).
17
17
  *
18
- * Concurrency defaults to 16.
18
+ * Concurrency defaults to 32.
19
19
  *
20
20
  * If an Array is returned by `mapper` - it will be flattened and multiple results will be emitted from it. Tested by Array.isArray().
21
21
  */
22
22
  function transformMap(mapper, opt = {}) {
23
- const { concurrency = 16, predicate, // we now default to "no predicate" (meaning pass-everything)
23
+ const { concurrency = 32, predicate, // we now default to "no predicate" (meaning pass-everything)
24
24
  errorMode = js_lib_1.ErrorMode.THROW_IMMEDIATELY, flattenArrayOutput, onError, onDone, metric = 'stream', logger = console, } = opt;
25
25
  const started = Date.now();
26
26
  let index = -1;
@@ -0,0 +1,10 @@
1
+ import { TransformOptions, TransformTyped } from '../stream.model';
2
+ export interface TransformOffsetOptions extends TransformOptions {
3
+ /**
4
+ * How many items to skip (offset) in the stream.
5
+ *
6
+ * Nullish value (e.g 0 or undefined) would mean "no offset".
7
+ */
8
+ offset?: number;
9
+ }
10
+ export declare function transformOffset<IN>(opt: TransformOffsetOptions): TransformTyped<IN, IN>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformOffset = void 0;
4
+ const node_stream_1 = require("node:stream");
5
+ const index_1 = require("../../index");
6
+ function transformOffset(opt) {
7
+ const { offset } = opt;
8
+ if (!offset) {
9
+ // No offset - returning pass-through transform
10
+ return (0, index_1.transformNoOp)();
11
+ }
12
+ let i = 0; // so we start first chunk with 1
13
+ return new node_stream_1.Transform({
14
+ objectMode: true,
15
+ ...opt,
16
+ transform(chunk, _, cb) {
17
+ if (++i <= offset) {
18
+ return cb(); // skip
19
+ }
20
+ cb(null, chunk);
21
+ },
22
+ });
23
+ }
24
+ exports.transformOffset = transformOffset;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturalcycles/nodejs-lib",
3
- "version": "13.18.0",
3
+ "version": "13.20.0",
4
4
  "scripts": {
5
5
  "prepare": "husky",
6
6
  "docs-serve": "vuepress dev docs",
package/src/index.ts CHANGED
@@ -47,6 +47,7 @@ export * from './stream/progressLogger'
47
47
  export * from './stream/transform/transformChunk'
48
48
  export * from './stream/transform/transformFilter'
49
49
  export * from './stream/transform/transformLimit'
50
+ export * from './stream/transform/transformOffset'
50
51
  export * from './stream/transform/transformLogProgress'
51
52
  export * from './stream/transform/transformMap'
52
53
  export * from './stream/transform/transformMapSimple'
@@ -40,10 +40,7 @@ export interface TransformLimitOptions extends TransformOptions {
40
40
  */
41
41
  export class TransformLimit extends AbortableTransform {}
42
42
 
43
- /**
44
- * 0 or falsy value means "no limit"
45
- */
46
- export function transformLimit<IN>(opt: TransformLimitOptions = {}): TransformTyped<IN, IN> {
43
+ export function transformLimit<IN>(opt: TransformLimitOptions): TransformTyped<IN, IN> {
47
44
  const { logger = console, limit, debug } = opt
48
45
 
49
46
  if (!limit) {
@@ -40,7 +40,10 @@ export interface TransformMapOptions<IN = any, OUT = IN> {
40
40
  /**
41
41
  * Number of concurrently pending promises returned by `mapper`.
42
42
  *
43
- * @default 16 (to match default highWatermark option for objectMode streams)
43
+ * Default is 32.
44
+ * It was recently changed up from 16, after some testing that shown that
45
+ * for simple low-cpu mapper functions 32 produces almost 2x throughput.
46
+ * For example, in scenarios like streaming a query from Datastore.
44
47
  */
45
48
  concurrency?: number
46
49
 
@@ -117,7 +120,7 @@ export interface TransformMapStatsSummary extends TransformMapStats {
117
120
  *
118
121
  * Only works in objectMode (due to through2Concurrent).
119
122
  *
120
- * Concurrency defaults to 16.
123
+ * Concurrency defaults to 32.
121
124
  *
122
125
  * If an Array is returned by `mapper` - it will be flattened and multiple results will be emitted from it. Tested by Array.isArray().
123
126
  */
@@ -126,7 +129,7 @@ export function transformMap<IN = any, OUT = IN>(
126
129
  opt: TransformMapOptions<IN, OUT> = {},
127
130
  ): TransformTyped<IN, OUT> {
128
131
  const {
129
- concurrency = 16,
132
+ concurrency = 32,
130
133
  predicate, // we now default to "no predicate" (meaning pass-everything)
131
134
  errorMode = ErrorMode.THROW_IMMEDIATELY,
132
135
  flattenArrayOutput,
@@ -0,0 +1,34 @@
1
+ import { Transform } from 'node:stream'
2
+ import { transformNoOp } from '../../index'
3
+ import { TransformOptions, TransformTyped } from '../stream.model'
4
+
5
+ export interface TransformOffsetOptions extends TransformOptions {
6
+ /**
7
+ * How many items to skip (offset) in the stream.
8
+ *
9
+ * Nullish value (e.g 0 or undefined) would mean "no offset".
10
+ */
11
+ offset?: number
12
+ }
13
+
14
+ export function transformOffset<IN>(opt: TransformOffsetOptions): TransformTyped<IN, IN> {
15
+ const { offset } = opt
16
+
17
+ if (!offset) {
18
+ // No offset - returning pass-through transform
19
+ return transformNoOp()
20
+ }
21
+
22
+ let i = 0 // so we start first chunk with 1
23
+ return new Transform({
24
+ objectMode: true,
25
+ ...opt,
26
+ transform(chunk: IN, _, cb) {
27
+ if (++i <= offset) {
28
+ return cb() // skip
29
+ }
30
+
31
+ cb(null, chunk)
32
+ },
33
+ })
34
+ }