gingersnap 0.23.3 → 0.23.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/data/AtomicValue.cjs +66 -0
- package/data/AtomicValue.mjs +64 -0
- package/data/store.cjs +12 -0
- package/data/store.mjs +3 -0
- package/data-structures/object/Publisher.cjs +16 -0
- package/data-structures/object/Publisher.d.ts +8 -0
- package/data-structures/object/Publisher.mjs +14 -0
- package/data-structures/object/Queue.cjs +4 -0
- package/data-structures/object/Queue.d.ts +2 -0
- package/data-structures/object/Queue.mjs +4 -0
- package/package.json +1 -1
- package/stream.cjs +2 -2
- package/stream.mjs +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## GingerSnap
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## Description
|
|
5
|
+
Gingersnap is a general purpose library built with the aim of filling the gaps of javascript shortcomings. First-Class support for networking, IO operations and data validation is at the core of this library.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
To install the package, run `npm install gingersnap`
|
|
9
|
+
|
|
10
|
+
## Roadmap
|
|
11
|
+
- Support request timeout
|
|
12
|
+
- Opt out of using an authenticator for a method's request
|
|
13
|
+
- Support multiple authenticators, and setting Primary authenticator
|
|
14
|
+
- Allow methods to choose authenticator
|
|
15
|
+
- Support endpoint polling with subscription methods
|
|
16
|
+
- Support offline mode with resume feature once net is back
|
|
17
|
+
- Support default response when offline
|
|
18
|
+
- Support grouping requests, if one fail cancel all
|
|
19
|
+
- Support race requests, the first one that finishes/fails cancel all others and return the response
|
|
20
|
+
- Plugin support for services
|
|
21
|
+
- Support for NodeJs
|
|
22
|
+
- Push message support via subscribers
|
|
23
|
+
- Websocket support via subscribers, and methods for sending messages
|
|
24
|
+
- Websocket auth support
|
|
25
|
+
- Improved documentation
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _tslib = require('../_virtual/_tslib.cjs');
|
|
4
|
+
var future = require('../future/future.cjs');
|
|
5
|
+
require('ramda');
|
|
6
|
+
var synchronize = require('../synchronize.cjs');
|
|
7
|
+
var stream = require('../stream.cjs');
|
|
8
|
+
var stream_state = require('../stream/state.cjs');
|
|
9
|
+
var ValueDestroyedError = require('../errors/ValueDestroyedError.cjs');
|
|
10
|
+
|
|
11
|
+
class AtomicValue {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.setEvt = new synchronize.FutureEvent();
|
|
14
|
+
this.setLock = new synchronize.Lock();
|
|
15
|
+
this.closed = false;
|
|
16
|
+
}
|
|
17
|
+
set(value) {
|
|
18
|
+
return this.setLock.with(() => _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
if (this.closed) {
|
|
20
|
+
throw new ValueDestroyedError.ValueDestroyedError();
|
|
21
|
+
}
|
|
22
|
+
this.value = value;
|
|
23
|
+
this.setEvt.set();
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
get() {
|
|
27
|
+
return this.read(false);
|
|
28
|
+
}
|
|
29
|
+
pop() {
|
|
30
|
+
return this.read(true);
|
|
31
|
+
}
|
|
32
|
+
destroy() {
|
|
33
|
+
this.closed = true;
|
|
34
|
+
}
|
|
35
|
+
get stream() {
|
|
36
|
+
return new stream.Stream((signal) => this.pop()
|
|
37
|
+
.catch((error) => {
|
|
38
|
+
if (error instanceof ValueDestroyedError.ValueDestroyedError) {
|
|
39
|
+
return new stream_state.ExecutorState(true);
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
})
|
|
43
|
+
.registerSignal(signal));
|
|
44
|
+
}
|
|
45
|
+
read(removeValue) {
|
|
46
|
+
return future.Future.of((resolve, reject, signal) => _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
while (this.value === undefined && !this.closed) {
|
|
48
|
+
this.setEvt.clear();
|
|
49
|
+
yield this.setEvt.wait().registerSignal(signal);
|
|
50
|
+
}
|
|
51
|
+
if (this.closed && this.value === undefined) {
|
|
52
|
+
return reject(new ValueDestroyedError.ValueDestroyedError());
|
|
53
|
+
}
|
|
54
|
+
const value = this.value;
|
|
55
|
+
if (removeValue) {
|
|
56
|
+
this.value = undefined;
|
|
57
|
+
}
|
|
58
|
+
resolve(value);
|
|
59
|
+
if (this.closed) {
|
|
60
|
+
return reject(new ValueDestroyedError.ValueDestroyedError());
|
|
61
|
+
}
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
exports.AtomicValue = AtomicValue;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { __awaiter } from '../_virtual/_tslib.mjs';
|
|
2
|
+
import { Future } from '../future/future.mjs';
|
|
3
|
+
import 'ramda';
|
|
4
|
+
import { FutureEvent, Lock } from '../synchronize.mjs';
|
|
5
|
+
import { Stream } from '../stream.mjs';
|
|
6
|
+
import { ExecutorState } from '../stream/state.mjs';
|
|
7
|
+
import { ValueDestroyedError } from '../errors/ValueDestroyedError.mjs';
|
|
8
|
+
|
|
9
|
+
class AtomicValue {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.setEvt = new FutureEvent();
|
|
12
|
+
this.setLock = new Lock();
|
|
13
|
+
this.closed = false;
|
|
14
|
+
}
|
|
15
|
+
set(value) {
|
|
16
|
+
return this.setLock.with(() => __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
if (this.closed) {
|
|
18
|
+
throw new ValueDestroyedError();
|
|
19
|
+
}
|
|
20
|
+
this.value = value;
|
|
21
|
+
this.setEvt.set();
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
get() {
|
|
25
|
+
return this.read(false);
|
|
26
|
+
}
|
|
27
|
+
pop() {
|
|
28
|
+
return this.read(true);
|
|
29
|
+
}
|
|
30
|
+
destroy() {
|
|
31
|
+
this.closed = true;
|
|
32
|
+
}
|
|
33
|
+
get stream() {
|
|
34
|
+
return new Stream((signal) => this.pop()
|
|
35
|
+
.catch((error) => {
|
|
36
|
+
if (error instanceof ValueDestroyedError) {
|
|
37
|
+
return new ExecutorState(true);
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
})
|
|
41
|
+
.registerSignal(signal));
|
|
42
|
+
}
|
|
43
|
+
read(removeValue) {
|
|
44
|
+
return Future.of((resolve, reject, signal) => __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
while (this.value === undefined && !this.closed) {
|
|
46
|
+
this.setEvt.clear();
|
|
47
|
+
yield this.setEvt.wait().registerSignal(signal);
|
|
48
|
+
}
|
|
49
|
+
if (this.closed && this.value === undefined) {
|
|
50
|
+
return reject(new ValueDestroyedError());
|
|
51
|
+
}
|
|
52
|
+
const value = this.value;
|
|
53
|
+
if (removeValue) {
|
|
54
|
+
this.value = undefined;
|
|
55
|
+
}
|
|
56
|
+
resolve(value);
|
|
57
|
+
if (this.closed) {
|
|
58
|
+
return reject(new ValueDestroyedError());
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { AtomicValue };
|
package/data/store.cjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var manager = require('./store/manager.cjs');
|
|
4
|
+
var web = require('./store/web.cjs');
|
|
5
|
+
var json = require('./store/json.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.CacheManager = manager.CacheManager;
|
|
10
|
+
exports.LocalWebStore = web.LocalWebStore;
|
|
11
|
+
exports.SessionWebStore = web.SessionWebStore;
|
|
12
|
+
exports.JSONFileStore = json.JSONFileStore;
|
package/data/store.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class Publisher {
|
|
4
|
+
constructor(queue, transformer) {
|
|
5
|
+
this.queue = queue;
|
|
6
|
+
this.transformer = transformer;
|
|
7
|
+
}
|
|
8
|
+
send(value) {
|
|
9
|
+
this.queue.enqueue(this.transformer(value));
|
|
10
|
+
}
|
|
11
|
+
publish(value) {
|
|
12
|
+
this.send(value);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.Publisher = Publisher;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class Publisher {
|
|
2
|
+
constructor(queue, transformer) {
|
|
3
|
+
this.queue = queue;
|
|
4
|
+
this.transformer = transformer;
|
|
5
|
+
}
|
|
6
|
+
send(value) {
|
|
7
|
+
this.queue.enqueue(this.transformer(value));
|
|
8
|
+
}
|
|
9
|
+
publish(value) {
|
|
10
|
+
this.send(value);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { Publisher };
|
|
@@ -9,6 +9,7 @@ var synchronize = require('../../synchronize.cjs');
|
|
|
9
9
|
var stream = require('../../stream.cjs');
|
|
10
10
|
var QueueFullError = require('../../errors/QueueFullError.cjs');
|
|
11
11
|
var ValueDestroyedError = require('../../errors/ValueDestroyedError.cjs');
|
|
12
|
+
var Publisher = require('./Publisher.cjs');
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Queue data structure for First In First Out operation (FIFO)
|
|
@@ -25,6 +26,9 @@ class Queue extends WatchableObject.WatchableObject {
|
|
|
25
26
|
get streamEntries() {
|
|
26
27
|
return stream.Stream.of(this.asyncIterator);
|
|
27
28
|
}
|
|
29
|
+
createPublisher(transformer) {
|
|
30
|
+
return new Publisher.Publisher(this, transformer);
|
|
31
|
+
}
|
|
28
32
|
close() {
|
|
29
33
|
this.closed = true;
|
|
30
34
|
this.closedSignal.dispatchEvent(new CustomEvent("abort"));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { WatchableObject } from "./WatchableObject";
|
|
2
2
|
import { Future, WaitPeriod } from "../../future";
|
|
3
3
|
import { Stream } from "../../stream";
|
|
4
|
+
import { Publisher } from "./Publisher";
|
|
4
5
|
/**
|
|
5
6
|
* Queue data structure for First In First Out operation (FIFO)
|
|
6
7
|
*/
|
|
@@ -12,6 +13,7 @@ export declare class Queue<T> extends WatchableObject<number, T> implements Iter
|
|
|
12
13
|
private readonly dequeueEvt;
|
|
13
14
|
constructor(objectMaxSize?: number, expiryPeriod?: WaitPeriod);
|
|
14
15
|
get streamEntries(): Stream<T>;
|
|
16
|
+
createPublisher<K>(transformer: (v: K) => T): Publisher<T, K>;
|
|
15
17
|
close(): void;
|
|
16
18
|
clone(): Queue<T>;
|
|
17
19
|
ingest(stream: Stream<T>): Future<void>;
|
|
@@ -7,6 +7,7 @@ import { FutureEvent } from '../../synchronize.mjs';
|
|
|
7
7
|
import { Stream } from '../../stream.mjs';
|
|
8
8
|
import { QueueFullError } from '../../errors/QueueFullError.mjs';
|
|
9
9
|
import { ValueDestroyedError } from '../../errors/ValueDestroyedError.mjs';
|
|
10
|
+
import { Publisher } from './Publisher.mjs';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Queue data structure for First In First Out operation (FIFO)
|
|
@@ -23,6 +24,9 @@ class Queue extends WatchableObject {
|
|
|
23
24
|
get streamEntries() {
|
|
24
25
|
return Stream.of(this.asyncIterator);
|
|
25
26
|
}
|
|
27
|
+
createPublisher(transformer) {
|
|
28
|
+
return new Publisher(this, transformer);
|
|
29
|
+
}
|
|
26
30
|
close() {
|
|
27
31
|
this.closed = true;
|
|
28
32
|
this.closedSignal.dispatchEvent(new CustomEvent("abort"));
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"gingersnap","version":"0.23.
|
|
1
|
+
{"name":"gingersnap","version":"0.23.5","description":"A general purpose library built with the aim of filling the gaps of javascript shortcomings","dependencies":{"@msgpack/msgpack":"^3.0.0-beta2","browser-or-node":"^3.0.0-pre.0","modern-isomorphic-ws":"^1.0.5","object-hash":"^3.0.0","papaparse":"^5.4.1","protobufjs":"^7.2.6","ramda":"^0.30.1","reflect-metadata":"^0.2.2","tslib":"^2.6.3","uuid":"^9.0.1","ws":"^8.16.0","x2js":"^3.4.4"},"author":"CookieNerds LLC","exports":{"./synchronize":{"import":{"types":"./synchronize.d.ts","default":"./synchronize.mjs"},"require":{"types":"./synchronize.d.ts","default":"./synchronize.cjs"}},"./mocks":{"import":{"types":"./mocks.d.ts","default":"./mocks.mjs"},"require":{"types":"./mocks.d.ts","default":"./mocks.cjs"}},"./socket":{"import":{"types":"./socket.d.ts","default":"./socket.mjs"},"require":{"types":"./socket.d.ts","default":"./socket.cjs"}},"./typing":{"import":{"types":"./typing.d.ts","default":"./typing.mjs"},"require":{"types":"./typing.d.ts","default":"./typing.cjs"}},"./stream":{"import":{"types":"./stream/index.d.ts","default":"./stream.mjs"},"require":{"types":"./stream/index.d.ts","default":"./stream.cjs"}},"./reflection/injector":{"import":{"types":"./reflection/injector.d.ts","default":"./reflection/injector.mjs"},"require":{"types":"./reflection/injector.d.ts","default":"./reflection/injector.cjs"}},"./stream/call":{"import":{"types":"./stream/call.d.ts","default":"./stream/call.mjs"},"require":{"types":"./stream/call.d.ts","default":"./stream/call.cjs"}},"./stream/state":{"import":{"types":"./stream/state.d.ts","default":"./stream/state.mjs"},"require":{"types":"./stream/state.d.ts","default":"./stream/state.cjs"}},"./stream/collector":{"import":{"types":"./stream/collector.d.ts","default":"./stream/collector.mjs"},"require":{"types":"./stream/collector.d.ts","default":"./stream/collector.cjs"}},"./stream/observable":{"import":{"types":"./stream/observable.d.ts","default":"./stream/observable.mjs"},"require":{"types":"./stream/observable.d.ts","default":"./stream/observable.cjs"}},"./networking":{"import":{"types":"./networking/index.d.ts","default":"./networking.mjs"},"require":{"types":"./networking/index.d.ts","default":"./networking.cjs"}},"./managers":{"import":{"types":"./managers/index.d.ts","default":"./managers.mjs"},"require":{"types":"./managers/index.d.ts","default":"./managers.cjs"}},"./future":{"import":{"types":"./future/index.d.ts","default":"./future.mjs"},"require":{"types":"./future/index.d.ts","default":"./future.cjs"}},"./errors":{"import":{"types":"./errors/index.d.ts","default":"./errors.mjs"},"require":{"types":"./errors/index.d.ts","default":"./errors.cjs"}},"./data-structures/array":{"import":{"types":"./data-structures/array/index.d.ts","default":"./data-structures/array.mjs"},"require":{"types":"./data-structures/array/index.d.ts","default":"./data-structures/array.cjs"}},"./data-structures/object":{"import":{"types":"./data-structures/object/index.d.ts","default":"./data-structures/object.mjs"},"require":{"types":"./data-structures/object/index.d.ts","default":"./data-structures/object.cjs"}},"./data/decoders":{"import":{"types":"./data/decoders/index.d.ts","default":"./data/decoders.mjs"},"require":{"types":"./data/decoders/index.d.ts","default":"./data/decoders.cjs"}},"./data/model":{"import":{"types":"./data/model/index.d.ts","default":"./data/model.mjs"},"require":{"types":"./data/model/index.d.ts","default":"./data/model.cjs"}},"./data/bus":{"import":{"types":"./data/bus.d.ts","default":"./data/bus.mjs"},"require":{"types":"./data/bus.d.ts","default":"./data/bus.cjs"}},"./data/AtomicValue":{"import":{"types":"./data/AtomicValue.d.ts","default":"./data/AtomicValue.mjs"},"require":{"types":"./data/AtomicValue.d.ts","default":"./data/AtomicValue.cjs"}},"./data/store":{"import":{"types":"./data/store/index.d.ts","default":"./data/store.mjs"},"require":{"types":"./data/store/index.d.ts","default":"./data/store.cjs"}},"./functools":{"import":{"types":"./functools/index.d.ts","default":"./functools.mjs"},"require":{"types":"./functools/index.d.ts","default":"./functools.cjs"}}}}
|
package/stream.cjs
CHANGED
|
@@ -15,7 +15,7 @@ var IllegalOperationError = require('./errors/IllegalOperationError.cjs');
|
|
|
15
15
|
require('./data-structures/object/WatchableObject.cjs');
|
|
16
16
|
require('uuid');
|
|
17
17
|
var Queue = require('./data-structures/object/Queue.cjs');
|
|
18
|
-
var
|
|
18
|
+
var data_AtomicValue = require('./data/AtomicValue.cjs');
|
|
19
19
|
|
|
20
20
|
function _interopNamespaceDefault(e) {
|
|
21
21
|
var n = Object.create(null);
|
|
@@ -769,7 +769,7 @@ class Stream {
|
|
|
769
769
|
*/
|
|
770
770
|
conflate() {
|
|
771
771
|
return Stream.seed(() => {
|
|
772
|
-
const value = new
|
|
772
|
+
const value = new data_AtomicValue.AtomicValue();
|
|
773
773
|
this.forEach((record) => value.set(record))
|
|
774
774
|
.finally(() => value.destroy())
|
|
775
775
|
.schedule();
|
package/stream.mjs
CHANGED
|
@@ -13,7 +13,7 @@ import { IllegalOperationError } from './errors/IllegalOperationError.mjs';
|
|
|
13
13
|
import './data-structures/object/WatchableObject.mjs';
|
|
14
14
|
import 'uuid';
|
|
15
15
|
import { Queue } from './data-structures/object/Queue.mjs';
|
|
16
|
-
import { AtomicValue } from './data/
|
|
16
|
+
import { AtomicValue } from './data/AtomicValue.mjs';
|
|
17
17
|
|
|
18
18
|
var ActionType;
|
|
19
19
|
(function (ActionType) {
|