@kontur.candy/tools 2.254.0 → 2.256.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.
Files changed (76) hide show
  1. package/README.md +0 -16
  2. package/distr/Common/AsyncUtils.js +7 -0
  3. package/distr/Common/AsyncUtils.js.map +1 -1
  4. package/distr/Common/CommonConstants/DefaultServicesUrls.js +1 -3
  5. package/distr/Common/CommonConstants/DefaultServicesUrls.js.map +1 -1
  6. package/distr/Common/IntRangeUtils.js +4 -0
  7. package/distr/Common/IntRangeUtils.js.map +1 -1
  8. package/distr/Common/TypingUtils.js +4 -0
  9. package/distr/Common/TypingUtils.js.map +1 -1
  10. package/distr/Common/async/Channel.js +64 -0
  11. package/distr/Common/async/Channel.js.map +1 -0
  12. package/distr/Common/async/pool/AsyncPool.js +145 -0
  13. package/distr/Common/async/pool/AsyncPool.js.map +1 -0
  14. package/distr/Common/async/pool/FixedPool.js +29 -0
  15. package/distr/Common/async/pool/FixedPool.js.map +1 -0
  16. package/distr/Common/async/pool/LimitedPool.js +81 -0
  17. package/distr/Common/async/pool/LimitedPool.js.map +1 -0
  18. package/distr/Common/async/pool/Registry.js +73 -0
  19. package/distr/Common/async/pool/Registry.js.map +1 -0
  20. package/distr/Common/async/pool/index.js +13 -0
  21. package/distr/Common/async/pool/index.js.map +1 -0
  22. package/distr/Common/ds/LinkedList.js +64 -0
  23. package/distr/Common/ds/LinkedList.js.map +1 -0
  24. package/distr/Common/multithread/ThreadPool.js +74 -0
  25. package/distr/Common/multithread/ThreadPool.js.map +1 -0
  26. package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +2 -1
  27. package/distr/Tools/src/BuildTasks/Form/GenerateForm.js.map +1 -1
  28. package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +0 -3
  29. package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js.map +1 -1
  30. package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +1 -1
  31. package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js.map +1 -1
  32. package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +13 -4
  33. package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js.map +1 -1
  34. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +29 -107
  35. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js.map +1 -1
  36. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorPool.js +57 -0
  37. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorPool.js.map +1 -0
  38. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +29 -36
  39. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js.map +1 -1
  40. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +29 -36
  41. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js.map +1 -1
  42. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedThreadWorker.js +14 -0
  43. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedThreadWorker.js.map +1 -0
  44. package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +1 -1
  45. package/distr/Tools/src/BuildTasks/ResolveFormInfo.js.map +1 -1
  46. package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +0 -10
  47. package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js.map +1 -1
  48. package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +2 -6
  49. package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js.map +1 -1
  50. package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +0 -22
  51. package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js.map +1 -1
  52. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +1 -3
  53. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js.map +1 -1
  54. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +1 -1
  55. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js.map +1 -1
  56. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +2 -5
  57. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js.map +1 -1
  58. package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +0 -10
  59. package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js.map +1 -1
  60. package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +1 -2
  61. package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js.map +1 -1
  62. package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +1 -1
  63. package/distr/Tools/src/CLICommands/Localization/RunLocalization.js.map +1 -1
  64. package/distr/Tools/src/CLICommands/SugarExtractor/Utils.js +1 -1
  65. package/distr/Tools/src/CLICommands/SugarExtractor/Utils.js.map +1 -1
  66. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
  67. package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
  68. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +13 -14
  69. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
  70. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +13 -14
  71. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
  72. package/package.json +1 -1
  73. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +0 -40
  74. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js.map +0 -1
  75. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +0 -19
  76. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js.map +0 -1
package/README.md CHANGED
@@ -65,10 +65,6 @@ candy [имя-команды] [...опции]
65
65
 
66
66
  Устанавливает версию движка в файла form.json в последнюю пререлизную версию в заданным preid. В файле версии генератора и движка будут установлены в pre:some-preid.
67
67
 
68
- * `--no-reformat`
69
-
70
- Отлючает форматирование генерируемого кода. Работает, только если версия генератора поддерживает эту опцию. Используется для ускорения сборки форм. (default: true)
71
-
72
68
  * `--gfvs (-g)`
73
69
 
74
70
  Одна или несколько GFV или GFV-масок для пересборки. Может содержать значки `?` и `*`.
@@ -216,10 +212,6 @@ candy upgrade --engine latest 9900101
216
212
 
217
213
  Не запускать сборку runtime-движка. Для отладки результатов генерации.
218
214
 
219
- * `--no-reformat`
220
-
221
- Отлючает форматирование генерируемого кода. Работает, только если версия генератора поддерживает эту опцию. Используется для ускорения сборки форм.
222
-
223
215
  * `--continue-on-error`
224
216
 
225
217
  Не генерирует код ошибки в случае ошибки при генерации или компиляции формы.
@@ -321,10 +313,6 @@ Magic
321
313
 
322
314
  Отключает перехват client.js. В этом случае не будет работать отображение логов сборки и ожидания сборки формы.
323
315
 
324
- * `--reformat (-r)`
325
-
326
- Включает форматирование генерируемого кода. Работает, только если версия генератора поддерживает эту опцию. Используется для отладки и просмотра сгенерированных форм в отдадчике. (default: false)
327
-
328
316
  * `--debug-only (-d)`
329
317
 
330
318
  Собирать только debug-сборки движка и форм. ВНИМАНИЕ: при работе в браузере необходимо использовать параметр ?debug=true
@@ -365,10 +353,6 @@ Magic
365
353
 
366
354
  Отключает перехват client.js. В этом случае не будет работать отображение логов сборки и ожидания сборки формы.
367
355
 
368
- * `--reformat (-r)`
369
-
370
- Включает форматирование генерируемого кода. Работает, только если версия генератора поддерживает эту опцию. Используется для отладки и просмотра сгенерированных форм в отдадчике. (default: false)
371
-
372
356
  * `--debug-only (-d)`
373
357
 
374
358
  Собирать только debug-сборки движка и форм. ВНИМАНИЕ: при работе в браузере необходимо использовать параметр ?debug=true
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.delay = delay;
7
7
  exports.nextTick = nextTick;
8
+ exports.waitUntil = void 0;
8
9
  function delay(timeout) {
9
10
  return new Promise(resolve => {
10
11
  setTimeout(resolve, timeout);
@@ -15,4 +16,10 @@ function nextTick() {
15
16
  setTimeout(resolve, 0);
16
17
  });
17
18
  }
19
+ const waitUntil = async predicate => {
20
+ while (!predicate()) {
21
+ await nextTick();
22
+ }
23
+ };
24
+ exports.waitUntil = waitUntil;
18
25
  //# sourceMappingURL=AsyncUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AsyncUtils.js","names":["delay","timeout","Promise","resolve","setTimeout","nextTick"],"sources":["../../../Common/AsyncUtils.ts"],"sourcesContent":["export function delay(timeout: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, timeout);\n });\n}\n\nexport function nextTick(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n}\n"],"mappings":";;;;;;;AAAO,SAASA,KAAKA,CAACC,OAAe,EAAiB;EAClD,OAAO,IAAIC,OAAO,CAACC,OAAO,IAAI;IAC1BC,UAAU,CAACD,OAAO,EAAEF,OAAO,CAAC;EAChC,CAAC,CAAC;AACN;AAEO,SAASI,QAAQA,CAAA,EAAkB;EACtC,OAAO,IAAIH,OAAO,CAACC,OAAO,IAAI;IAC1BC,UAAU,CAACD,OAAO,EAAE,CAAC,CAAC;EAC1B,CAAC,CAAC;AACN","ignoreList":[]}
1
+ {"version":3,"file":"AsyncUtils.js","names":["delay","timeout","Promise","resolve","setTimeout","nextTick","waitUntil","predicate","exports"],"sources":["../../../Common/AsyncUtils.ts"],"sourcesContent":["export function delay(timeout: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, timeout);\n });\n}\n\nexport function nextTick(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n}\n\nexport const waitUntil = async (predicate: () => boolean) => {\n while (!predicate()) {\n await nextTick();\n }\n};\n"],"mappings":";;;;;;;;AAAO,SAASA,KAAKA,CAACC,OAAe,EAAiB;EAClD,OAAO,IAAIC,OAAO,CAACC,OAAO,IAAI;IAC1BC,UAAU,CAACD,OAAO,EAAEF,OAAO,CAAC;EAChC,CAAC,CAAC;AACN;AAEO,SAASI,QAAQA,CAAA,EAAkB;EACtC,OAAO,IAAIH,OAAO,CAACC,OAAO,IAAI;IAC1BC,UAAU,CAACD,OAAO,EAAE,CAAC,CAAC;EAC1B,CAAC,CAAC;AACN;AAEO,MAAMG,SAAS,GAAG,MAAOC,SAAwB,IAAK;EACzD,OAAO,CAACA,SAAS,CAAC,CAAC,EAAE;IACjB,MAAMF,QAAQ,CAAC,CAAC;EACpB;AACJ,CAAC;AAACG,OAAA,CAAAF,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -10,14 +10,12 @@ const DEFAULT_PICKLIST_URL = "";
10
10
  const DEFAULT_NIDUS_URL = "";
11
11
  const DEFAULT_FSPRINTER_URL = "";
12
12
  const DEFAULT_CONTRACTORS_URL = "";
13
- const DEFAULT_PERSONS_URL = "";
14
13
  const defaultServicesUrls = exports.defaultServicesUrls = {
15
14
  keformsUrl: DEFAULT_KEFORMS_URL,
16
15
  staffServiceUrl: DEFAULT_STAFF_SERVICE_URL,
17
16
  picklistUrl: DEFAULT_PICKLIST_URL,
18
17
  nidusUrl: DEFAULT_NIDUS_URL,
19
18
  fsPrinterUrl: DEFAULT_FSPRINTER_URL,
20
- contractorsApiUrl: DEFAULT_CONTRACTORS_URL,
21
- personsApiUrl: DEFAULT_PERSONS_URL
19
+ contractorsApiUrl: DEFAULT_CONTRACTORS_URL
22
20
  };
23
21
  //# sourceMappingURL=DefaultServicesUrls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultServicesUrls.js","names":["DEFAULT_KEFORMS_URL","DEFAULT_STAFF_SERVICE_URL","exports","DEFAULT_PICKLIST_URL","DEFAULT_NIDUS_URL","DEFAULT_FSPRINTER_URL","DEFAULT_CONTRACTORS_URL","DEFAULT_PERSONS_URL","defaultServicesUrls","keformsUrl","staffServiceUrl","picklistUrl","nidusUrl","fsPrinterUrl","contractorsApiUrl","personsApiUrl"],"sources":["../../../../Common/CommonConstants/DefaultServicesUrls.ts"],"sourcesContent":["const DEFAULT_KEFORMS_URL = \"\";\nexport const DEFAULT_STAFF_SERVICE_URL = \"https://api.kontur.ru/staff\";\nconst DEFAULT_PICKLIST_URL = \"\";\nconst DEFAULT_NIDUS_URL = \"\";\nconst DEFAULT_FSPRINTER_URL = \"\";\nconst DEFAULT_CONTRACTORS_URL = \"\";\nconst DEFAULT_PERSONS_URL = \"\";\n\nexport const defaultServicesUrls = {\n keformsUrl: DEFAULT_KEFORMS_URL,\n staffServiceUrl: DEFAULT_STAFF_SERVICE_URL,\n picklistUrl: DEFAULT_PICKLIST_URL,\n nidusUrl: DEFAULT_NIDUS_URL,\n fsPrinterUrl: DEFAULT_FSPRINTER_URL,\n contractorsApiUrl: DEFAULT_CONTRACTORS_URL,\n personsApiUrl: DEFAULT_PERSONS_URL,\n};\n"],"mappings":";;;;;;AAAA,MAAMA,mBAAmB,GAAG,EAAE;AACvB,MAAMC,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG,6BAA6B;AACtE,MAAME,oBAAoB,GAAG,EAAE;AAC/B,MAAMC,iBAAiB,GAAG,EAAE;AAC5B,MAAMC,qBAAqB,GAAG,EAAE;AAChC,MAAMC,uBAAuB,GAAG,EAAE;AAClC,MAAMC,mBAAmB,GAAG,EAAE;AAEvB,MAAMC,mBAAmB,GAAAN,OAAA,CAAAM,mBAAA,GAAG;EAC/BC,UAAU,EAAET,mBAAmB;EAC/BU,eAAe,EAAET,yBAAyB;EAC1CU,WAAW,EAAER,oBAAoB;EACjCS,QAAQ,EAAER,iBAAiB;EAC3BS,YAAY,EAAER,qBAAqB;EACnCS,iBAAiB,EAAER,uBAAuB;EAC1CS,aAAa,EAAER;AACnB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"DefaultServicesUrls.js","names":["DEFAULT_KEFORMS_URL","DEFAULT_STAFF_SERVICE_URL","exports","DEFAULT_PICKLIST_URL","DEFAULT_NIDUS_URL","DEFAULT_FSPRINTER_URL","DEFAULT_CONTRACTORS_URL","defaultServicesUrls","keformsUrl","staffServiceUrl","picklistUrl","nidusUrl","fsPrinterUrl","contractorsApiUrl"],"sources":["../../../../Common/CommonConstants/DefaultServicesUrls.ts"],"sourcesContent":["const DEFAULT_KEFORMS_URL = \"\";\nexport const DEFAULT_STAFF_SERVICE_URL = \"https://api.kontur.ru/staff\";\nconst DEFAULT_PICKLIST_URL = \"\";\nconst DEFAULT_NIDUS_URL = \"\";\nconst DEFAULT_FSPRINTER_URL = \"\";\nconst DEFAULT_CONTRACTORS_URL = \"\";\n\nexport const defaultServicesUrls = {\n keformsUrl: DEFAULT_KEFORMS_URL,\n staffServiceUrl: DEFAULT_STAFF_SERVICE_URL,\n picklistUrl: DEFAULT_PICKLIST_URL,\n nidusUrl: DEFAULT_NIDUS_URL,\n fsPrinterUrl: DEFAULT_FSPRINTER_URL,\n contractorsApiUrl: DEFAULT_CONTRACTORS_URL,\n};\n"],"mappings":";;;;;;AAAA,MAAMA,mBAAmB,GAAG,EAAE;AACvB,MAAMC,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG,6BAA6B;AACtE,MAAME,oBAAoB,GAAG,EAAE;AAC/B,MAAMC,iBAAiB,GAAG,EAAE;AAC5B,MAAMC,qBAAqB,GAAG,EAAE;AAChC,MAAMC,uBAAuB,GAAG,EAAE;AAE3B,MAAMC,mBAAmB,GAAAL,OAAA,CAAAK,mBAAA,GAAG;EAC/BC,UAAU,EAAER,mBAAmB;EAC/BS,eAAe,EAAER,yBAAyB;EAC1CS,WAAW,EAAEP,oBAAoB;EACjCQ,QAAQ,EAAEP,iBAAiB;EAC3BQ,YAAY,EAAEP,qBAAqB;EACnCQ,iBAAiB,EAAEP;AACvB,CAAC","ignoreList":[]}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.clamp = clamp;
7
7
  exports.clampUInt = clampUInt;
8
+ exports.inRange = inRange;
8
9
  exports.sign = sign;
9
10
  function clamp(value, min, max) {
10
11
  if (value > max) {
@@ -29,4 +30,7 @@ function sign(value) {
29
30
  }
30
31
  return 0;
31
32
  }
33
+ function inRange(value, min, max) {
34
+ return value >= min && value <= max;
35
+ }
32
36
  //# sourceMappingURL=IntRangeUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IntRangeUtils.js","names":["clamp","value","min","max","clampUInt","result","sign"],"sources":["../../../Common/IntRangeUtils.ts"],"sourcesContent":["type Length<T extends unknown[]> = T extends { length: infer L } ? (L extends number ? L : never) : never;\n\ntype BuildTuple<L extends number, T extends unknown[] = []> = T extends { length: L }\n ? T\n : BuildTuple<L, [...T, unknown]>;\n\ntype Add<A extends number, B extends number> = Length<[...BuildTuple<A>, ...BuildTuple<B>]>;\n\nexport type IntRange<TMin extends number, TMax extends number> = TMin extends TMax\n ? TMin\n : TMin | IntRange<Add<TMin, 1>, TMax>;\n\nexport function clamp(value: number, min: number, max: number): number {\n if (value > max) {\n return max;\n }\n if (value < min) {\n return min;\n }\n return value;\n}\n\nexport function clampUInt<TLeft extends number, TRight extends number>(\n value: number,\n min: TLeft,\n max: TRight\n): IntRange<TLeft, TRight> {\n const result: number = clamp(value, min, max);\n // @ts-ignore\n return result;\n}\n\nexport function sign(value: number): -1 | 0 | 1 {\n if (value < 0) {\n return -1;\n }\n if (value > 0) {\n return 1;\n }\n return 0;\n}\n"],"mappings":";;;;;;;;AAYO,SAASA,KAAKA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAU;EACnE,IAAIF,KAAK,GAAGE,GAAG,EAAE;IACb,OAAOA,GAAG;EACd;EACA,IAAIF,KAAK,GAAGC,GAAG,EAAE;IACb,OAAOA,GAAG;EACd;EACA,OAAOD,KAAK;AAChB;AAEO,SAASG,SAASA,CACrBH,KAAa,EACbC,GAAU,EACVC,GAAW,EACY;EACvB,MAAME,MAAc,GAAGL,KAAK,CAACC,KAAK,EAAEC,GAAG,EAAEC,GAAG,CAAC;EAC7C;EACA,OAAOE,MAAM;AACjB;AAEO,SAASC,IAAIA,CAACL,KAAa,EAAc;EAC5C,IAAIA,KAAK,GAAG,CAAC,EAAE;IACX,OAAO,CAAC,CAAC;EACb;EACA,IAAIA,KAAK,GAAG,CAAC,EAAE;IACX,OAAO,CAAC;EACZ;EACA,OAAO,CAAC;AACZ","ignoreList":[]}
1
+ {"version":3,"file":"IntRangeUtils.js","names":["clamp","value","min","max","clampUInt","result","sign","inRange"],"sources":["../../../Common/IntRangeUtils.ts"],"sourcesContent":["type Length<T extends unknown[]> = T extends { length: infer L } ? (L extends number ? L : never) : never;\n\ntype BuildTuple<L extends number, T extends unknown[] = []> = T extends { length: L }\n ? T\n : BuildTuple<L, [...T, unknown]>;\n\ntype Add<A extends number, B extends number> = Length<[...BuildTuple<A>, ...BuildTuple<B>]>;\n\nexport type IntRange<TMin extends number, TMax extends number> = TMin extends TMax\n ? TMin\n : TMin | IntRange<Add<TMin, 1>, TMax>;\n\nexport function clamp(value: number, min: number, max: number): number {\n if (value > max) {\n return max;\n }\n if (value < min) {\n return min;\n }\n return value;\n}\n\nexport function clampUInt<TLeft extends number, TRight extends number>(\n value: number,\n min: TLeft,\n max: TRight\n): IntRange<TLeft, TRight> {\n const result: number = clamp(value, min, max);\n // @ts-ignore\n return result;\n}\n\nexport function sign(value: number): -1 | 0 | 1 {\n if (value < 0) {\n return -1;\n }\n if (value > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function inRange(value: number, min: number, max: number): boolean {\n return value >= min && value <= max;\n}\n"],"mappings":";;;;;;;;;AAYO,SAASA,KAAKA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAU;EACnE,IAAIF,KAAK,GAAGE,GAAG,EAAE;IACb,OAAOA,GAAG;EACd;EACA,IAAIF,KAAK,GAAGC,GAAG,EAAE;IACb,OAAOA,GAAG;EACd;EACA,OAAOD,KAAK;AAChB;AAEO,SAASG,SAASA,CACrBH,KAAa,EACbC,GAAU,EACVC,GAAW,EACY;EACvB,MAAME,MAAc,GAAGL,KAAK,CAACC,KAAK,EAAEC,GAAG,EAAEC,GAAG,CAAC;EAC7C;EACA,OAAOE,MAAM;AACjB;AAEO,SAASC,IAAIA,CAACL,KAAa,EAAc;EAC5C,IAAIA,KAAK,GAAG,CAAC,EAAE;IACX,OAAO,CAAC,CAAC;EACb;EACA,IAAIA,KAAK,GAAG,CAAC,EAAE;IACX,OAAO,CAAC;EACZ;EACA,OAAO,CAAC;AACZ;AAEO,SAASM,OAAOA,CAACN,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAW;EACtE,OAAOF,KAAK,IAAIC,GAAG,IAAID,KAAK,IAAIE,GAAG;AACvC","ignoreList":[]}
@@ -7,6 +7,7 @@ exports.arrayHasAtLeastOneItem = arrayHasAtLeastOneItem;
7
7
  exports.arrayHasLength = arrayHasLength;
8
8
  exports.arrayIsNotEmpty = arrayIsNotEmpty;
9
9
  exports.assertIs = assertIs;
10
+ exports.castToError = castToError;
10
11
  exports.ensureAndGetString = ensureAndGetString;
11
12
  exports.ensureArrayHasLength = ensureArrayHasLength;
12
13
  exports.ensureArrayIsNotEmpty = ensureArrayIsNotEmpty;
@@ -39,6 +40,9 @@ function stringifyUnknownError(error) {
39
40
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
40
41
  return typeof error === "object" && (error === null || error === void 0 ? void 0 : error["message"]);
41
42
  }
43
+ function castToError(unknown) {
44
+ return unknown instanceof Error ? unknown : new Error(String(unknown));
45
+ }
42
46
  function ensureNotNullOrUndefined(input, message) {
43
47
  if (!isNotNullOrUndefined(input)) {
44
48
  throw new Error(message !== null && message !== void 0 ? message : `Value must be defined`);
@@ -1 +1 @@
1
- {"version":3,"file":"TypingUtils.js","names":["isNotNullOrUndefined","input","undefined","stringifyUnknownError","error","ensureNotNullOrUndefined","message","Error","ensureHasFunctionType","noop","reject","isLengthGreaterThenOrEqual","items","minLength","length","minLengthOrUndefined","ensureIsArray","Array","isArray","arrayHasLength","arrayIsNotEmpty","arrayHasAtLeastOneItem","ensureArrayIsNotEmpty","ensureArrayHasLength","ensureArrayLengthGreaterThenOrEqual","isOneOf","value","array","includes","exports","ensureNever","_neverArgument","ensureAndGetString","neverArgument","runAsyncAction","action","isNullOrEmpty","isNotNullOrEmpty","isNullOrWhiteSpace","trim","trimLastSlash","url","slice","assertIs","_"],"sources":["../../../Common/TypingUtils.ts"],"sourcesContent":["/***\n * Строготипизированная замена для Boolean(...)\n * Обычно используется для [...].filter(isNotNullOrUndefined)\n */\nexport function isNotNullOrUndefined<T>(input: T): input is NonNullable<T> {\n return input != undefined;\n}\n\nexport function stringifyUnknownError(error: unknown): undefined | string {\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof error === \"object\" && error?.[\"message\"];\n}\n\nexport function ensureNotNullOrUndefined<T>(input: T, message?: string): asserts input is NonNullable<T> {\n if (!isNotNullOrUndefined(input)) {\n throw new Error(message ?? `Value must be defined`);\n }\n}\n\nexport function ensureHasFunctionType(input: unknown, message?: string): asserts input is Function {\n if (typeof input !== \"function\") {\n throw new Error(message ?? `Value must be defined`);\n }\n}\n\nexport function noop(): void {\n // noop\n}\n\nexport type ErrorFirstCallback<T> = (...args: [Error, null | undefined] | [null | undefined, T] | [Error]) => void;\n\nexport function reject(message?: string | Error): never {\n if (message instanceof Error) {\n throw message;\n }\n throw new Error(message ?? \"Undefined is not allowed\");\n}\n\ntype ArrayOfLength<TItem, TLength extends number, TRest extends TItem[] = []> = TRest extends { length: TLength }\n ? TRest\n : ArrayOfLength<TItem, TLength, [TItem, ...TRest]>;\n\nexport type MinLengthArray<TItem, TLength extends number, TRest extends TItem[] = []> = TRest extends {\n length: TLength;\n}\n ? [...TRest, ...TItem[]]\n : MinLengthArray<TItem, TLength, [...TRest, TItem]>;\n\nexport function isLengthGreaterThenOrEqual<T, TNum extends number>(\n items: readonly T[],\n minLength: TNum\n): items is MinLengthArray<T, TNum> {\n return items.length >= minLength;\n}\n\nexport function minLengthOrUndefined<T, TNum extends number>(\n items: T[],\n minLength: TNum\n): undefined | MinLengthArray<T, TNum> {\n if (isLengthGreaterThenOrEqual(items, minLength)) {\n return items;\n }\n return undefined;\n}\n\nexport function ensureIsArray<T>(items: unknown): T[] {\n if (!Array.isArray(items)) {\n throw new Error(`Must be an array!`);\n }\n return items as T[];\n}\n\nexport function arrayHasLength<T, TNum extends number>(\n items: readonly T[],\n length: TNum\n): items is ArrayOfLength<T, TNum> {\n return items.length === length;\n}\n\nexport function arrayIsNotEmpty<T>(items: readonly T[]): items is MinLengthArray<T, 1> {\n return items.length > 0;\n}\n\nexport function arrayHasAtLeastOneItem<T>(items: readonly T[]): items is MinLengthArray<T, 1> {\n return items.length > 0;\n}\n\nexport function ensureArrayIsNotEmpty<T>(items: readonly T[], message?: string): asserts items is MinLengthArray<T, 1> {\n if (!arrayIsNotEmpty(items)) {\n throw new Error(message ?? `Array must be not empty`);\n }\n}\n\nexport function ensureArrayHasLength<T, TNum extends number>(\n items: readonly T[],\n length: TNum\n): asserts items is ArrayOfLength<T, TNum> {\n if (!arrayHasLength(items, length)) {\n throw new Error(`Array should has length ${length}`);\n }\n}\n\nexport function ensureArrayLengthGreaterThenOrEqual<T, TNum extends number>(\n items: readonly T[],\n length: TNum\n): asserts items is ArrayOfLength<T, TNum> {\n if (!isLengthGreaterThenOrEqual(items, length)) {\n throw new Error(`Array must have minimal length ${length}`);\n }\n}\n\n// проверяет, что родительский тип находится в массиве дочерних\nexport const isOneOf = <Value, Item extends Value>(value: Value, array: Item[]): value is Item =>\n array.includes(value as Item);\n\nexport function ensureNever(_neverArgument: never): void {\n // noop\n}\n\nexport function ensureAndGetString(neverArgument: never): string {\n return `${neverArgument}`;\n}\n\nexport function runAsyncAction(action: () => Promise<void>): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n action();\n}\n\nexport function isNullOrEmpty(input: string | undefined): input is undefined {\n return input == undefined || input === \"\";\n}\n\nexport function isNotNullOrEmpty(input: string | undefined): input is string {\n return !isNullOrEmpty(input);\n}\n\nexport function isNullOrWhiteSpace(input: string | undefined | null): input is undefined | null {\n return input == undefined || input.trim() === \"\";\n}\n\nexport function trimLastSlash(url: string): string {\n return url.slice(-1) === \"/\" ? url.slice(0, -1) : url;\n}\n\nexport function assertIs<T>(_: T): void {\n // noop\n}\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Array<infer U>\n ? Array<DeepPartial<U>> | { length?: number; [key: number]: DeepPartial<U> }\n : T[P] extends ReadonlyArray<infer U>\n ? ReadonlyArray<DeepPartial<U>>\n : DeepPartial<T[P]>;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TypingUtils.js","names":["isNotNullOrUndefined","input","undefined","stringifyUnknownError","error","castToError","unknown","Error","String","ensureNotNullOrUndefined","message","ensureHasFunctionType","noop","reject","isLengthGreaterThenOrEqual","items","minLength","length","minLengthOrUndefined","ensureIsArray","Array","isArray","arrayHasLength","arrayIsNotEmpty","arrayHasAtLeastOneItem","ensureArrayIsNotEmpty","ensureArrayHasLength","ensureArrayLengthGreaterThenOrEqual","isOneOf","value","array","includes","exports","ensureNever","_neverArgument","ensureAndGetString","neverArgument","runAsyncAction","action","isNullOrEmpty","isNotNullOrEmpty","isNullOrWhiteSpace","trim","trimLastSlash","url","slice","assertIs","_"],"sources":["../../../Common/TypingUtils.ts"],"sourcesContent":["/***\n * Строготипизированная замена для Boolean(...)\n * Обычно используется для [...].filter(isNotNullOrUndefined)\n */\nexport function isNotNullOrUndefined<T>(input: T): input is NonNullable<T> {\n return input != undefined;\n}\n\nexport function stringifyUnknownError(error: unknown): undefined | string {\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof error === \"object\" && error?.[\"message\"];\n}\n\nexport function castToError(unknown: unknown): Error {\n return unknown instanceof Error ? unknown : new Error(String(unknown));\n}\n\nexport function ensureNotNullOrUndefined<T>(input: T, message?: string): asserts input is NonNullable<T> {\n if (!isNotNullOrUndefined(input)) {\n throw new Error(message ?? `Value must be defined`);\n }\n}\n\nexport function ensureHasFunctionType(input: unknown, message?: string): asserts input is Function {\n if (typeof input !== \"function\") {\n throw new Error(message ?? `Value must be defined`);\n }\n}\n\nexport function noop(): void {\n // noop\n}\n\nexport type ErrorFirstCallback<T> = (...args: [Error, null | undefined] | [null | undefined, T] | [Error]) => void;\n\nexport function reject(message?: string | Error): never {\n if (message instanceof Error) {\n throw message;\n }\n throw new Error(message ?? \"Undefined is not allowed\");\n}\n\ntype ArrayOfLength<TItem, TLength extends number, TRest extends TItem[] = []> = TRest extends { length: TLength }\n ? TRest\n : ArrayOfLength<TItem, TLength, [TItem, ...TRest]>;\n\nexport type MinLengthArray<TItem, TLength extends number, TRest extends TItem[] = []> = TRest extends {\n length: TLength;\n}\n ? [...TRest, ...TItem[]]\n : MinLengthArray<TItem, TLength, [...TRest, TItem]>;\n\nexport function isLengthGreaterThenOrEqual<T, TNum extends number>(\n items: readonly T[],\n minLength: TNum\n): items is MinLengthArray<T, TNum> {\n return items.length >= minLength;\n}\n\nexport function minLengthOrUndefined<T, TNum extends number>(\n items: T[],\n minLength: TNum\n): undefined | MinLengthArray<T, TNum> {\n if (isLengthGreaterThenOrEqual(items, minLength)) {\n return items;\n }\n return undefined;\n}\n\nexport function ensureIsArray<T>(items: unknown): T[] {\n if (!Array.isArray(items)) {\n throw new Error(`Must be an array!`);\n }\n return items as T[];\n}\n\nexport function arrayHasLength<T, TNum extends number>(\n items: readonly T[],\n length: TNum\n): items is ArrayOfLength<T, TNum> {\n return items.length === length;\n}\n\nexport function arrayIsNotEmpty<T>(items: readonly T[]): items is MinLengthArray<T, 1> {\n return items.length > 0;\n}\n\nexport function arrayHasAtLeastOneItem<T>(items: readonly T[]): items is MinLengthArray<T, 1> {\n return items.length > 0;\n}\n\nexport function ensureArrayIsNotEmpty<T>(items: readonly T[], message?: string): asserts items is MinLengthArray<T, 1> {\n if (!arrayIsNotEmpty(items)) {\n throw new Error(message ?? `Array must be not empty`);\n }\n}\n\nexport function ensureArrayHasLength<T, TNum extends number>(\n items: readonly T[],\n length: TNum\n): asserts items is ArrayOfLength<T, TNum> {\n if (!arrayHasLength(items, length)) {\n throw new Error(`Array should has length ${length}`);\n }\n}\n\nexport function ensureArrayLengthGreaterThenOrEqual<T, TNum extends number>(\n items: readonly T[],\n length: TNum\n): asserts items is ArrayOfLength<T, TNum> {\n if (!isLengthGreaterThenOrEqual(items, length)) {\n throw new Error(`Array must have minimal length ${length}`);\n }\n}\n\n// проверяет, что родительский тип находится в массиве дочерних\nexport const isOneOf = <Value, Item extends Value>(value: Value, array: Item[]): value is Item =>\n array.includes(value as Item);\n\nexport function ensureNever(_neverArgument: never): void {\n // noop\n}\n\nexport function ensureAndGetString(neverArgument: never): string {\n return `${neverArgument}`;\n}\n\nexport function runAsyncAction(action: () => Promise<void>): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n action();\n}\n\nexport function isNullOrEmpty(input: string | undefined): input is undefined {\n return input == undefined || input === \"\";\n}\n\nexport function isNotNullOrEmpty(input: string | undefined): input is string {\n return !isNullOrEmpty(input);\n}\n\nexport function isNullOrWhiteSpace(input: string | undefined | null): input is undefined | null {\n return input == undefined || input.trim() === \"\";\n}\n\nexport function trimLastSlash(url: string): string {\n return url.slice(-1) === \"/\" ? url.slice(0, -1) : url;\n}\n\nexport function assertIs<T>(_: T): void {\n // noop\n}\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Array<infer U>\n ? Array<DeepPartial<U>> | { length?: number; [key: number]: DeepPartial<U> }\n : T[P] extends ReadonlyArray<infer U>\n ? ReadonlyArray<DeepPartial<U>>\n : DeepPartial<T[P]>;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Channel = void 0;
7
+ var _LinkedList = require("../ds/LinkedList");
8
+ /**
9
+ * @remarks
10
+ * - `readSync() === undefined` при пустой очереди неотличим от `write(undefined)`
11
+ * - `Promise.resolve(value)` и `resolve(value)` разворачивают `thenable`,
12
+ * поэтому `Channel<Promise<T>>` не сохранит промис как значение.
13
+ */
14
+ class Channel {
15
+ constructor() {
16
+ this.closed = false;
17
+ this.values = void 0;
18
+ this.waiters = void 0;
19
+ this.values = new _LinkedList.LinkedList();
20
+ this.waiters = new _LinkedList.LinkedList();
21
+ }
22
+ write(value) {
23
+ this.ensureOpen();
24
+ if (this.waiters.notEmpty()) {
25
+ const {
26
+ resolve
27
+ } = this.waiters.shift();
28
+ resolve(value);
29
+ } else {
30
+ this.values.push(value);
31
+ }
32
+ }
33
+ read() {
34
+ this.ensureOpen();
35
+ if (this.values.notEmpty()) {
36
+ return Promise.resolve(this.values.shift());
37
+ }
38
+ return new Promise((resolve, reject) => {
39
+ this.waiters.push({
40
+ resolve: resolve,
41
+ reject: reject
42
+ });
43
+ });
44
+ }
45
+ readSync() {
46
+ this.ensureOpen();
47
+ return this.values.shift();
48
+ }
49
+ close(msg) {
50
+ this.closed = true;
51
+ this.waiters.forEach(w => w.reject(new Error("Channel: closed", {
52
+ cause: msg && new Error(msg)
53
+ })));
54
+ this.waiters.clear();
55
+ this.values.clear();
56
+ }
57
+ ensureOpen() {
58
+ if (this.closed) {
59
+ throw new Error("Channel: interaction on closed");
60
+ }
61
+ }
62
+ }
63
+ exports.Channel = Channel;
64
+ //# sourceMappingURL=Channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Channel.js","names":["_LinkedList","require","Channel","constructor","closed","values","waiters","LinkedList","write","value","ensureOpen","notEmpty","resolve","shift","push","read","Promise","reject","readSync","close","msg","forEach","w","Error","cause","clear","exports"],"sources":["../../../../Common/async/Channel.ts"],"sourcesContent":["import { LinkedList } from \"../ds/LinkedList\";\n\ninterface Waiter<Item> {\n resolve: (item: Item) => void;\n reject: (reason: unknown) => void;\n}\n\n/**\n * @remarks\n * - `readSync() === undefined` при пустой очереди неотличим от `write(undefined)`\n * - `Promise.resolve(value)` и `resolve(value)` разворачивают `thenable`,\n * поэтому `Channel<Promise<T>>` не сохранит промис как значение.\n */\nexport class Channel<Item> {\n private closed = false;\n private readonly values: LinkedList<Item>;\n private readonly waiters: LinkedList<Waiter<Item>>;\n\n public constructor() {\n this.values = new LinkedList();\n this.waiters = new LinkedList();\n }\n\n public write(value: Item): void {\n this.ensureOpen();\n if (this.waiters.notEmpty()) {\n const { resolve } = this.waiters.shift();\n resolve(value);\n } else {\n this.values.push(value);\n }\n }\n\n public read(): Promise<Item> {\n this.ensureOpen();\n if (this.values.notEmpty()) {\n return Promise.resolve(this.values.shift());\n }\n return new Promise((resolve, reject) => {\n this.waiters.push({ resolve: resolve, reject: reject });\n });\n }\n\n public readSync(): Item | undefined {\n this.ensureOpen();\n return this.values.shift();\n }\n\n public close(msg?: string): void {\n this.closed = true;\n this.waiters.forEach(w => w.reject(new Error(\"Channel: closed\", { cause: msg && new Error(msg) })));\n this.waiters.clear();\n this.values.clear();\n }\n\n private ensureOpen() {\n if (this.closed) {\n throw new Error(\"Channel: interaction on closed\");\n }\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAOA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,OAAO,CAAO;EAKhBC,WAAWA,CAAA,EAAG;IAAA,KAJbC,MAAM,GAAG,KAAK;IAAA,KACLC,MAAM;IAAA,KACNC,OAAO;IAGpB,IAAI,CAACD,MAAM,GAAG,IAAIE,sBAAU,CAAC,CAAC;IAC9B,IAAI,CAACD,OAAO,GAAG,IAAIC,sBAAU,CAAC,CAAC;EACnC;EAEOC,KAAKA,CAACC,KAAW,EAAQ;IAC5B,IAAI,CAACC,UAAU,CAAC,CAAC;IACjB,IAAI,IAAI,CAACJ,OAAO,CAACK,QAAQ,CAAC,CAAC,EAAE;MACzB,MAAM;QAAEC;MAAQ,CAAC,GAAG,IAAI,CAACN,OAAO,CAACO,KAAK,CAAC,CAAC;MACxCD,OAAO,CAACH,KAAK,CAAC;IAClB,CAAC,MAAM;MACH,IAAI,CAACJ,MAAM,CAACS,IAAI,CAACL,KAAK,CAAC;IAC3B;EACJ;EAEOM,IAAIA,CAAA,EAAkB;IACzB,IAAI,CAACL,UAAU,CAAC,CAAC;IACjB,IAAI,IAAI,CAACL,MAAM,CAACM,QAAQ,CAAC,CAAC,EAAE;MACxB,OAAOK,OAAO,CAACJ,OAAO,CAAC,IAAI,CAACP,MAAM,CAACQ,KAAK,CAAC,CAAC,CAAC;IAC/C;IACA,OAAO,IAAIG,OAAO,CAAC,CAACJ,OAAO,EAAEK,MAAM,KAAK;MACpC,IAAI,CAACX,OAAO,CAACQ,IAAI,CAAC;QAAEF,OAAO,EAAEA,OAAO;QAAEK,MAAM,EAAEA;MAAO,CAAC,CAAC;IAC3D,CAAC,CAAC;EACN;EAEOC,QAAQA,CAAA,EAAqB;IAChC,IAAI,CAACR,UAAU,CAAC,CAAC;IACjB,OAAO,IAAI,CAACL,MAAM,CAACQ,KAAK,CAAC,CAAC;EAC9B;EAEOM,KAAKA,CAACC,GAAY,EAAQ;IAC7B,IAAI,CAAChB,MAAM,GAAG,IAAI;IAClB,IAAI,CAACE,OAAO,CAACe,OAAO,CAACC,CAAC,IAAIA,CAAC,CAACL,MAAM,CAAC,IAAIM,KAAK,CAAC,iBAAiB,EAAE;MAAEC,KAAK,EAAEJ,GAAG,IAAI,IAAIG,KAAK,CAACH,GAAG;IAAE,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,CAACd,OAAO,CAACmB,KAAK,CAAC,CAAC;IACpB,IAAI,CAACpB,MAAM,CAACoB,KAAK,CAAC,CAAC;EACvB;EAEQf,UAAUA,CAAA,EAAG;IACjB,IAAI,IAAI,CAACN,MAAM,EAAE;MACb,MAAM,IAAImB,KAAK,CAAC,gCAAgC,CAAC;IACrD;EACJ;AACJ;AAACG,OAAA,CAAAxB,OAAA,GAAAA,OAAA","ignoreList":[]}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AsyncPool = void 0;
7
+ var _TypingUtils = require("../../TypingUtils");
8
+ var _Channel = require("../Channel");
9
+ var _Registry = require("./Registry");
10
+ /**
11
+ * Базовый пул, предоставляющий:
12
+ * - `exec` - безопасный доступ к элементу
13
+ * - `add` - расширение
14
+ * - `evict` - сокращение
15
+ * - `dispose` - уничтожение
16
+ */
17
+ class AsyncPool {
18
+ constructor() {
19
+ this.disposed = false;
20
+ this.registry = new _Registry.Registry();
21
+ this.idles = new _Channel.Channel();
22
+ this.running = 0;
23
+ this.destroying = new Set();
24
+ this.shutdownSignal = Promise.withResolvers();
25
+ }
26
+ /**
27
+ * Добавляет элемент в пул и делает его немедленно доступным.
28
+ *
29
+ * @throws если `item` уже присутствует в пуле.
30
+ */
31
+ add(item) {
32
+ this.ensureAlive();
33
+ this.registry.add(item);
34
+ this.idles.write(item);
35
+ }
36
+
37
+ /**
38
+ * Уменьшает ёмкость пула на один элемент.
39
+ *
40
+ * - Если есть свободный элемент — удаляет его немедленно.
41
+ * - Если все элементы заняты — помечает один из них `Doomed`:
42
+ * при следующем `release` он будет отброшен, а не возвращён в пул.
43
+ * - Если пул пуст — не делает ничего.
44
+ *
45
+ * @returns `true`, если ёмкость была уменьшена; `false`, если пул уже пуст.
46
+ */
47
+ evict() {
48
+ this.ensureAlive();
49
+ const idle = this.idles.readSync();
50
+ if (idle !== undefined) {
51
+ this.destroy(idle);
52
+ return true;
53
+ }
54
+ const busy = this.registry.findBusy();
55
+ if (busy) {
56
+ this.registry.doom(busy);
57
+ return true;
58
+ }
59
+ return false;
60
+ }
61
+
62
+ /**
63
+ * Захватывает свободный элемент пула, вызывает `await fn(item)` и возвращает элемент обратно.
64
+ *
65
+ * - Если нет свободного элемента — ожидает появления (блокирует вызов).
66
+ * - Ожидающие вызовы получают элемент в порядке FIFO.
67
+ * - Ошибка внутри `fn` пробрасывается вызывающей стороне.
68
+ *
69
+ * @remarks
70
+ * Подразумевается, что `fn` всегда `await`-ит I/O-bound операцию,
71
+ * что разрывает цепочку микрозадач и даёт event loop провернуться.
72
+ * Поэтому оборачивание в `setTimeout(resolve, 0)` не производится.
73
+ *
74
+ * @warn
75
+ * Вложенный `exec` на пуле размера 1, вызванный из `fn` с `await`,
76
+ * приведёт к дедлоку: outer ждёт inner, inner ждёт освобождения outer.
77
+ */
78
+ async exec(fn) {
79
+ this.ensureAlive();
80
+ const item = await this.capture();
81
+ try {
82
+ this.running++;
83
+ return await fn(item);
84
+ } finally {
85
+ this.release(item);
86
+ this.running--;
87
+ if (this.disposed && this.running === 0) {
88
+ this.shutdownSignal.resolve();
89
+ }
90
+ }
91
+ }
92
+ async dispose() {
93
+ if (!this.disposed) {
94
+ this.disposed = true;
95
+ this.idles.close("Pool disposed");
96
+ this.releaseAll();
97
+ }
98
+ await this.shutdown();
99
+ }
100
+ releaseAll() {
101
+ const idles = this.registry.doomAll();
102
+ idles.forEach(i => this.release(i));
103
+ }
104
+ async shutdown() {
105
+ if (this.running > 0) {
106
+ await this.shutdownSignal.promise;
107
+ }
108
+ await Promise.allSettled(this.destroying);
109
+ }
110
+ async capture() {
111
+ const item = await this.idles.read();
112
+ return this.registry.capture(item);
113
+ }
114
+ release(item) {
115
+ const state = this.registry.stateOf(item);
116
+ switch (state) {
117
+ case _Registry.State.Busy:
118
+ return this.free(item);
119
+ case _Registry.State.Doomed:
120
+ return this.destroy(item);
121
+ case _Registry.State.Idle:
122
+ throw new Error("Pool: release not captured");
123
+ default:
124
+ return (0, _TypingUtils.ensureNever)(state);
125
+ }
126
+ }
127
+ free(item) {
128
+ this.registry.free(item);
129
+ this.idles.write(item);
130
+ }
131
+ destroy(item) {
132
+ this.registry.remove(item);
133
+ const promise = Promise.try(() => item.dispose());
134
+ this.destroying.add(promise);
135
+ // в destroying нужны лишь незавершенные item.dispose
136
+ promise.catch(_TypingUtils.noop).finally(() => this.destroying.delete(promise));
137
+ }
138
+ ensureAlive() {
139
+ if (this.disposed) {
140
+ throw new Error("Pool: interaction on disposed");
141
+ }
142
+ }
143
+ }
144
+ exports.AsyncPool = AsyncPool;
145
+ //# sourceMappingURL=AsyncPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncPool.js","names":["_TypingUtils","require","_Channel","_Registry","AsyncPool","constructor","disposed","registry","Registry","idles","Channel","running","destroying","Set","shutdownSignal","Promise","withResolvers","add","item","ensureAlive","write","evict","idle","readSync","undefined","destroy","busy","findBusy","doom","exec","fn","capture","release","resolve","dispose","close","releaseAll","shutdown","doomAll","forEach","i","promise","allSettled","read","state","stateOf","State","Busy","free","Doomed","Idle","Error","ensureNever","remove","try","catch","noop","finally","delete","exports"],"sources":["../../../../../Common/async/pool/AsyncPool.ts"],"sourcesContent":["import { ensureNever, noop } from \"../../TypingUtils\";\nimport { Channel } from \"../Channel\";\n\nimport { Registry, State } from \"./Registry\";\n\nexport interface Disposable extends NonNullable<unknown> {\n dispose: () => Promise<void>;\n}\n\n/**\n * Базовый пул, предоставляющий:\n * - `exec` - безопасный доступ к элементу\n * - `add` - расширение\n * - `evict` - сокращение\n * - `dispose` - уничтожение\n */\nexport class AsyncPool<Item extends Disposable> {\n private disposed = false;\n private readonly registry = new Registry<Item>();\n private readonly idles = new Channel<Item>();\n private running = 0;\n private readonly destroying = new Set<Promise<void>>();\n private readonly shutdownSignal = Promise.withResolvers<void>();\n\n /**\n * Добавляет элемент в пул и делает его немедленно доступным.\n *\n * @throws если `item` уже присутствует в пуле.\n */\n public add(item: Item): void {\n this.ensureAlive();\n this.registry.add(item);\n this.idles.write(item);\n }\n\n /**\n * Уменьшает ёмкость пула на один элемент.\n *\n * - Если есть свободный элемент — удаляет его немедленно.\n * - Если все элементы заняты — помечает один из них `Doomed`:\n * при следующем `release` он будет отброшен, а не возвращён в пул.\n * - Если пул пуст — не делает ничего.\n *\n * @returns `true`, если ёмкость была уменьшена; `false`, если пул уже пуст.\n */\n public evict(): boolean {\n this.ensureAlive();\n const idle = this.idles.readSync();\n if (idle !== undefined) {\n this.destroy(idle);\n return true;\n }\n const busy = this.registry.findBusy();\n if (busy) {\n this.registry.doom(busy);\n return true;\n }\n return false;\n }\n\n /**\n * Захватывает свободный элемент пула, вызывает `await fn(item)` и возвращает элемент обратно.\n *\n * - Если нет свободного элемента — ожидает появления (блокирует вызов).\n * - Ожидающие вызовы получают элемент в порядке FIFO.\n * - Ошибка внутри `fn` пробрасывается вызывающей стороне.\n *\n * @remarks\n * Подразумевается, что `fn` всегда `await`-ит I/O-bound операцию,\n * что разрывает цепочку микрозадач и даёт event loop провернуться.\n * Поэтому оборачивание в `setTimeout(resolve, 0)` не производится.\n *\n * @warn\n * Вложенный `exec` на пуле размера 1, вызванный из `fn` с `await`,\n * приведёт к дедлоку: outer ждёт inner, inner ждёт освобождения outer.\n */\n public async exec<R>(fn: (item: Item) => Promise<R>): Promise<R> {\n this.ensureAlive();\n const item = await this.capture();\n try {\n this.running++;\n return await fn(item);\n } finally {\n this.release(item);\n this.running--;\n if (this.disposed && this.running === 0) {\n this.shutdownSignal.resolve();\n }\n }\n }\n\n public async dispose(): Promise<void> {\n if (!this.disposed) {\n this.disposed = true;\n this.idles.close(\"Pool disposed\");\n this.releaseAll();\n }\n await this.shutdown();\n }\n\n private releaseAll() {\n const idles = this.registry.doomAll();\n idles.forEach(i => this.release(i));\n }\n\n private async shutdown(): Promise<void> {\n if (this.running > 0) {\n await this.shutdownSignal.promise;\n }\n await Promise.allSettled(this.destroying);\n }\n\n private async capture(): Promise<Item> {\n const item = await this.idles.read();\n return this.registry.capture(item);\n }\n\n private release(item: Item): void {\n const state = this.registry.stateOf(item);\n switch (state) {\n case State.Busy:\n return this.free(item);\n case State.Doomed:\n return this.destroy(item);\n case State.Idle:\n throw new Error(\"Pool: release not captured\");\n default:\n return ensureNever(state);\n }\n }\n\n private free(item: Item) {\n this.registry.free(item);\n this.idles.write(item);\n }\n\n private destroy(item: Item) {\n this.registry.remove(item);\n const promise = Promise.try(() => item.dispose());\n this.destroying.add(promise);\n // в destroying нужны лишь незавершенные item.dispose\n promise.catch(noop).finally(() => this.destroying.delete(promise));\n }\n\n private ensureAlive() {\n if (this.disposed) {\n throw new Error(\"Pool: interaction on disposed\");\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FixedPool = void 0;
7
+ var _LimitedPool = require("./LimitedPool");
8
+ class FixedPool {
9
+ constructor({
10
+ size,
11
+ fabric
12
+ }) {
13
+ this.pool = void 0;
14
+ /** Прокси на {@link LimitedPool.exec} */
15
+ this.exec = void 0;
16
+ /** Прокси на {@link LimitedPool.dispose} */
17
+ this.dispose = void 0;
18
+ this.pool = new _LimitedPool.LimitedPool({
19
+ min: size,
20
+ max: size,
21
+ size: size,
22
+ fabric: fabric
23
+ });
24
+ this.exec = this.pool.exec.bind(this.pool);
25
+ this.dispose = this.pool.dispose.bind(this.pool);
26
+ }
27
+ }
28
+ exports.FixedPool = FixedPool;
29
+ //# sourceMappingURL=FixedPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FixedPool.js","names":["_LimitedPool","require","FixedPool","constructor","size","fabric","pool","exec","dispose","LimitedPool","min","max","bind","exports"],"sources":["../../../../../Common/async/pool/FixedPool.ts"],"sourcesContent":["import type { Disposable } from \"./AsyncPool\";\nimport { LimitedPool } from \"./LimitedPool\";\n\ninterface Options<Item> {\n size: number;\n fabric: () => Item;\n}\n\nexport class FixedPool<Item extends Disposable> {\n private readonly pool: LimitedPool<Item>;\n\n public constructor({ size, fabric }: Options<Item>) {\n this.pool = new LimitedPool({ min: size, max: size, size: size, fabric: fabric });\n this.exec = this.pool.exec.bind(this.pool);\n this.dispose = this.pool.dispose.bind(this.pool);\n }\n\n /** Прокси на {@link LimitedPool.exec} */\n public exec: LimitedPool<Item>[\"exec\"];\n\n /** Прокси на {@link LimitedPool.dispose} */\n public dispose: LimitedPool<Item>[\"dispose\"];\n}\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAOO,MAAMC,SAAS,CAA0B;EAGrCC,WAAWA,CAAC;IAAEC,IAAI;IAAEC;EAAsB,CAAC,EAAE;IAAA,KAFnCC,IAAI;IAQrB;IAAA,KACOC,IAAI;IAEX;IAAA,KACOC,OAAO;IATV,IAAI,CAACF,IAAI,GAAG,IAAIG,wBAAW,CAAC;MAAEC,GAAG,EAAEN,IAAI;MAAEO,GAAG,EAAEP,IAAI;MAAEA,IAAI,EAAEA,IAAI;MAAEC,MAAM,EAAEA;IAAO,CAAC,CAAC;IACjF,IAAI,CAACE,IAAI,GAAG,IAAI,CAACD,IAAI,CAACC,IAAI,CAACK,IAAI,CAAC,IAAI,CAACN,IAAI,CAAC;IAC1C,IAAI,CAACE,OAAO,GAAG,IAAI,CAACF,IAAI,CAACE,OAAO,CAACI,IAAI,CAAC,IAAI,CAACN,IAAI,CAAC;EACpD;AAOJ;AAACO,OAAA,CAAAX,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LimitedPool = void 0;
7
+ var _IntRangeUtils = require("../../IntRangeUtils");
8
+ var _AsyncPool = require("./AsyncPool");
9
+ /**
10
+ * Создаёт пул ограниченной ёмкости, удерживая кол-во элементов в установленных лимитах.
11
+ *
12
+ * @param options.min нижняя граница ёмкости;
13
+ * @param options.max верхняя граница ёмкости;
14
+ * @param options.size начальная ёмкость;
15
+ * @param options.fabric фабрика элементов; вызывается ровно `size` раз при создании.
16
+ *
17
+ * @throws если `size < min` или `size > max`.
18
+ */
19
+ class LimitedPool {
20
+ constructor(options) {
21
+ this.size = void 0;
22
+ this.min = void 0;
23
+ this.max = void 0;
24
+ this.pool = void 0;
25
+ /** Прокси на {@link AsyncPool.exec} */
26
+ this.exec = void 0;
27
+ /** Прокси на {@link AsyncPool.dispose} */
28
+ this.dispose = void 0;
29
+ const {
30
+ size,
31
+ min,
32
+ max,
33
+ fabric
34
+ } = this.validateOptions(options);
35
+ this.size = size;
36
+ this.min = min;
37
+ this.max = max;
38
+ this.pool = new _AsyncPool.AsyncPool();
39
+ this.exec = this.pool.exec.bind(this.pool);
40
+ this.dispose = this.pool.dispose.bind(this.pool);
41
+ this.init(this.pool, size, fabric);
42
+ }
43
+ /**
44
+ * Добавляет элемент в пул, если текущая ёмкость ниже `max`.
45
+ */
46
+ add(item) {
47
+ if (this.size < this.max) {
48
+ this.pool.add(item);
49
+ this.size++;
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Уменьшает ёмкость пула на один элемент, если текущая ёмкость выше `min`.
55
+ *
56
+ * @returns `true`, если ёмкость была уменьшена; `false`, если пул уже на минимуме.
57
+ */
58
+ evict() {
59
+ const aboveTheLimit = this.size > this.min;
60
+ if (aboveTheLimit && this.pool.evict()) {
61
+ this.size--;
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ validateOptions(options) {
67
+ if ((0, _IntRangeUtils.inRange)(options.size, options.min, options.max)) {
68
+ return options;
69
+ } else {
70
+ throw new Error("LimitedPool: size must be between min and max");
71
+ }
72
+ }
73
+ init(pool, size, fabric) {
74
+ const initial = Array.from({
75
+ length: size
76
+ }, fabric);
77
+ initial.forEach(i => pool.add(i));
78
+ }
79
+ }
80
+ exports.LimitedPool = LimitedPool;
81
+ //# sourceMappingURL=LimitedPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LimitedPool.js","names":["_IntRangeUtils","require","_AsyncPool","LimitedPool","constructor","options","size","min","max","pool","exec","dispose","fabric","validateOptions","AsyncPool","bind","init","add","item","evict","aboveTheLimit","inRange","Error","initial","Array","from","length","forEach","i","exports"],"sources":["../../../../../Common/async/pool/LimitedPool.ts"],"sourcesContent":["import { inRange } from \"../../IntRangeUtils\";\n\nimport type { Disposable } from \"./AsyncPool\";\nimport { AsyncPool } from \"./AsyncPool\";\n\ninterface Options<Item> {\n min: number;\n max: number;\n size: number;\n fabric: () => Item;\n}\n\n/**\n * Создаёт пул ограниченной ёмкости, удерживая кол-во элементов в установленных лимитах.\n *\n * @param options.min нижняя граница ёмкости;\n * @param options.max верхняя граница ёмкости;\n * @param options.size начальная ёмкость;\n * @param options.fabric фабрика элементов; вызывается ровно `size` раз при создании.\n *\n * @throws если `size < min` или `size > max`.\n */\nexport class LimitedPool<Item extends Disposable> {\n private size: number;\n private readonly min: number;\n private readonly max: number;\n private readonly pool: AsyncPool<Item>;\n\n public constructor(options: Options<Item>) {\n const { size, min, max, fabric } = this.validateOptions(options);\n this.size = size;\n this.min = min;\n this.max = max;\n this.pool = new AsyncPool();\n this.exec = this.pool.exec.bind(this.pool);\n this.dispose = this.pool.dispose.bind(this.pool);\n this.init(this.pool, size, fabric);\n }\n\n /** Прокси на {@link AsyncPool.exec} */\n public exec: AsyncPool<Item>[\"exec\"];\n\n /** Прокси на {@link AsyncPool.dispose} */\n public dispose: AsyncPool<Item>[\"dispose\"];\n\n /**\n * Добавляет элемент в пул, если текущая ёмкость ниже `max`.\n */\n public add(item: Item): void {\n if (this.size < this.max) {\n this.pool.add(item);\n this.size++;\n }\n }\n\n /**\n * Уменьшает ёмкость пула на один элемент, если текущая ёмкость выше `min`.\n *\n * @returns `true`, если ёмкость была уменьшена; `false`, если пул уже на минимуме.\n */\n public evict(): boolean {\n const aboveTheLimit = this.size > this.min;\n if (aboveTheLimit && this.pool.evict()) {\n this.size--;\n return true;\n }\n return false;\n }\n\n private validateOptions(options: Options<Item>): Options<Item> {\n if (inRange(options.size, options.min, options.max)) {\n return options;\n } else {\n throw new Error(\"LimitedPool: size must be between min and max\");\n }\n }\n\n private init(pool: AsyncPool<Item>, size: number, fabric: () => Item): void {\n const initial = Array.from({ length: size }, fabric);\n initial.forEach(i => pool.add(i));\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAGA,IAAAC,UAAA,GAAAD,OAAA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,WAAW,CAA0B;EAMvCC,WAAWA,CAACC,OAAsB,EAAE;IAAA,KALnCC,IAAI;IAAA,KACKC,GAAG;IAAA,KACHC,GAAG;IAAA,KACHC,IAAI;IAarB;IAAA,KACOC,IAAI;IAEX;IAAA,KACOC,OAAO;IAdV,MAAM;MAAEL,IAAI;MAAEC,GAAG;MAAEC,GAAG;MAAEI;IAAO,CAAC,GAAG,IAAI,CAACC,eAAe,CAACR,OAAO,CAAC;IAChE,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,GAAG,GAAGA,GAAG;IACd,IAAI,CAACC,GAAG,GAAGA,GAAG;IACd,IAAI,CAACC,IAAI,GAAG,IAAIK,oBAAS,CAAC,CAAC;IAC3B,IAAI,CAACJ,IAAI,GAAG,IAAI,CAACD,IAAI,CAACC,IAAI,CAACK,IAAI,CAAC,IAAI,CAACN,IAAI,CAAC;IAC1C,IAAI,CAACE,OAAO,GAAG,IAAI,CAACF,IAAI,CAACE,OAAO,CAACI,IAAI,CAAC,IAAI,CAACN,IAAI,CAAC;IAChD,IAAI,CAACO,IAAI,CAAC,IAAI,CAACP,IAAI,EAAEH,IAAI,EAAEM,MAAM,CAAC;EACtC;EAQA;AACJ;AACA;EACWK,GAAGA,CAACC,IAAU,EAAQ;IACzB,IAAI,IAAI,CAACZ,IAAI,GAAG,IAAI,CAACE,GAAG,EAAE;MACtB,IAAI,CAACC,IAAI,CAACQ,GAAG,CAACC,IAAI,CAAC;MACnB,IAAI,CAACZ,IAAI,EAAE;IACf;EACJ;;EAEA;AACJ;AACA;AACA;AACA;EACWa,KAAKA,CAAA,EAAY;IACpB,MAAMC,aAAa,GAAG,IAAI,CAACd,IAAI,GAAG,IAAI,CAACC,GAAG;IAC1C,IAAIa,aAAa,IAAI,IAAI,CAACX,IAAI,CAACU,KAAK,CAAC,CAAC,EAAE;MACpC,IAAI,CAACb,IAAI,EAAE;MACX,OAAO,IAAI;IACf;IACA,OAAO,KAAK;EAChB;EAEQO,eAAeA,CAACR,OAAsB,EAAiB;IAC3D,IAAI,IAAAgB,sBAAO,EAAChB,OAAO,CAACC,IAAI,EAAED,OAAO,CAACE,GAAG,EAAEF,OAAO,CAACG,GAAG,CAAC,EAAE;MACjD,OAAOH,OAAO;IAClB,CAAC,MAAM;MACH,MAAM,IAAIiB,KAAK,CAAC,+CAA+C,CAAC;IACpE;EACJ;EAEQN,IAAIA,CAACP,IAAqB,EAAEH,IAAY,EAAEM,MAAkB,EAAQ;IACxE,MAAMW,OAAO,GAAGC,KAAK,CAACC,IAAI,CAAC;MAAEC,MAAM,EAAEpB;IAAK,CAAC,EAAEM,MAAM,CAAC;IACpDW,OAAO,CAACI,OAAO,CAACC,CAAC,IAAInB,IAAI,CAACQ,GAAG,CAACW,CAAC,CAAC,CAAC;EACrC;AACJ;AAACC,OAAA,CAAA1B,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.State = exports.Registry = void 0;
7
+ let State = exports.State = /*#__PURE__*/function (State) {
8
+ State["Idle"] = "Idle";
9
+ State["Busy"] = "Busy";
10
+ State["Doomed"] = "Doomed";
11
+ return State;
12
+ }({});
13
+ class Registry {
14
+ constructor() {
15
+ this.states = new Map();
16
+ }
17
+ stateOf(item) {
18
+ this.ensureHas(item);
19
+ // @ts-expect-error item точно есть
20
+ return this.states.get(item);
21
+ }
22
+ add(item) {
23
+ if (this.states.has(item)) {
24
+ throw new Error("Registry: duplicate");
25
+ }
26
+ this.states.set(item, State.Idle);
27
+ }
28
+ capture(item) {
29
+ this.expect(item, State.Idle);
30
+ this.states.set(item, State.Busy);
31
+ return item;
32
+ }
33
+ free(item) {
34
+ this.expect(item, State.Busy);
35
+ this.states.set(item, State.Idle);
36
+ }
37
+ doom(item) {
38
+ this.ensureHas(item);
39
+ this.states.set(item, State.Doomed);
40
+ }
41
+ remove(item) {
42
+ if (!this.states.delete(item)) {
43
+ throw new Error("Registry: remove unexpected");
44
+ }
45
+ }
46
+ findBusy() {
47
+ var _this$states$entries$;
48
+ return (_this$states$entries$ = this.states.entries().find(([_, state]) => state === State.Busy)) === null || _this$states$entries$ === void 0 ? void 0 : _this$states$entries$[0];
49
+ }
50
+ doomAll() {
51
+ const idles = [];
52
+ for (const [item, state] of this.states.entries()) {
53
+ this.states.set(item, State.Doomed);
54
+ if (state === State.Idle) {
55
+ idles.push(item);
56
+ }
57
+ }
58
+ return idles;
59
+ }
60
+ expect(item, state) {
61
+ this.ensureHas(item);
62
+ if (this.states.get(item) !== state) {
63
+ throw new Error("Registry: unexpected state");
64
+ }
65
+ }
66
+ ensureHas(item) {
67
+ if (!this.states.has(item)) {
68
+ throw new Error("Registry: unexpected item");
69
+ }
70
+ }
71
+ }
72
+ exports.Registry = Registry;
73
+ //# sourceMappingURL=Registry.js.map