Skip to content

Commit 50c97c1

Browse files
committed
[add] Async Queue
[fix] building bugs [optimize] update Upstream packages
1 parent 3a69934 commit 50c97c1

File tree

12 files changed

+130
-42
lines changed

12 files changed

+130
-42
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
node_modules/
22
package-lock.json
33
dist/
4-
.rts2_cache_*/
4+
.cache/
55
docs/

.npmignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.editorconfig
22
test/
3-
.rts2_cache_*/
3+
.cache/
44
docs/
55
.travis.yml

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ install:
1313
- npm install
1414
script:
1515
- npm run ${SCRIPT}
16+
- echo '' > docs/.nojekyll
1617
deploy:
1718
provider: pages
1819
on:
1920
branch: master
2021
skip_cleanup: true
2122
local_dir: ${FOLDER}
22-
github_token: ${TOKEN}
23+
token: ${TOKEN}

ReadMe.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,29 @@ reader.readAsBlob(file);
5151
})();
5252
```
5353

54+
### Concurrent Task to Serial Queue
55+
56+
```javascript
57+
import { createQueue } from 'iterable-observer';
58+
import Koa from 'koa';
59+
import BodyParser from 'koa-bodyparser';
60+
61+
const { process, observable } = createQueue(),
62+
app = new Koa();
63+
64+
(async () => {
65+
for await (const {
66+
defer: { resolve },
67+
data
68+
} of observable)
69+
resolve(JSON.stringify(data));
70+
})();
71+
72+
app.use(BodyParser)
73+
.use(async context => (context.body = await process(context.request.body)))
74+
.listen(80);
75+
```
76+
5477
[1]: https://github.com/tc39/proposal-observable
5578
[2]: https://tc39.es/ecma262/#sec-asyncgeneratorfunction-objects
5679
[3]: https://www.typescriptlang.org/

package.json

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iterable-observer",
3-
"version": "1.0.0-beta.0",
3+
"version": "1.0.0-beta.3",
44
"license": "LGPL-3.0",
55
"author": "[email protected]",
66
"description": "Observable Proposal implement based on Async Generator (ES 2018) & TypeScript",
@@ -23,45 +23,42 @@
2323
},
2424
"source": "source/index.ts",
2525
"types": "dist/index.d.ts",
26-
"main": "dist/iterable-observer.umd.js",
27-
"module": "dist/iterable-observer.js",
26+
"main": "dist/index.js",
2827
"devDependencies": {
29-
"@types/jest": "^24.0.23",
30-
"husky": "^3.1.0",
31-
"jest": "^24.9.0",
32-
"lint-staged": "^9.4.3",
33-
"microbundle": "^0.11.0",
34-
"open-cli": "^5.0.0",
35-
"prettier": "^1.19.1",
36-
"ts-jest": "^24.2.0",
37-
"typedoc": "^0.15.3",
38-
"typescript": "^3.7.2"
28+
"@types/jest": "^25.2.1",
29+
"@types/node": "^13.11.1",
30+
"husky": "^4.2.5",
31+
"jest": "^25.3.0",
32+
"lint-staged": "^10.1.3",
33+
"open-cli": "^6.0.1",
34+
"parcel-bundler": "^1.12.4",
35+
"prettier": "^2.0.4",
36+
"ts-jest": "^25.3.1",
37+
"typedoc": "^0.17.4",
38+
"typescript": "^3.8.3"
3939
},
4040
"prettier": {
4141
"singleQuote": true,
42+
"trailingComma": "none",
43+
"arrowParens": "avoid",
4244
"tabWidth": 4
4345
},
4446
"lint-staged": {
4547
"*.{md,json,ts}": [
46-
"prettier --write",
47-
"git add"
48+
"prettier --write"
4849
]
4950
},
5051
"jest": {
5152
"preset": "ts-jest",
52-
"testEnvironment": "node",
53-
"testRegex": "/test/.*\\.(test|spec)?\\.ts$",
54-
"moduleFileExtensions": [
55-
"js",
56-
"ts",
57-
"json"
58-
]
53+
"testTimeout": 8000
5954
},
6055
"scripts": {
61-
"test": "lint-staged && jest",
56+
"test": "lint-staged && jest --no-cache",
6257
"debug": "node --inspect node_modules/jest/bin/jest --runInBand",
58+
"pack-type": "tsc && rm -f dist/*.{js,map}",
59+
"pack-dist": "parcel build source/index.ts --global IterableObserver",
6360
"pack-docs": "typedoc --name \"Iterable Observer\" --out docs/ source/",
64-
"build": "rm -rf dist/ && microbundle && npm run pack-docs",
61+
"build": "rm -rf dist/ && npm run pack-type && npm run pack-dist && npm run pack-docs",
6562
"help": "npm run pack-docs && open-cli docs/index.html",
6663
"prepublishOnly": "npm test && npm run build"
6764
},

source/Observable.ts

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { Defer, makeDefer } from './utility';
1+
import { Defer, makeDefer, EventTrigger } from './utility';
2+
3+
Symbol.observable = Symbol('observable');
24

35
export interface Observer<T = any> {
46
next(value: T): void;
@@ -20,21 +22,14 @@ export interface Subscribable<T = any> {
2022
): Subscription;
2123
}
2224

23-
export type SubscriberFunction = (observer: Observer) => (() => void) | void;
24-
25-
export type EventHandler = (data: any) => void;
26-
27-
export interface EventTrigger {
28-
addEventListener?(name: string, handler: EventHandler): void;
29-
removeEventListener?(name: string, handler: EventHandler): void;
30-
on?(name: string, handler: EventHandler): this;
31-
off?(name: string, handler: EventHandler): this;
32-
}
25+
export type SubscriberFunction<T = any> = (
26+
observer: Observer<T>
27+
) => (() => void) | void;
3328

3429
export class Observable<T = any> implements Subscribable {
35-
private subscriber: SubscriberFunction;
30+
private subscriber: SubscriberFunction<T>;
3631

37-
constructor(subscriber: SubscriberFunction) {
32+
constructor(subscriber: SubscriberFunction<T>) {
3833
this.subscriber = subscriber;
3934
}
4035

@@ -74,7 +69,7 @@ export class Observable<T = any> implements Subscribable {
7469
yield queue[0].promise;
7570

7671
queue.shift();
77-
} while (queue[0] || !done);
72+
} while (queue[0]);
7873
}
7974

8075
static of<T = any>(...items: T[]) {

source/Queue.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Observer, Observable } from './Observable';
2+
import { makeDefer, Defer } from './utility';
3+
4+
export function createQueue<D = any>() {
5+
type Data = { defer: Defer; data: D };
6+
7+
var feedNext: Observer<Data>['next'], stop: Observer<Data>['complete'];
8+
9+
const observable = new Observable<Data>(({ next, complete }) => {
10+
(feedNext = next), (stop = complete);
11+
});
12+
13+
return {
14+
process<R = any>(data: D) {
15+
const defer = makeDefer<R>();
16+
17+
if (!feedNext)
18+
throw Error("Can't process data before Queue consuming");
19+
20+
feedNext({ defer, data });
21+
22+
return defer.promise;
23+
},
24+
destroy() {
25+
if (!stop) throw Error("Can't stop a Queue before Queue consuming");
26+
27+
stop();
28+
},
29+
observable
30+
};
31+
}

source/global.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface SymbolConstructor {
2+
observable: symbol;
3+
}

source/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './utility';
22
export * from './Observable';
3+
export * from './Queue';

source/utility.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,12 @@ export function makeDefer<T>(): Defer<T> {
1313

1414
return { resolve, reject, promise };
1515
}
16+
17+
export type EventHandler = (data: any) => void;
18+
19+
export interface EventTrigger {
20+
addEventListener?(name: string, handler: EventHandler): void;
21+
removeEventListener?(name: string, handler: EventHandler): void;
22+
on?(name: string, handler: EventHandler): this;
23+
off?(name: string, handler: EventHandler): this;
24+
}

0 commit comments

Comments
 (0)