@naturalcycles/nodejs-lib 12.59.0 → 12.62.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 (50) hide show
  1. package/dist/got/getGot.js +98 -28
  2. package/dist/got/got.model.d.ts +6 -0
  3. package/dist/index.d.ts +19 -19
  4. package/dist/index.js +19 -39
  5. package/dist/stream/ndjson/transformJsonParse.js +3 -3
  6. package/dist/stream/ndjson/transformToNDJson.js +2 -2
  7. package/dist/stream/sizeStack.d.ts +9 -0
  8. package/dist/stream/sizeStack.js +48 -0
  9. package/dist/stream/transform/transformBuffer.js +1 -1
  10. package/dist/stream/transform/transformFilter.d.ts +3 -4
  11. package/dist/stream/transform/transformFilter.js +5 -20
  12. package/dist/stream/transform/transformLogProgress.d.ts +20 -0
  13. package/dist/stream/transform/transformLogProgress.js +36 -18
  14. package/dist/stream/transform/transformMap.d.ts +2 -4
  15. package/dist/stream/transform/transformMap.js +6 -11
  16. package/dist/stream/transform/transformMapSimple.js +1 -1
  17. package/dist/stream/transform/transformMapSync.d.ts +5 -3
  18. package/dist/stream/transform/transformMapSync.js +28 -22
  19. package/dist/stream/transform/transformNoOp.js +1 -1
  20. package/dist/stream/transform/transformTap.js +3 -3
  21. package/dist/stream/transform/transformToArray.js +1 -1
  22. package/dist/stream/transform/transformToString.js +2 -2
  23. package/dist/stream/transform/worker/transformMultiThreaded.js +1 -1
  24. package/dist/stream/writable/writableFork.js +1 -1
  25. package/dist/stream/writable/writablePushToArray.js +1 -1
  26. package/dist/stream/writable/writableVoid.js +1 -1
  27. package/dist/util/zip.util.d.ts +15 -7
  28. package/dist/util/zip.util.js +27 -22
  29. package/package.json +2 -2
  30. package/src/got/getGot.ts +120 -31
  31. package/src/got/got.model.ts +8 -0
  32. package/src/index.ts +19 -38
  33. package/src/stream/ndjson/transformJsonParse.ts +3 -3
  34. package/src/stream/ndjson/transformToNDJson.ts +2 -2
  35. package/src/stream/sizeStack.ts +56 -0
  36. package/src/stream/transform/transformBuffer.ts +1 -1
  37. package/src/stream/transform/transformFilter.ts +6 -20
  38. package/src/stream/transform/transformLogProgress.ts +72 -23
  39. package/src/stream/transform/transformMap.ts +7 -14
  40. package/src/stream/transform/transformMapSimple.ts +1 -1
  41. package/src/stream/transform/transformMapSync.ts +40 -26
  42. package/src/stream/transform/transformNoOp.ts +1 -1
  43. package/src/stream/transform/transformTap.ts +3 -3
  44. package/src/stream/transform/transformToArray.ts +1 -1
  45. package/src/stream/transform/transformToString.ts +2 -2
  46. package/src/stream/transform/worker/transformMultiThreaded.ts +1 -1
  47. package/src/stream/writable/writableFork.ts +1 -1
  48. package/src/stream/writable/writablePushToArray.ts +1 -1
  49. package/src/stream/writable/writableVoid.ts +1 -1
  50. package/src/util/zip.util.ts +26 -20
@@ -26,9 +26,8 @@ export interface TransformMapOptions<IN = any, OUT = IN> {
26
26
  * Predicate to filter outgoing results (after mapper).
27
27
  * Allows to not emit all results.
28
28
  *
29
- * Set to `r => r` (passthrough predicate) to pass ANY value (including undefined/null)
30
- *
31
- * @default to filter out undefined/null values, but pass anything else
29
+ * Defaults to "pass everything" (including null, undefined, etc).
30
+ * Simpler way to exclude certain cases is to return SKIP symbol from the mapper.
32
31
  */
33
32
  predicate?: AsyncPredicate<OUT>
34
33
 
@@ -60,10 +59,6 @@ export interface TransformMapOptions<IN = any, OUT = IN> {
60
59
  logger?: CommonLogger
61
60
  }
62
61
 
63
- export function notNullishPredicate(item: any): boolean {
64
- return item !== undefined && item !== null
65
- }
66
-
67
62
  // doesn't work, cause here we don't construct our Transform instance ourselves
68
63
  // export class TransformMap extends AbortableTransform {}
69
64
 
@@ -85,7 +80,7 @@ export function transformMap<IN = any, OUT = IN>(
85
80
  ): TransformTyped<IN, OUT> {
86
81
  const {
87
82
  concurrency = 16,
88
- predicate = notNullishPredicate,
83
+ predicate, // we now default to "no predicate" (meaning pass-everything)
89
84
  errorMode = ErrorMode.THROW_IMMEDIATELY,
90
85
  flattenArrayOutput,
91
86
  onError,
@@ -116,14 +111,12 @@ export function transformMap<IN = any, OUT = IN>(
116
111
  },
117
112
  },
118
113
  async function transformMapFn(this: AbortableTransform, chunk: IN, _, cb) {
119
- index++
120
- // console.log({chunk, _encoding})
121
-
122
114
  // Stop processing if isSettled (either THROW_IMMEDIATELY was fired or END received)
123
115
  if (isSettled) return cb()
124
116
 
117
+ const currentIndex = ++index
118
+
125
119
  try {
126
- const currentIndex = index // because we need to pass it to 2 functions - mapper and predicate. Refers to INPUT index (since it may return multiple outputs)
127
120
  const res = await mapper(chunk, currentIndex)
128
121
  const passedResults = await pFilter(
129
122
  flattenArrayOutput && Array.isArray(res) ? res : [res],
@@ -132,14 +125,14 @@ export function transformMap<IN = any, OUT = IN>(
132
125
  isSettled = true // will be checked later
133
126
  return false
134
127
  }
135
- return r !== SKIP && (await predicate(r, currentIndex))
128
+ return r !== SKIP && (!predicate || (await predicate(r, currentIndex)))
136
129
  },
137
130
  )
138
131
 
139
132
  passedResults.forEach(r => this.push(r))
140
133
 
141
134
  if (isSettled) {
142
- logger.log(`transformMap END received at index ${index}`)
135
+ logger.log(`transformMap END received at index ${currentIndex}`)
143
136
  pipelineClose('transformMap', this, this.sourceReadable, this.streamDone, logger)
144
137
  }
145
138
 
@@ -31,7 +31,7 @@ export function transformMapSimple<IN = any, OUT = IN>(
31
31
 
32
32
  return new Transform({
33
33
  objectMode: true,
34
- transform(chunk: IN, _encoding, cb) {
34
+ transform(chunk: IN, _, cb) {
35
35
  try {
36
36
  cb(null, mapper(chunk, ++index))
37
37
  } catch (err) {
@@ -1,8 +1,16 @@
1
- import { Transform } from 'stream'
2
- import { AggregatedError, CommonLogger, ErrorMode, Mapper, Predicate } from '@naturalcycles/js-lib'
1
+ import {
2
+ AggregatedError,
3
+ CommonLogger,
4
+ END,
5
+ ErrorMode,
6
+ Mapper,
7
+ Predicate,
8
+ SKIP,
9
+ } from '@naturalcycles/js-lib'
3
10
  import { yellow } from '../../colors'
11
+ import { AbortableTransform } from '../pipeline/pipeline'
4
12
  import { TransformTyped } from '../stream.model'
5
- import { notNullishPredicate } from './transformMap'
13
+ import { pipelineClose } from '../stream.util'
6
14
 
7
15
  export interface TransformMapSyncOptions<IN = any, OUT = IN> {
8
16
  /**
@@ -20,9 +28,8 @@ export interface TransformMapSyncOptions<IN = any, OUT = IN> {
20
28
  * Predicate to filter outgoing results (after mapper).
21
29
  * Allows to not emit all results.
22
30
  *
23
- * @default to filter out undefined/null values, but pass anything else
24
- *
25
- * Set to `r => r` (passthrough predicate) to pass ANY value (including undefined/null)
31
+ * Defaults to "pass everything".
32
+ * Simpler way to skip individual entries is to return SKIP symbol.
26
33
  */
27
34
  predicate?: Predicate<OUT>
28
35
 
@@ -47,6 +54,8 @@ export interface TransformMapSyncOptions<IN = any, OUT = IN> {
47
54
  logger?: CommonLogger
48
55
  }
49
56
 
57
+ export class TransformMapSync extends AbortableTransform {}
58
+
50
59
  /**
51
60
  * Sync (not async) version of transformMap.
52
61
  * Supposedly faster, for cases when async is not needed.
@@ -58,7 +67,7 @@ export function transformMapSync<IN = any, OUT = IN>(
58
67
  let index = -1
59
68
 
60
69
  const {
61
- predicate = notNullishPredicate,
70
+ predicate, // defaults to "no predicate" (pass everything)
62
71
  errorMode = ErrorMode.THROW_IMMEDIATELY,
63
72
  flattenArrayOutput = false,
64
73
  onError,
@@ -66,34 +75,39 @@ export function transformMapSync<IN = any, OUT = IN>(
66
75
  objectMode = true,
67
76
  logger = console,
68
77
  } = opt
69
- let isRejected = false
78
+ let isSettled = false
70
79
  let errors = 0
71
80
  const collectedErrors: Error[] = [] // only used if errorMode == THROW_AGGREGATED
72
81
 
73
- return new Transform({
82
+ return new TransformMapSync({
74
83
  objectMode,
75
84
  ...opt,
76
- transform(this: Transform, chunk: IN, _encoding, cb) {
77
- // Stop processing if THROW_IMMEDIATELY mode is used
78
- if (isRejected && errorMode === ErrorMode.THROW_IMMEDIATELY) {
79
- return cb()
80
- }
85
+ transform(this: AbortableTransform, chunk: IN, _, cb) {
86
+ // Stop processing if isSettled
87
+ if (isSettled) return cb()
81
88
 
82
- try {
83
- if (!predicate(chunk, ++index)) {
84
- cb() // signal that we've finished processing, but emit no output here
85
- return
86
- }
89
+ const currentIndex = ++index
87
90
 
91
+ try {
88
92
  // map and pass through
89
- const v = mapper(chunk, index)
93
+ const v = mapper(chunk, currentIndex)
94
+
95
+ const passedResults = (flattenArrayOutput && Array.isArray(v) ? v : [v]).filter(r => {
96
+ if (r === END) {
97
+ isSettled = true // will be checked later
98
+ return false
99
+ }
100
+ return r !== SKIP && (!predicate || predicate(r, currentIndex))
101
+ })
90
102
 
91
- if (flattenArrayOutput && Array.isArray(v)) {
92
- // Pass each item individually
93
- v.forEach(item => this.push(item))
94
- } else {
95
- cb(null, v)
103
+ passedResults.forEach(r => this.push(r))
104
+
105
+ if (isSettled) {
106
+ logger.log(`transformMapSync END received at index ${currentIndex}`)
107
+ pipelineClose('transformMapSync', this, this.sourceReadable, this.streamDone, logger)
96
108
  }
109
+
110
+ cb() // done processing
97
111
  } catch (err) {
98
112
  logger.error(err)
99
113
  errors++
@@ -107,7 +121,7 @@ export function transformMapSync<IN = any, OUT = IN>(
107
121
  }
108
122
 
109
123
  if (errorMode === ErrorMode.THROW_IMMEDIATELY) {
110
- isRejected = true
124
+ isSettled = true
111
125
  // Emit error immediately
112
126
  return cb(err as Error)
113
127
  }
@@ -9,7 +9,7 @@ import { TransformTyped } from '../stream.model'
9
9
  export function transformNoOp<T = any>(): TransformTyped<T, T> {
10
10
  return new Transform({
11
11
  objectMode: true,
12
- transform(chunk: T, _encoding, cb) {
12
+ transform(chunk: T, _, cb) {
13
13
  cb(null, chunk)
14
14
  },
15
15
  })
@@ -17,16 +17,16 @@ export function transformTap<IN>(
17
17
  opt: TransformTapOptions = {},
18
18
  ): TransformTyped<IN, IN> {
19
19
  const { logger = console } = opt
20
- let index = 0
20
+ let index = -1
21
21
 
22
22
  return new Transform({
23
23
  objectMode: true,
24
24
  ...opt,
25
- async transform(chunk: IN, _encoding, cb) {
25
+ async transform(chunk: IN, _, cb) {
26
26
  // console.log('tap', chunk)
27
27
 
28
28
  try {
29
- await fn(chunk, index++)
29
+ await fn(chunk, ++index)
30
30
  } catch (err) {
31
31
  logger.error(err)
32
32
  // suppressed error
@@ -10,7 +10,7 @@ export function transformToArray<IN>(opt: TransformOptions = {}): TransformTyped
10
10
  return new Transform({
11
11
  objectMode: true,
12
12
  ...opt,
13
- transform(chunk: IN, _encoding, cb) {
13
+ transform(chunk: IN, _, cb) {
14
14
  res.push(chunk)
15
15
  // callback to signal that we processed input, but not emitting any output
16
16
  cb()
@@ -14,8 +14,8 @@ export function transformToString(): TransformTyped<Buffer, string> {
14
14
  return new Transform({
15
15
  objectMode: false,
16
16
  readableObjectMode: true,
17
- transform(chunk: Buffer, _encoding, cb) {
18
- // console.log(`enc: ${_encoding}`, chunk.toString())
17
+ transform(chunk: Buffer, _, cb) {
18
+ // console.log(`enc: ${_}`, chunk.toString())
19
19
  cb(null, chunk.toString())
20
20
  },
21
21
  })
@@ -115,7 +115,7 @@ export function transformMultiThreaded<IN, OUT>(
115
115
  }
116
116
  },
117
117
  },
118
- async function transformMapFn(chunk: IN, _encoding, cb) {
118
+ async function transformMapFn(chunk: IN, _, cb) {
119
119
  // Freezing the index, because it may change due to concurrency
120
120
  const currentIndex = ++index
121
121
 
@@ -31,7 +31,7 @@ export function writableFork<T>(
31
31
  return new Writable({
32
32
  objectMode: true,
33
33
  ...opt,
34
- write(chunk: T, _encoding, cb) {
34
+ write(chunk: T, _, cb) {
35
35
  // Push/fork to all sub-streams
36
36
  // No backpressure is ensured here, it'll push regardless of the
37
37
  readables.forEach(readable => readable.push(chunk))
@@ -8,7 +8,7 @@ export function writablePushToArray<IN>(arr: IN[], opt: TransformOptions = {}):
8
8
  return new Writable({
9
9
  objectMode: true,
10
10
  ...opt,
11
- write(chunk: IN, _encoding, cb) {
11
+ write(chunk: IN, _, cb) {
12
12
  arr.push(chunk)
13
13
  // callback to signal that we processed input, but not emitting any output
14
14
  cb()
@@ -18,7 +18,7 @@ export function writableVoid(opt: WritableVoidOptions = {}): Writable {
18
18
  return new Writable({
19
19
  objectMode: true,
20
20
  ...opt,
21
- write(chunk, _encoding, cb) {
21
+ write(chunk, _, cb) {
22
22
  cb()
23
23
  },
24
24
  final(cb) {
@@ -7,46 +7,52 @@ const inflate = promisify(zlib.inflate.bind(zlib))
7
7
  const gzip = promisify(zlib.gzip.bind(zlib))
8
8
  const gunzip = promisify(zlib.gunzip.bind(zlib))
9
9
 
10
- // string > zip
10
+ // string > compressed buffer
11
+
11
12
  /**
12
- * zipBuffer uses `deflate`.
13
- * It's 9 bytes shorter than gzip.
13
+ * deflateBuffer uses `deflate`.
14
+ * It's 9 bytes shorter than `gzip`.
14
15
  */
15
- export async function zipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
16
+ export async function deflateBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
16
17
  return await deflate(buf, options)
17
18
  }
18
19
 
20
+ export async function inflateBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
21
+ return await inflate(buf, options)
22
+ }
23
+
24
+ /**
25
+ * deflateString uses `deflate`.
26
+ * It's 9 bytes shorter than `gzip`.
27
+ */
28
+ export async function deflateString(s: string, options?: ZlibOptions): Promise<Buffer> {
29
+ return await deflateBuffer(Buffer.from(s), options)
30
+ }
31
+
32
+ export async function inflateToString(buf: Buffer, options?: ZlibOptions): Promise<string> {
33
+ return (await inflateBuffer(buf, options)).toString()
34
+ }
35
+
19
36
  /**
20
37
  * gzipBuffer uses `gzip`
21
- * It's 9 bytes longer than deflate.
38
+ * It's 9 bytes longer than `deflate`.
22
39
  */
23
40
  export async function gzipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
24
41
  return await gzip(buf, options)
25
42
  }
26
43
 
27
- // zip > buffer
28
- export async function unzipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
29
- return await inflate(buf, options)
30
- }
31
-
32
44
  export async function gunzipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
33
45
  return await gunzip(buf, options)
34
46
  }
35
47
 
36
- // convenience
37
- export async function zipString(s: string, options?: ZlibOptions): Promise<Buffer> {
38
- return await zipBuffer(Buffer.from(s), options)
39
- }
40
-
48
+ /**
49
+ * gzipString uses `gzip`.
50
+ * It's 9 bytes longer than `deflate`.
51
+ */
41
52
  export async function gzipString(s: string, options?: ZlibOptions): Promise<Buffer> {
42
53
  return await gzipBuffer(Buffer.from(s), options)
43
54
  }
44
55
 
45
- // convenience
46
- export async function unzipToString(buf: Buffer, options?: ZlibOptions): Promise<string> {
47
- return (await unzipBuffer(buf, options)).toString()
48
- }
49
-
50
56
  export async function gunzipToString(buf: Buffer, options?: ZlibOptions): Promise<string> {
51
57
  return (await gunzipBuffer(buf, options)).toString()
52
58
  }