@rsdoctor/sdk 1.6.1 → 1.6.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/dist/index.cjs CHANGED
@@ -6568,6 +6568,41 @@ var __webpack_modules__ = {
6568
6568
  return firstPkgDir || null;
6569
6569
  }
6570
6570
  __webpack_require__.n(dayjs_index_js_namespaceObject)()().format('YYYYMMDD');
6571
+ var promises_ = __webpack_require__("node:fs/promises"), promises_default = __webpack_require__.n(promises_);
6572
+ let external_node_stream_namespaceObject = require("node:stream");
6573
+ var external_node_zlib_ = __webpack_require__("node:zlib");
6574
+ async function writeManifestShards(jsonFragments, folder, options = {}) {
6575
+ if (0 === jsonFragments.length) throw Error('Cannot write empty JSON fragments.');
6576
+ let { index = 0, shardSize = 10485760 } = options;
6577
+ if (!Number.isSafeInteger(shardSize) || shardSize <= 0) throw Error('Manifest shard size must be a positive integer.');
6578
+ await promises_default().mkdir(folder, {
6579
+ recursive: !0
6580
+ });
6581
+ let files = [], shardParts = [], shardLength = 0, flushShard = async ()=>{
6582
+ if (0 === shardLength) return;
6583
+ let basename = String(index + files.length), filePath = external_node_path_default().resolve(folder, basename);
6584
+ await promises_default().writeFile(filePath, shardParts.join(''), 'utf8'), files.push({
6585
+ path: filePath,
6586
+ basename
6587
+ }), shardParts = [], shardLength = 0;
6588
+ }, appendEncodedText = async (encodedText)=>{
6589
+ let offset = 0;
6590
+ for(; offset < encodedText.length;){
6591
+ let length = Math.min(shardSize - shardLength, encodedText.length - offset);
6592
+ shardParts.push(encodedText.slice(offset, offset + length)), shardLength += length, offset += length, shardLength === shardSize && await flushShard();
6593
+ }
6594
+ }, compressor = external_node_stream_namespaceObject.Readable.from(jsonFragments, {
6595
+ objectMode: !1
6596
+ }).pipe((0, external_node_zlib_.createDeflate)()), base64Remainder = Buffer.alloc(0);
6597
+ for await (let chunk of compressor){
6598
+ let compressedChunk = Buffer.from(chunk), bytes = base64Remainder.length ? Buffer.concat([
6599
+ base64Remainder,
6600
+ compressedChunk
6601
+ ]) : compressedChunk, encodableLength = bytes.length - bytes.length % 3;
6602
+ encodableLength > 0 && await appendEncodedText(bytes.subarray(0, encodableLength).toString('base64')), base64Remainder = Buffer.from(bytes.subarray(encodableLength));
6603
+ }
6604
+ return base64Remainder.length > 0 && await appendEncodedText(base64Remainder.toString('base64')), await flushShard(), files;
6605
+ }
6571
6606
  class SDKCore {
6572
6607
  constructor({ name, root }){
6573
6608
  this.hooks = {
@@ -6654,20 +6689,21 @@ var __webpack_modules__ = {
6654
6689
  return build_namespaceObject.Json.stringify(data);
6655
6690
  }
6656
6691
  })();
6657
- if (Array.isArray(jsonStr)) {
6658
- let fileOffset = 0;
6659
- for (let str of jsonStr){
6660
- let result = await this.writeToFolder(str, outputDir, key, fileOffset);
6661
- fileOffset += result.files.length, urlsPromiseList.push(result);
6662
- }
6663
- } else urlsPromiseList.push(this.writeToFolder(jsonStr, outputDir, key));
6692
+ Array.isArray(jsonStr) ? urlsPromiseList.push(this.writeJsonFragmentsToFolder(jsonStr, outputDir, key)) : urlsPromiseList.push(this.writeToFolder(jsonStr, outputDir, key));
6664
6693
  }
6665
6694
  let dataUrls = await Promise.all(urlsPromiseList);
6666
6695
  logger_namespaceObject.logger.debug(`SDKCore.writePieces extraConfig: ${JSON.stringify(this.extraConfig)}`, '[SDKCore.writePieces]'), this.cloudData = {
6667
6696
  client: {
6668
6697
  enableRoutes: this.getClientRoutes()
6669
6698
  },
6670
- data: dataUrls.reduce((t, item)=>(t[item.name] = Array.isArray(item.files) ? item.files.map((e)=>e.path).concat(t[item.name] || []) : item.files, t), {})
6699
+ data: dataUrls.reduce((t, item)=>{
6700
+ if (!Array.isArray(item.files)) return t[item.name] = item.files, t;
6701
+ let previous = t[item.name];
6702
+ return t[item.name] = [
6703
+ ...Array.isArray(previous) ? previous : [],
6704
+ ...item.files.map((e)=>e.path)
6705
+ ], t;
6706
+ }, {})
6671
6707
  };
6672
6708
  }
6673
6709
  async writeManifest() {
@@ -6685,15 +6721,19 @@ var __webpack_modules__ = {
6685
6721
  }), manifestDiskPath;
6686
6722
  }
6687
6723
  writeToFolder(jsonStr, dir, key, index) {
6688
- let sharding = new build_namespaceObject.File.FileSharding(common_namespaceObject.Algorithm.compressText(jsonStr)), folder = external_node_path_default().resolve(dir, key);
6689
- return sharding.writeStringToFolder(folder, '', index).then((item)=>({
6690
- name: key,
6691
- files: item.map((el)=>({
6692
- path: external_node_path_default().resolve(folder, el.filename),
6693
- basename: el.filename,
6694
- content: el.content
6695
- }))
6696
- }));
6724
+ return this.writeJsonFragmentsToFolder([
6725
+ jsonStr
6726
+ ], dir, key, index);
6727
+ }
6728
+ async writeJsonFragmentsToFolder(jsonFragments, dir, key, index) {
6729
+ if (0 === jsonFragments.length) throw Error(`Cannot write empty JSON fragments for "${key}".`);
6730
+ let folder = external_node_path_default().resolve(dir, key);
6731
+ return {
6732
+ name: key,
6733
+ files: await writeManifestShards(jsonFragments, folder, {
6734
+ index
6735
+ })
6736
+ };
6697
6737
  }
6698
6738
  }
6699
6739
  let sdk_require = (0, external_module_namespaceObject.createRequire)(__rslib_import_meta_url__);
package/dist/index.js CHANGED
@@ -27,6 +27,9 @@ import { randomBytes } from "crypto";
27
27
  import node_process from "node:process";
28
28
  import { AsyncSeriesHook } from "tapable";
29
29
  import dayjs from "../compiled/dayjs/index.js";
30
+ import node_fs_promises from "node:fs/promises";
31
+ import { Readable } from "node:stream";
32
+ import { createDeflate } from "node:zlib";
30
33
  import { __webpack_require__ } from "./612.js";
31
34
  import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
32
35
  let __rspack_createRequire_require = __rspack_createRequire(import.meta.url);
@@ -55,7 +58,7 @@ __webpack_require__.add({
55
58
  });
56
59
  },
57
60
  "../../node_modules/.pnpm/body-parser@2.2.2/node_modules/body-parser/lib/read.js" (module, __unused_rspack_exports, __webpack_require__) {
58
- var createError = __webpack_require__("../../node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/index.js"), getBody = __webpack_require__("../../node_modules/.pnpm/raw-body@3.0.2/node_modules/raw-body/index.js"), iconv = __webpack_require__("../../node_modules/.pnpm/iconv-lite@0.7.0/node_modules/iconv-lite/lib/index.js"), onFinished = __webpack_require__("../../node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/index.js"), zlib = __webpack_require__("node:zlib"), hasBody = __webpack_require__("../../node_modules/.pnpm/type-is@2.0.1/node_modules/type-is/index.js").hasBody, { getCharset } = __webpack_require__("../../node_modules/.pnpm/body-parser@2.2.2/node_modules/body-parser/lib/utils.js");
61
+ var createError = __webpack_require__("../../node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/index.js"), getBody = __webpack_require__("../../node_modules/.pnpm/raw-body@3.0.2/node_modules/raw-body/index.js"), iconv = __webpack_require__("../../node_modules/.pnpm/iconv-lite@0.7.0/node_modules/iconv-lite/lib/index.js"), onFinished = __webpack_require__("../../node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/index.js"), zlib = __webpack_require__("node:zlib?1e70"), hasBody = __webpack_require__("../../node_modules/.pnpm/type-is@2.0.1/node_modules/type-is/index.js").hasBody, { getCharset } = __webpack_require__("../../node_modules/.pnpm/body-parser@2.2.2/node_modules/body-parser/lib/utils.js");
59
62
  module.exports = function(req, res, next, parse, debug, options) {
60
63
  if (onFinished.isFinished(req)) {
61
64
  debug('body already parsed'), next();
@@ -5130,7 +5133,7 @@ __webpack_require__.add({
5130
5133
  "fs?8b28" (module) {
5131
5134
  module.exports = __rspack_createRequire_require("fs");
5132
5135
  },
5133
- "node:zlib" (module) {
5136
+ "node:zlib?1e70" (module) {
5134
5137
  module.exports = __rspack_createRequire_require("node:zlib");
5135
5138
  },
5136
5139
  "os?da1a" (module) {
@@ -6560,6 +6563,38 @@ function findRoot(startDir = process.cwd()) {
6560
6563
  }
6561
6564
  return firstPkgDir || null;
6562
6565
  }
6566
+ async function writeManifestShards(jsonFragments, folder, options = {}) {
6567
+ if (0 === jsonFragments.length) throw Error('Cannot write empty JSON fragments.');
6568
+ let { index = 0, shardSize = 10485760 } = options;
6569
+ if (!Number.isSafeInteger(shardSize) || shardSize <= 0) throw Error('Manifest shard size must be a positive integer.');
6570
+ await node_fs_promises.mkdir(folder, {
6571
+ recursive: !0
6572
+ });
6573
+ let files = [], shardParts = [], shardLength = 0, flushShard = async ()=>{
6574
+ if (0 === shardLength) return;
6575
+ let basename = String(index + files.length), filePath = node_path.resolve(folder, basename);
6576
+ await node_fs_promises.writeFile(filePath, shardParts.join(''), 'utf8'), files.push({
6577
+ path: filePath,
6578
+ basename
6579
+ }), shardParts = [], shardLength = 0;
6580
+ }, appendEncodedText = async (encodedText)=>{
6581
+ let offset = 0;
6582
+ for(; offset < encodedText.length;){
6583
+ let length = Math.min(shardSize - shardLength, encodedText.length - offset);
6584
+ shardParts.push(encodedText.slice(offset, offset + length)), shardLength += length, offset += length, shardLength === shardSize && await flushShard();
6585
+ }
6586
+ }, compressor = Readable.from(jsonFragments, {
6587
+ objectMode: !1
6588
+ }).pipe(createDeflate()), base64Remainder = Buffer.alloc(0);
6589
+ for await (let chunk of compressor){
6590
+ let compressedChunk = Buffer.from(chunk), bytes = base64Remainder.length ? Buffer.concat([
6591
+ base64Remainder,
6592
+ compressedChunk
6593
+ ]) : compressedChunk, encodableLength = bytes.length - bytes.length % 3;
6594
+ encodableLength > 0 && await appendEncodedText(bytes.subarray(0, encodableLength).toString('base64')), base64Remainder = Buffer.from(bytes.subarray(encodableLength));
6595
+ }
6596
+ return base64Remainder.length > 0 && await appendEncodedText(base64Remainder.toString('base64')), await flushShard(), files;
6597
+ }
6563
6598
  dayjs().format('YYYYMMDD');
6564
6599
  class SDKCore {
6565
6600
  constructor({ name, root }){
@@ -6647,20 +6682,21 @@ class SDKCore {
6647
6682
  return Json.stringify(data);
6648
6683
  }
6649
6684
  })();
6650
- if (Array.isArray(jsonStr)) {
6651
- let fileOffset = 0;
6652
- for (let str of jsonStr){
6653
- let result = await this.writeToFolder(str, outputDir, key, fileOffset);
6654
- fileOffset += result.files.length, urlsPromiseList.push(result);
6655
- }
6656
- } else urlsPromiseList.push(this.writeToFolder(jsonStr, outputDir, key));
6685
+ Array.isArray(jsonStr) ? urlsPromiseList.push(this.writeJsonFragmentsToFolder(jsonStr, outputDir, key)) : urlsPromiseList.push(this.writeToFolder(jsonStr, outputDir, key));
6657
6686
  }
6658
6687
  let dataUrls = await Promise.all(urlsPromiseList);
6659
6688
  logger.debug(`SDKCore.writePieces extraConfig: ${JSON.stringify(this.extraConfig)}`, '[SDKCore.writePieces]'), this.cloudData = {
6660
6689
  client: {
6661
6690
  enableRoutes: this.getClientRoutes()
6662
6691
  },
6663
- data: dataUrls.reduce((t, item)=>(t[item.name] = Array.isArray(item.files) ? item.files.map((e)=>e.path).concat(t[item.name] || []) : item.files, t), {})
6692
+ data: dataUrls.reduce((t, item)=>{
6693
+ if (!Array.isArray(item.files)) return t[item.name] = item.files, t;
6694
+ let previous = t[item.name];
6695
+ return t[item.name] = [
6696
+ ...Array.isArray(previous) ? previous : [],
6697
+ ...item.files.map((e)=>e.path)
6698
+ ], t;
6699
+ }, {})
6664
6700
  };
6665
6701
  }
6666
6702
  async writeManifest() {
@@ -6678,15 +6714,19 @@ class SDKCore {
6678
6714
  }), manifestDiskPath;
6679
6715
  }
6680
6716
  writeToFolder(jsonStr, dir, key, index) {
6681
- let sharding = new File.FileSharding(Algorithm.compressText(jsonStr)), folder = node_path.resolve(dir, key);
6682
- return sharding.writeStringToFolder(folder, '', index).then((item)=>({
6683
- name: key,
6684
- files: item.map((el)=>({
6685
- path: node_path.resolve(folder, el.filename),
6686
- basename: el.filename,
6687
- content: el.content
6688
- }))
6689
- }));
6717
+ return this.writeJsonFragmentsToFolder([
6718
+ jsonStr
6719
+ ], dir, key, index);
6720
+ }
6721
+ async writeJsonFragmentsToFolder(jsonFragments, dir, key, index) {
6722
+ if (0 === jsonFragments.length) throw Error(`Cannot write empty JSON fragments for "${key}".`);
6723
+ let folder = node_path.resolve(dir, key);
6724
+ return {
6725
+ name: key,
6726
+ files: await writeManifestShards(jsonFragments, folder, {
6727
+ index
6728
+ })
6729
+ };
6690
6730
  }
6691
6731
  }
6692
6732
  let source_map = __webpack_require__("../../node_modules/.pnpm/source-map@0.7.6/node_modules/source-map/source-map.js"), sdk_require = createRequire(import.meta.url);
@@ -29,5 +29,6 @@ export declare abstract class SDKCore<T extends RsdoctorSDKOptions> implements S
29
29
  protected writeManifest(): Promise<string>;
30
30
  saveManifest(data: Common.PlainObject, options: SDK.WriteStoreOptionsType): Promise<string>;
31
31
  protected writeToFolder(jsonStr: string, dir: string, key: string, index?: number): Promise<DataWithUrl>;
32
+ protected writeJsonFragmentsToFolder(jsonFragments: string[], dir: string, key: string, index?: number): Promise<DataWithUrl>;
32
33
  abstract onDataReport(): void | Promise<void>;
33
34
  }
@@ -29,5 +29,6 @@ export declare abstract class SDKCore<T extends RsdoctorSDKOptions> implements S
29
29
  protected writeManifest(): Promise<string>;
30
30
  saveManifest(data: Common.PlainObject, options: SDK.WriteStoreOptionsType): Promise<string>;
31
31
  protected writeToFolder(jsonStr: string, dir: string, key: string, index?: number): Promise<DataWithUrl>;
32
+ protected writeJsonFragmentsToFolder(jsonFragments: string[], dir: string, key: string, index?: number): Promise<DataWithUrl>;
32
33
  abstract onDataReport(): void | Promise<void>;
33
34
  }
@@ -4,7 +4,7 @@ export interface DataWithUrl {
4
4
  files: {
5
5
  path: string;
6
6
  basename: string;
7
- content: Buffer;
7
+ content?: Buffer;
8
8
  }[] | string;
9
9
  }
10
10
  export interface RsdoctorSDKOptions {
@@ -4,7 +4,7 @@ export interface DataWithUrl {
4
4
  files: {
5
5
  path: string;
6
6
  basename: string;
7
- content: Buffer;
7
+ content?: Buffer;
8
8
  }[] | string;
9
9
  }
10
10
  export interface RsdoctorSDKOptions {
@@ -1,3 +1,4 @@
1
1
  export * from './constant';
2
2
  export * from './base';
3
3
  export * from './upload';
4
+ export * from './manifestSharding';
@@ -1,3 +1,4 @@
1
1
  export * from './constant.js';
2
2
  export * from './base.js';
3
3
  export * from './upload.js';
4
+ export * from './manifestSharding.js';
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_MANIFEST_SHARD_SIZE: number;
2
+ interface WriteManifestShardsOptions {
3
+ index?: number;
4
+ shardSize?: number;
5
+ }
6
+ export interface ManifestShardFile {
7
+ path: string;
8
+ basename: string;
9
+ }
10
+ /**
11
+ * Compress JSON fragments as one deflate stream, encode that stream as one
12
+ * continuous Base64 value, and write bounded physical shards.
13
+ */
14
+ export declare function writeManifestShards(jsonFragments: string[], folder: string, options?: WriteManifestShardsOptions): Promise<ManifestShardFile[]>;
15
+ export {};
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_MANIFEST_SHARD_SIZE: number;
2
+ interface WriteManifestShardsOptions {
3
+ index?: number;
4
+ shardSize?: number;
5
+ }
6
+ export interface ManifestShardFile {
7
+ path: string;
8
+ basename: string;
9
+ }
10
+ /**
11
+ * Compress JSON fragments as one deflate stream, encode that stream as one
12
+ * continuous Base64 value, and write bounded physical shards.
13
+ */
14
+ export declare function writeManifestShards(jsonFragments: string[], folder: string, options?: WriteManifestShardsOptions): Promise<ManifestShardFile[]>;
15
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdoctor/sdk",
3
- "version": "1.6.1",
3
+ "version": "1.6.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/web-infra-dev/rsdoctor",
@@ -32,10 +32,10 @@
32
32
  "safer-buffer": "2.1.2",
33
33
  "socket.io": "4.8.1",
34
34
  "tapable": "2.3.3",
35
- "@rsdoctor/client": "1.6.1",
36
- "@rsdoctor/graph": "1.6.1",
37
- "@rsdoctor/utils": "1.6.1",
38
- "@rsdoctor/types": "1.6.1"
35
+ "@rsdoctor/client": "1.6.2",
36
+ "@rsdoctor/graph": "1.6.2",
37
+ "@rsdoctor/utils": "1.6.2",
38
+ "@rsdoctor/types": "1.6.2"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/body-parser": "1.19.6",