Skip to content

Commit 6fc340d

Browse files
authored
fix: inline thingies dependency (#1004)
* fix: inline `thingies` * fix: remove unneeded code * chore: don't apply prettier to `thingies` code * refactor: inline `tick` and `until` functions
1 parent 7babd6e commit 6fc340d

16 files changed

+102
-15
lines changed

.prettierignore

+1
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ package-lock.json
1111
CHANGELOG.md
1212

1313
src/json-joy
14+
src/thingies

package.json

-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@
121121
}
122122
},
123123
"dependencies": {
124-
"thingies": "^1.11.1",
125124
"tslib": "^2.0.0"
126125
},
127126
"devDependencies": {

src/__tests__/volume/readFile.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { of } from 'thingies';
1+
import { of } from '../../thingies';
22
import { memfs } from '../..';
33

44
describe('.readFile()', () => {

src/crud-to-cas/__tests__/testCasfs.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { of } from 'thingies';
1+
import { of } from '../../thingies';
22
import { createHash } from 'crypto';
33
import { hashToLocation } from '../util';
44
import type { CasApi } from '../../cas/types';

src/crud/__tests__/testCrudfs.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { of } from 'thingies';
1+
import { of } from '../../thingies';
22
import type { CrudApi } from '../types';
33

44
export type Setup = () => {

src/fsa-to-node/FsaNodeReadStream.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Readable } from 'stream';
2-
import { Defer } from 'thingies/es6/Defer';
3-
import { concurrency } from 'thingies/es6/concurrency';
2+
import { Defer } from '../thingies/Defer';
3+
import { concurrency } from '../thingies/concurrency';
44
import type { FsaNodeFsOpenFile } from './FsaNodeFsOpenFile';
55
import type { IReadStream } from '../node/types/misc';
66
import type { IReadStreamOptions } from '../node/types/options';

src/fsa-to-node/FsaNodeWriteStream.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Writable } from 'stream';
2-
import { Defer } from 'thingies/es6/Defer';
3-
import { concurrency } from 'thingies/es6/concurrency';
2+
import { Defer } from '../thingies/Defer';
3+
import { concurrency } from '../thingies/concurrency';
44
import { flagsToNumber } from '../node/util';
55
import { FLAG } from '../consts/FLAG';
66
import { FsaNodeFsOpenFile } from './FsaNodeFsOpenFile';

src/fsa-to-node/__tests__/FsaNodeFs.test.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@ import { AMODE } from '../../consts/AMODE';
33
import { nodeToFsa } from '../../node-to-fsa';
44
import { IDirent, IStats } from '../../node/types/misc';
55
import { FsaNodeFs } from '../FsaNodeFs';
6-
import { tick, until, of } from 'thingies';
6+
import { of } from '../../thingies';
77
import { onlyOnNode20 } from '../../__tests__/util';
88
import { FLAG } from '../../consts/FLAG';
99

10+
const tick = (ms: number = 1) => new Promise(r => setTimeout(r, ms));
11+
12+
const until = async (check: () => boolean | Promise<boolean>, pollInterval: number = 1) => {
13+
do {
14+
if (await check()) return;
15+
await tick(pollInterval);
16+
} while (true);
17+
};
18+
1019
const setup = (json: NestedDirectoryJSON | null = null, mode: 'read' | 'readwrite' = 'readwrite') => {
1120
const { fs: mfs, vol } = memfs({ mountpoint: json });
1221
const dir = nodeToFsa(mfs, '/mountpoint', { mode, syncHandleAllowed: true });

src/fsa-to-node/worker/FsaNodeSyncAdapterWorker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Defer } from 'thingies/es6/Defer';
1+
import { Defer } from '../../thingies/Defer';
22
import { FsaNodeWorkerMessageCode } from './constants';
33
import { SyncMessenger } from './SyncMessenger';
44
import { decoder, encoder } from '../json';

src/thingies/Defer.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* An externally resolvable/rejectable "promise". Use it to resolve/reject
3+
* promise at any time.
4+
*
5+
* ```ts
6+
* const future = new Defer();
7+
*
8+
* future.promise.then(value => console.log(value));
9+
*
10+
* future.resolve(123);
11+
* ```
12+
*/
13+
export class Defer<T> {
14+
public readonly resolve!: (data: T) => void;
15+
public readonly reject!: (error: any) => void;
16+
public readonly promise: Promise<T> = new Promise<T>((resolve, reject) => {
17+
(this as any).resolve = resolve;
18+
(this as any).reject = reject;
19+
});
20+
}

src/thingies/concurrency.ts

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {go} from './go';
2+
import type {Code} from './types';
3+
4+
class Task<T = unknown> {
5+
public readonly resolve!: (data: T) => void;
6+
public readonly reject!: (error: any) => void;
7+
public readonly promise = new Promise<T>((resolve, reject) => {
8+
(this as any).resolve = resolve;
9+
(this as any).reject = reject;
10+
});
11+
constructor(public readonly code: Code<T>) {}
12+
}
13+
14+
/** Limits concurrency of async code. */
15+
export const concurrency = (limit: number) => {
16+
let workers = 0;
17+
const queue = new Set<Task>();
18+
const work = async () => {
19+
const task = queue.values().next().value;
20+
if (task) queue.delete(task);
21+
else return;
22+
workers++;
23+
try {
24+
task.resolve(await task.code());
25+
} catch (error) {
26+
task.reject(error);
27+
} finally {
28+
workers--, queue.size && go(work);
29+
}
30+
};
31+
return async <T = unknown>(code: Code<T>): Promise<T> => {
32+
const task = new Task(code);
33+
queue.add(task as Task<unknown>);
34+
return workers < limit && go(work), task.promise;
35+
};
36+
};

src/thingies/go.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type {Code} from './types';
2+
3+
/** Executes code concurrently. */
4+
export const go = <T>(code: Code<T>): void => {
5+
code().catch(() => {});
6+
};

src/thingies/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './concurrency';
2+
export * from './Defer';
3+
export * from './go';
4+
export * from './of';

src/thingies/of.ts

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Given a promise awaits it and returns a 3-tuple, with the following members:
3+
*
4+
* - First entry is either the resolved value of the promise or `undefined`.
5+
* - Second entry is either the error thrown by promise or `undefined`.
6+
* - Third entry is a boolean, truthy if promise was resolved and falsy if rejected.
7+
*
8+
* @param promise Promise to convert to 3-tuple.
9+
*/
10+
export const of = async <T, E = unknown>(promise: Promise<T>): Promise<[T | undefined, E | undefined, boolean]> => {
11+
try {
12+
return [await promise, undefined, true];
13+
} catch (error: unknown) {
14+
return [undefined, error as E, false];
15+
}
16+
};

src/thingies/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type Code<T = unknown> = () => Promise<T>;

yarn.lock

-5
Original file line numberDiff line numberDiff line change
@@ -6682,11 +6682,6 @@ text-table@~0.2.0:
66826682
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
66836683
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
66846684

6685-
thingies@^1.11.1:
6686-
version "1.16.0"
6687-
resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.16.0.tgz#968cde87fbf0fdd69a1a3a8e9678324f634e5053"
6688-
integrity sha512-J23AVs11hSQxuJxvfQyMIaS9z1QpDxOCvMkL3ZxZl8/jmkgmnNGWrlyNxVz6Jbh0U6DuGmHqq6f7zUROfg/ncg==
6689-
66906685
through2@^4.0.0:
66916686
version "4.0.2"
66926687
resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"

0 commit comments

Comments
 (0)