goscript 0.2.6 → 0.2.7

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 (264) hide show
  1. package/cmd/goscript/cmd-compile.go +7 -0
  2. package/cmd/goscript/cmd_compile_test.go +83 -0
  3. package/compiler/compile-request.go +3 -0
  4. package/compiler/compiler-cache.go +828 -0
  5. package/compiler/compiler-cache_test.go +705 -0
  6. package/compiler/config.go +2 -0
  7. package/compiler/index.test.ts +26 -1
  8. package/compiler/index.ts +5 -0
  9. package/compiler/lowered-program.go +31 -20
  10. package/compiler/lowering.go +349 -93
  11. package/compiler/lowering_bench_test.go +1 -0
  12. package/compiler/override-facts.go +309 -8
  13. package/compiler/override-parity-verifier.go +45 -1
  14. package/compiler/override-parity-verifier_test.go +100 -0
  15. package/compiler/override-registry_test.go +1 -0
  16. package/compiler/package-graph.go +40 -12
  17. package/compiler/package-graph_test.go +29 -0
  18. package/compiler/runtime-contract.go +8 -0
  19. package/compiler/service.go +98 -11
  20. package/compiler/skeleton_test.go +110 -14
  21. package/compiler/typescript-emitter.go +120 -23
  22. package/dist/compiler/index.d.ts +2 -0
  23. package/dist/compiler/index.js +3 -0
  24. package/dist/compiler/index.js.map +1 -1
  25. package/dist/gs/builtin/builtin.d.ts +24 -33
  26. package/dist/gs/builtin/builtin.js +54 -61
  27. package/dist/gs/builtin/builtin.js.map +1 -1
  28. package/dist/gs/builtin/hostio.d.ts +1 -0
  29. package/dist/gs/builtin/hostio.js +1 -1
  30. package/dist/gs/builtin/hostio.js.map +1 -1
  31. package/dist/gs/builtin/index.d.ts +1 -0
  32. package/dist/gs/builtin/index.js +1 -0
  33. package/dist/gs/builtin/index.js.map +1 -1
  34. package/dist/gs/builtin/panic.d.ts +18 -0
  35. package/dist/gs/builtin/panic.js +98 -0
  36. package/dist/gs/builtin/panic.js.map +1 -0
  37. package/dist/gs/builtin/slice.d.ts +10 -0
  38. package/dist/gs/builtin/slice.js +110 -53
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.js +15 -3
  41. package/dist/gs/builtin/type.js.map +1 -1
  42. package/dist/gs/builtin/varRef.d.ts +1 -1
  43. package/dist/gs/builtin/varRef.js +3 -2
  44. package/dist/gs/builtin/varRef.js.map +1 -1
  45. package/dist/gs/bytes/bytes.gs.js +51 -38
  46. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  47. package/dist/gs/bytes/reader.gs.d.ts +1 -1
  48. package/dist/gs/bytes/reader.gs.js +6 -7
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/cmp/index.d.ts +1 -1
  51. package/dist/gs/cmp/index.js +43 -10
  52. package/dist/gs/cmp/index.js.map +1 -1
  53. package/dist/gs/context/context.d.ts +2 -2
  54. package/dist/gs/context/context.js +1 -1
  55. package/dist/gs/context/context.js.map +1 -1
  56. package/dist/gs/embed/index.js +1 -1
  57. package/dist/gs/embed/index.js.map +1 -1
  58. package/dist/gs/encoding/binary/index.js +201 -8
  59. package/dist/gs/encoding/binary/index.js.map +1 -1
  60. package/dist/gs/encoding/json/index.d.ts +5 -0
  61. package/dist/gs/encoding/json/index.js +388 -25
  62. package/dist/gs/encoding/json/index.js.map +1 -1
  63. package/dist/gs/errors/errors.js +17 -24
  64. package/dist/gs/errors/errors.js.map +1 -1
  65. package/dist/gs/fmt/fmt.js +129 -35
  66. package/dist/gs/fmt/fmt.js.map +1 -1
  67. package/dist/gs/golang.org/x/crypto/cryptobyte/index.js +1 -1
  68. package/dist/gs/golang.org/x/crypto/cryptobyte/index.js.map +1 -1
  69. package/dist/gs/internal/bytealg/index.js +43 -8
  70. package/dist/gs/internal/bytealg/index.js.map +1 -1
  71. package/dist/gs/internal/byteorder/index.d.ts +2 -2
  72. package/dist/gs/internal/byteorder/index.js +2 -2
  73. package/dist/gs/internal/byteorder/index.js.map +1 -1
  74. package/dist/gs/io/fs/format.js +2 -2
  75. package/dist/gs/io/fs/format.js.map +1 -1
  76. package/dist/gs/io/fs/fs.d.ts +1 -1
  77. package/dist/gs/io/fs/fs.js +1 -1
  78. package/dist/gs/io/fs/fs.js.map +1 -1
  79. package/dist/gs/io/io.d.ts +21 -21
  80. package/dist/gs/io/io.js +49 -50
  81. package/dist/gs/io/io.js.map +1 -1
  82. package/dist/gs/math/bits/index.js +26 -8
  83. package/dist/gs/math/bits/index.js.map +1 -1
  84. package/dist/gs/math/copysign.gs.js +10 -17
  85. package/dist/gs/math/copysign.gs.js.map +1 -1
  86. package/dist/gs/math/pow.gs.js +5 -0
  87. package/dist/gs/math/pow.gs.js.map +1 -1
  88. package/dist/gs/math/signbit.gs.js +6 -2
  89. package/dist/gs/math/signbit.gs.js.map +1 -1
  90. package/dist/gs/mime/index.js +1 -0
  91. package/dist/gs/mime/index.js.map +1 -1
  92. package/dist/gs/net/http/index.d.ts +6 -6
  93. package/dist/gs/net/http/index.js +507 -43
  94. package/dist/gs/net/http/index.js.map +1 -1
  95. package/dist/gs/os/stat.gs.d.ts +2 -2
  96. package/dist/gs/os/types.gs.d.ts +1 -1
  97. package/dist/gs/os/types.gs.js +1 -1
  98. package/dist/gs/os/types.gs.js.map +1 -1
  99. package/dist/gs/os/types_js.gs.d.ts +1 -1
  100. package/dist/gs/os/types_js.gs.js +7 -7
  101. package/dist/gs/os/types_js.gs.js.map +1 -1
  102. package/dist/gs/os/types_unix.gs.d.ts +1 -1
  103. package/dist/gs/os/types_unix.gs.js +1 -1
  104. package/dist/gs/os/types_unix.gs.js.map +1 -1
  105. package/dist/gs/os/zero_copy_posix.gs.d.ts +1 -1
  106. package/dist/gs/os/zero_copy_posix.gs.js +1 -1
  107. package/dist/gs/os/zero_copy_posix.gs.js.map +1 -1
  108. package/dist/gs/path/filepath/match.js +8 -4
  109. package/dist/gs/path/filepath/match.js.map +1 -1
  110. package/dist/gs/path/filepath/path.js +216 -42
  111. package/dist/gs/path/filepath/path.js.map +1 -1
  112. package/dist/gs/path/match.js +6 -3
  113. package/dist/gs/path/match.js.map +1 -1
  114. package/dist/gs/reflect/type.d.ts +5 -4
  115. package/dist/gs/reflect/type.js +29 -11
  116. package/dist/gs/reflect/type.js.map +1 -1
  117. package/dist/gs/slices/slices.js +11 -11
  118. package/dist/gs/slices/slices.js.map +1 -1
  119. package/dist/gs/strconv/atof.gs.js +156 -43
  120. package/dist/gs/strconv/atof.gs.js.map +1 -1
  121. package/dist/gs/strconv/atoi.gs.d.ts +3 -2
  122. package/dist/gs/strconv/atoi.gs.js +86 -67
  123. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  124. package/dist/gs/strconv/ftoa.gs.js +73 -3
  125. package/dist/gs/strconv/ftoa.gs.js.map +1 -1
  126. package/dist/gs/strconv/itoa.gs.d.ts +4 -4
  127. package/dist/gs/strconv/itoa.gs.js +5 -4
  128. package/dist/gs/strconv/itoa.gs.js.map +1 -1
  129. package/dist/gs/strconv/quote.gs.d.ts +1 -1
  130. package/dist/gs/strconv/quote.gs.js +311 -103
  131. package/dist/gs/strconv/quote.gs.js.map +1 -1
  132. package/dist/gs/strings/reader.d.ts +1 -1
  133. package/dist/gs/strings/reader.js +8 -8
  134. package/dist/gs/strings/reader.js.map +1 -1
  135. package/dist/gs/strings/strings.js +87 -61
  136. package/dist/gs/strings/strings.js.map +1 -1
  137. package/dist/gs/sync/atomic/doc_64.gs.d.ts +14 -14
  138. package/dist/gs/sync/atomic/doc_64.gs.js +10 -10
  139. package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
  140. package/dist/gs/sync/atomic/type.gs.d.ts +22 -22
  141. package/dist/gs/sync/atomic/type.gs.js +4 -4
  142. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  143. package/dist/gs/sync/sync.js +50 -12
  144. package/dist/gs/sync/sync.js.map +1 -1
  145. package/dist/gs/syscall/fs.d.ts +6 -6
  146. package/dist/gs/syscall/fs.js +1 -1
  147. package/dist/gs/syscall/fs.js.map +1 -1
  148. package/dist/gs/time/time.d.ts +18 -18
  149. package/dist/gs/time/time.js +58 -55
  150. package/dist/gs/time/time.js.map +1 -1
  151. package/dist/gs/unicode/tables.d.ts +11 -0
  152. package/dist/gs/unicode/tables.js +635 -0
  153. package/dist/gs/unicode/tables.js.map +1 -0
  154. package/dist/gs/unicode/unicode.d.ts +58 -38
  155. package/dist/gs/unicode/unicode.js +362 -278
  156. package/dist/gs/unicode/unicode.js.map +1 -1
  157. package/go.sum +13 -0
  158. package/gs/builtin/builtin.ts +83 -93
  159. package/gs/builtin/hostio.ts +1 -1
  160. package/gs/builtin/index.ts +1 -0
  161. package/gs/builtin/panic.test.ts +189 -0
  162. package/gs/builtin/panic.ts +107 -0
  163. package/gs/builtin/runtime-contract.test.ts +5 -5
  164. package/gs/builtin/slice.test.ts +23 -0
  165. package/gs/builtin/slice.ts +133 -95
  166. package/gs/builtin/type.ts +16 -3
  167. package/gs/builtin/varRef.ts +4 -2
  168. package/gs/builtin/wide-int.test.ts +41 -0
  169. package/gs/bytes/bytes.gs.ts +54 -41
  170. package/gs/bytes/bytes.test.ts +18 -1
  171. package/gs/bytes/reader.gs.ts +7 -8
  172. package/gs/cmp/index.test.ts +55 -0
  173. package/gs/cmp/index.ts +45 -9
  174. package/gs/context/context.ts +3 -3
  175. package/gs/embed/index.ts +2 -2
  176. package/gs/encoding/binary/index.test.ts +104 -0
  177. package/gs/encoding/binary/index.ts +259 -11
  178. package/gs/encoding/json/index.test.ts +107 -0
  179. package/gs/encoding/json/index.ts +400 -29
  180. package/gs/errors/errors.test.ts +44 -1
  181. package/gs/errors/errors.ts +15 -31
  182. package/gs/fmt/fmt.test.ts +70 -2
  183. package/gs/fmt/fmt.ts +128 -34
  184. package/gs/golang.org/x/crypto/cryptobyte/index.ts +1 -1
  185. package/gs/internal/bytealg/index.test.ts +26 -1
  186. package/gs/internal/bytealg/index.ts +44 -8
  187. package/gs/internal/byteorder/index.ts +6 -4
  188. package/gs/io/fs/format.ts +2 -2
  189. package/gs/io/fs/fs.ts +2 -2
  190. package/gs/io/fs/stat.test.ts +2 -2
  191. package/gs/io/fs/sub.test.ts +2 -2
  192. package/gs/io/fs/walk.test.ts +2 -2
  193. package/gs/io/io.test.ts +47 -5
  194. package/gs/io/io.ts +73 -73
  195. package/gs/io/limit.test.ts +103 -0
  196. package/gs/math/bits/index.test.ts +128 -0
  197. package/gs/math/bits/index.ts +26 -8
  198. package/gs/math/copysign.gs.test.ts +3 -1
  199. package/gs/math/copysign.gs.ts +10 -22
  200. package/gs/math/pow.gs.test.ts +4 -5
  201. package/gs/math/pow.gs.ts +5 -0
  202. package/gs/math/signbit.gs.test.ts +2 -1
  203. package/gs/math/signbit.gs.ts +6 -3
  204. package/gs/mime/index.ts +1 -0
  205. package/gs/net/http/index.test.ts +683 -2
  206. package/gs/net/http/index.ts +598 -57
  207. package/gs/net/http/meta.json +3 -0
  208. package/gs/os/stat.gs.ts +2 -2
  209. package/gs/os/types.gs.ts +2 -2
  210. package/gs/os/types_js.gs.ts +9 -9
  211. package/gs/os/types_unix.gs.ts +2 -2
  212. package/gs/os/zero_copy_posix.gs.ts +2 -2
  213. package/gs/path/filepath/match.test.ts +16 -0
  214. package/gs/path/filepath/match.ts +8 -4
  215. package/gs/path/filepath/path.test.ts +91 -9
  216. package/gs/path/filepath/path.ts +223 -49
  217. package/gs/path/match.test.ts +32 -0
  218. package/gs/path/match.ts +6 -3
  219. package/gs/reflect/deepequal.test.ts +1 -1
  220. package/gs/reflect/field.test.ts +1 -1
  221. package/gs/reflect/function-types.test.ts +6 -6
  222. package/gs/reflect/sliceat.test.ts +13 -13
  223. package/gs/reflect/structof.test.ts +4 -4
  224. package/gs/reflect/type.ts +34 -14
  225. package/gs/reflect/typefor.test.ts +5 -5
  226. package/gs/runtime/pprof/index.test.ts +20 -0
  227. package/gs/runtime/trace/index.test.ts +3 -0
  228. package/gs/slices/slices.test.ts +31 -0
  229. package/gs/slices/slices.ts +11 -11
  230. package/gs/strconv/append.test.ts +99 -0
  231. package/gs/strconv/atof.gs.ts +156 -42
  232. package/gs/strconv/atof.test.ts +45 -0
  233. package/gs/strconv/atoi.gs.ts +87 -69
  234. package/gs/strconv/atoi.test.ts +49 -0
  235. package/gs/strconv/ftoa.gs.ts +85 -10
  236. package/gs/strconv/ftoa.test.ts +43 -0
  237. package/gs/strconv/itoa.gs.ts +10 -9
  238. package/gs/strconv/quote.gs.ts +335 -108
  239. package/gs/strconv/quote.test.ts +111 -0
  240. package/gs/strings/reader.test.ts +10 -10
  241. package/gs/strings/reader.ts +9 -9
  242. package/gs/strings/strings.test.ts +18 -5
  243. package/gs/strings/strings.ts +81 -68
  244. package/gs/sync/atomic/doc_64.gs.ts +24 -24
  245. package/gs/sync/atomic/doc_64.test.ts +5 -5
  246. package/gs/sync/atomic/type.gs.ts +28 -28
  247. package/gs/sync/sync.test.ts +109 -1
  248. package/gs/sync/sync.ts +46 -12
  249. package/gs/syscall/fs.ts +8 -8
  250. package/gs/syscall/net.test.ts +1 -1
  251. package/gs/time/parse.test.ts +45 -0
  252. package/gs/time/time.test.ts +46 -23
  253. package/gs/time/time.ts +69 -66
  254. package/gs/unicode/gen.go +198 -0
  255. package/gs/unicode/tables.ts +646 -0
  256. package/gs/unicode/unicode.test.ts +69 -0
  257. package/gs/unicode/unicode.ts +396 -312
  258. package/package.json +1 -1
  259. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +0 -20
  260. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +0 -134
  261. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +0 -1
  262. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +0 -30
  263. package/gs/github.com/aperturerobotics/util/conc/index.ts +0 -172
  264. package/gs/github.com/aperturerobotics/util/conc/meta.json +0 -9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "goscript",
3
3
  "description": "Go to TypeScript transpiler",
4
- "version": "0.2.6",
4
+ "version": "0.2.7",
5
5
  "author": {
6
6
  "name": "Aperture Robotics LLC.",
7
7
  "email": "support@aperture.us",
@@ -1,20 +0,0 @@
1
- import * as $ from '../../../../builtin/index.js';
2
- import * as context from '../../../../context/index.js';
3
- type Job = (() => void | globalThis.Promise<void>) | null;
4
- export declare class ConcurrentQueue {
5
- private readonly maxConcurrency;
6
- private running;
7
- private readonly queue;
8
- private waitCh;
9
- constructor(maxConcurrency: number, initialElems?: $.Slice<Job>);
10
- Enqueue(jobs: $.Slice<Job>): [number, number];
11
- Enqueue(...jobs: Job[]): [number, number];
12
- WaitIdle(ctx: context.Context, errCh: $.Channel<$.GoError> | null): Promise<$.GoError>;
13
- WatchState(ctx: context.Context, _errCh: $.Channel<$.GoError> | null, cb: ((queued: number, running: number) => [boolean, $.GoError]) | null): Promise<$.GoError>;
14
- private start;
15
- private update;
16
- private notify;
17
- }
18
- export declare function NewConcurrentQueue(maxConcurrency: number, initialElems?: $.Slice<Job>): ConcurrentQueue;
19
- export declare function NewConcurrentQueue(maxConcurrency: number, ...initialElems: Job[]): ConcurrentQueue;
20
- export {};
@@ -1,134 +0,0 @@
1
- import * as $ from '../../../../builtin/index.js';
2
- import * as context from '../../../../context/index.js';
3
- // ConcurrentQueue runs jobs with a bounded number of active workers.
4
- export class ConcurrentQueue {
5
- maxConcurrency;
6
- running = 0;
7
- queue = [];
8
- waitCh = $.makeChannel(0, {}, 'both');
9
- constructor(maxConcurrency, initialElems = null) {
10
- this.maxConcurrency = maxConcurrency;
11
- for (const job of initialElems ?? []) {
12
- this.queue.push(job);
13
- }
14
- this.update();
15
- }
16
- Enqueue(...args) {
17
- const jobs = normalizeJobs(args);
18
- for (const job of jobs) {
19
- if (this.maxConcurrency <= 0 || this.running < this.maxConcurrency) {
20
- this.running++;
21
- this.start(job);
22
- continue;
23
- }
24
- this.queue.push(job);
25
- }
26
- if (jobs.length !== 0) {
27
- this.notify();
28
- }
29
- return [this.queue.length, this.running];
30
- }
31
- async WaitIdle(ctx, errCh) {
32
- for (;;) {
33
- if (this.running === 0 && this.queue.length === 0) {
34
- return null;
35
- }
36
- const waitCh = this.waitCh;
37
- const [hasReturn, err] = await $.selectStatement([
38
- {
39
- id: 0,
40
- isSend: false,
41
- channel: ctx?.Done() ?? null,
42
- onSelected: async () => context.Canceled,
43
- },
44
- {
45
- id: 1,
46
- isSend: false,
47
- channel: errCh,
48
- onSelected: async (result) => {
49
- if (!result.ok) {
50
- return context.Canceled;
51
- }
52
- return result.value ?? null;
53
- },
54
- },
55
- {
56
- id: 2,
57
- isSend: false,
58
- channel: waitCh,
59
- onSelected: async () => null,
60
- },
61
- ], false);
62
- if (hasReturn && err != null) {
63
- return err;
64
- }
65
- }
66
- }
67
- async WatchState(ctx, _errCh, cb) {
68
- if (cb == null) {
69
- return null;
70
- }
71
- for (;;) {
72
- const waitCh = this.waitCh;
73
- const [cont, err] = cb(this.queue.length, this.running);
74
- if (err != null || !cont) {
75
- return err;
76
- }
77
- const [hasReturn, waitErr] = await $.selectStatement([
78
- {
79
- id: 0,
80
- isSend: false,
81
- channel: ctx?.Done() ?? null,
82
- onSelected: async () => context.Canceled,
83
- },
84
- {
85
- id: 1,
86
- isSend: false,
87
- channel: waitCh,
88
- onSelected: async () => null,
89
- },
90
- ], false);
91
- if (hasReturn && waitErr != null) {
92
- return waitErr;
93
- }
94
- }
95
- }
96
- start(job) {
97
- queueMicrotask(async () => {
98
- try {
99
- await job?.();
100
- }
101
- finally {
102
- this.running--;
103
- this.update();
104
- this.notify();
105
- }
106
- });
107
- }
108
- update() {
109
- while (this.queue.length !== 0 &&
110
- (this.maxConcurrency <= 0 || this.running < this.maxConcurrency)) {
111
- const job = this.queue.shift() ?? null;
112
- this.running++;
113
- this.start(job);
114
- }
115
- }
116
- notify() {
117
- const waitCh = this.waitCh;
118
- this.waitCh = $.makeChannel(0, {}, 'both');
119
- waitCh.close();
120
- }
121
- }
122
- export function NewConcurrentQueue(maxConcurrency, ...args) {
123
- return new ConcurrentQueue(maxConcurrency, normalizeJobs(args));
124
- }
125
- function normalizeJobs(args) {
126
- if (args.length === 0) {
127
- return [];
128
- }
129
- if (args.length === 1 && (Array.isArray(args[0]) || args[0] == null)) {
130
- return Array.from(args[0] ?? []);
131
- }
132
- return args;
133
- }
134
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../gs/github.com/aperturerobotics/util/conc/index.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import { describe, expect, test } from 'vitest'
2
- import { makeChannel } from '../../../../builtin/index.js'
3
- import { Background } from '../../../../context/index.js'
4
- import { NewConcurrentQueue } from './index.js'
5
-
6
- const tick = () => new Promise<void>((resolve) => queueMicrotask(resolve))
7
-
8
- describe('util/conc override', () => {
9
- test('runs queued jobs within the concurrency limit', async () => {
10
- const release = makeChannel<{}>(0, {}, 'both')
11
- const started: number[] = []
12
- const done: number[] = []
13
- const job = (idx: number) => async () => {
14
- started.push(idx)
15
- await release.receive()
16
- done.push(idx)
17
- }
18
-
19
- const q = NewConcurrentQueue(2, job(0), job(1))
20
- const [queued, running] = q.Enqueue([job(2), job(3), job(4)])
21
- expect([queued, running]).toEqual([3, 2])
22
-
23
- await tick()
24
- expect(started).toEqual([0, 1])
25
-
26
- release.close()
27
- expect(await q.WaitIdle(Background(), null)).toBeNull()
28
- expect([...done].sort((a, b) => a - b)).toEqual([0, 1, 2, 3, 4])
29
- })
30
- })
@@ -1,172 +0,0 @@
1
- import * as $ from '../../../../builtin/index.js'
2
- import * as context from '../../../../context/index.js'
3
-
4
- type Job = (() => void | globalThis.Promise<void>) | null
5
-
6
- // ConcurrentQueue runs jobs with a bounded number of active workers.
7
- export class ConcurrentQueue {
8
- private readonly maxConcurrency: number
9
- private running = 0
10
- private readonly queue: Job[] = []
11
- private waitCh = $.makeChannel<{}>(0, {}, 'both')
12
-
13
- constructor(maxConcurrency: number, initialElems: $.Slice<Job> = null) {
14
- this.maxConcurrency = maxConcurrency
15
- for (const job of initialElems ?? []) {
16
- this.queue.push(job)
17
- }
18
- this.update()
19
- }
20
-
21
- public Enqueue(jobs: $.Slice<Job>): [number, number]
22
- public Enqueue(...jobs: Job[]): [number, number]
23
- public Enqueue(...args: [$.Slice<Job>] | Job[]): [number, number] {
24
- const jobs = normalizeJobs(args)
25
- for (const job of jobs) {
26
- if (this.maxConcurrency <= 0 || this.running < this.maxConcurrency) {
27
- this.running++
28
- this.start(job)
29
- continue
30
- }
31
- this.queue.push(job)
32
- }
33
- if (jobs.length !== 0) {
34
- this.notify()
35
- }
36
- return [this.queue.length, this.running]
37
- }
38
-
39
- public async WaitIdle(
40
- ctx: context.Context,
41
- errCh: $.Channel<$.GoError> | null,
42
- ): Promise<$.GoError> {
43
- for (;;) {
44
- if (this.running === 0 && this.queue.length === 0) {
45
- return null
46
- }
47
- const waitCh = this.waitCh
48
- const [hasReturn, err] = await $.selectStatement<unknown, $.GoError>(
49
- [
50
- {
51
- id: 0,
52
- isSend: false,
53
- channel: ctx?.Done() ?? null,
54
- onSelected: async () => context.Canceled,
55
- },
56
- {
57
- id: 1,
58
- isSend: false,
59
- channel: errCh,
60
- onSelected: async (result) => {
61
- if (!result.ok) {
62
- return context.Canceled
63
- }
64
- return result.value ?? null
65
- },
66
- },
67
- {
68
- id: 2,
69
- isSend: false,
70
- channel: waitCh,
71
- onSelected: async () => null,
72
- },
73
- ],
74
- false,
75
- )
76
- if (hasReturn && err != null) {
77
- return err
78
- }
79
- }
80
- }
81
-
82
- public async WatchState(
83
- ctx: context.Context,
84
- _errCh: $.Channel<$.GoError> | null,
85
- cb: ((queued: number, running: number) => [boolean, $.GoError]) | null,
86
- ): Promise<$.GoError> {
87
- if (cb == null) {
88
- return null
89
- }
90
- for (;;) {
91
- const waitCh = this.waitCh
92
- const [cont, err] = cb(this.queue.length, this.running)
93
- if (err != null || !cont) {
94
- return err
95
- }
96
- const [hasReturn, waitErr] = await $.selectStatement<unknown, $.GoError>(
97
- [
98
- {
99
- id: 0,
100
- isSend: false,
101
- channel: ctx?.Done() ?? null,
102
- onSelected: async () => context.Canceled,
103
- },
104
- {
105
- id: 1,
106
- isSend: false,
107
- channel: waitCh,
108
- onSelected: async () => null,
109
- },
110
- ],
111
- false,
112
- )
113
- if (hasReturn && waitErr != null) {
114
- return waitErr
115
- }
116
- }
117
- }
118
-
119
- private start(job: Job): void {
120
- queueMicrotask(async () => {
121
- try {
122
- await job?.()
123
- } finally {
124
- this.running--
125
- this.update()
126
- this.notify()
127
- }
128
- })
129
- }
130
-
131
- private update(): void {
132
- while (
133
- this.queue.length !== 0 &&
134
- (this.maxConcurrency <= 0 || this.running < this.maxConcurrency)
135
- ) {
136
- const job = this.queue.shift() ?? null
137
- this.running++
138
- this.start(job)
139
- }
140
- }
141
-
142
- private notify(): void {
143
- const waitCh = this.waitCh
144
- this.waitCh = $.makeChannel<{}>(0, {}, 'both')
145
- waitCh.close()
146
- }
147
- }
148
-
149
- export function NewConcurrentQueue(
150
- maxConcurrency: number,
151
- initialElems?: $.Slice<Job>,
152
- ): ConcurrentQueue
153
- export function NewConcurrentQueue(
154
- maxConcurrency: number,
155
- ...initialElems: Job[]
156
- ): ConcurrentQueue
157
- export function NewConcurrentQueue(
158
- maxConcurrency: number,
159
- ...args: [$.Slice<Job>?] | Job[]
160
- ): ConcurrentQueue {
161
- return new ConcurrentQueue(maxConcurrency, normalizeJobs(args))
162
- }
163
-
164
- function normalizeJobs(args: [$.Slice<Job>?] | Job[]): Job[] {
165
- if (args.length === 0) {
166
- return []
167
- }
168
- if (args.length === 1 && (Array.isArray(args[0]) || args[0] == null)) {
169
- return Array.from((args[0] as $.Slice<Job>) ?? [])
170
- }
171
- return args as Job[]
172
- }
@@ -1,9 +0,0 @@
1
- {
2
- "dependencies": [
3
- "context"
4
- ],
5
- "asyncMethods": {
6
- "ConcurrentQueue.WaitIdle": true,
7
- "ConcurrentQueue.WatchState": true
8
- }
9
- }