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 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,3 @@
1
+ export { CacheManager } from './store/manager.mjs';
2
+ export { LocalWebStore, SessionWebStore } from './store/web.mjs';
3
+ export { JSONFileStore } from './store/json.mjs';
@@ -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,8 @@
1
+ import { Queue } from "./Queue";
2
+ export declare class Publisher<T, K> {
3
+ private readonly queue;
4
+ private readonly transformer;
5
+ constructor(queue: Queue<T>, transformer: (v: K) => T);
6
+ send(value: K): void;
7
+ publish(value: K): void;
8
+ }
@@ -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.3","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/value":{"import":{"types":"./data/value.d.ts","default":"./data/value.mjs"},"require":{"types":"./data/value.d.ts","default":"./data/value.cjs"}},"./store":{"import":{"types":"./store/index.d.ts","default":"./store.mjs"},"require":{"types":"./store/index.d.ts","default":"./store.cjs"}},"./functools":{"import":{"types":"./functools/index.d.ts","default":"./functools.mjs"},"require":{"types":"./functools/index.d.ts","default":"./functools.cjs"}}}}
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 data_value = require('./data/value.cjs');
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 data_value.AtomicValue();
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/value.mjs';
16
+ import { AtomicValue } from './data/AtomicValue.mjs';
17
17
 
18
18
  var ActionType;
19
19
  (function (ActionType) {