Passed
Pull Request — master (#91)
by Mark
02:55
created

src/Store/Connection.ts   A

Complexity

Total Complexity 17
Complexity/F 1.55

Size

Lines of Code 114
Function Count 11

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 81
dl 0
loc 114
rs 10
c 0
b 0
f 0
wmc 17
mnd 6
bc 6
fnc 11
bpm 0.5454
cpm 1.5454
noi 0

11 Functions

Rating   Name   Duplication   Size   Complexity  
A Connection.addToQueue 0 3 1
A Connection.pause 0 3 1
A Connection.resume 0 3 1
A Connection.processQueue 0 9 4
A Connection.patch 0 6 1
A Connection.put 0 6 1
A Connection.handleQueueMessage 0 6 1
A Connection.load 0 6 1
A Connection.all 0 6 4
A Connection.delete 0 6 1
A Connection.post 0 6 1
1
import {ConnectionAdapterFactory} from "./Connection/ConnectionAdapterFactory";
2
import QueueMessage from "./Connection/Queue/QueueMessage";
3
import {AdapterInterface, ModelInterface} from "../JeloquentInterfaces";
4
5
/**
6
 *
7
 */
8
export default class Connection {
9
10
    private _updateQueue: Array<QueueMessage>;
11
12
    private adapter: AdapterInterface;
13
14
    private paused: boolean;
15
16
    constructor(adapter:AdapterInterface|string, options: object) {
17
        let interfaceAdapter;
18
        let stringAdapter;
19
20
        if (adapter instanceof String) {
21
            stringAdapter = adapter;
22
        } else {
23
            interfaceAdapter = adapter;
24
        }
25
26
        this.adapter = interfaceAdapter ?? ConnectionAdapterFactory.getAdapter(stringAdapter, options);
27
28
        this._updateQueue = [];
29
        this.paused = false;
30
    }
31
32
    all(model: ModelInterface): Promise<unknown> {
33
        return new Promise((resolve) => {
34
            this.adapter.all(model)
35
                .then((queueMessage) => {
36
                    this.handleQueueMessage(queueMessage, resolve);
37
                });
38
        });
39
    }
40
41
    delete(model: ModelInterface): Promise<unknown> {
42
        return new Promise((resolve) => {
43
            this.adapter.delete(model)
44
                .then((queueMessage) => {
45
                    this.handleQueueMessage(queueMessage, resolve);
46
                });
47
        });
48
    }
49
50
    /**
51
     * @deprecated
52
     */
53
    load(model: ModelInterface): Promise<unknown> {
54
        return this.all(model)
55
    }
56
57
    patch(model: ModelInterface): Promise<unknown> {
58
        return new Promise((resolve) => {
59
            this.adapter.patch(model)
60
                .then((queueMessage) => {
61
                    this.handleQueueMessage(queueMessage, resolve);
62
                });
63
        });
64
    }
65
66
    pause(): void {
67
        this.paused = true;
68
    }
69
70
    post(model: ModelInterface): Promise<unknown> {
71
        return new Promise((resolve) => {
72
            this.adapter.post(model)
73
                .then((queueMessage) => {
74
                    this.handleQueueMessage(queueMessage, resolve);
75
                });
76
        });
77
    }
78
79
    put(model): Promise<unknown> {
80
        return new Promise((resolve) => {
81
            this.adapter.put(model)
82
                .then((queueMessage) => {
83
                    this.handleQueueMessage(queueMessage, resolve);
84
                });
85
        });
86
    }
87
88
    resume(): void {
89
        this.paused = false;
90
    }
91
92
    private addToQueue(...queueMessage: QueueMessage): void {
93
        this._updateQueue.push(...queueMessage);
94
    }
95
96
    private handleQueueMessage(queueMessage: QueueMessage, resolve: CallableFunction): void {
97
        queueMessage.addCallback(resolve);
98
        this.addToQueue(queueMessage);
99
        queueMicrotask(() => {
100
            this.processQueue();
101
        });
102
    }
103
104
    private processQueue(): void {
105
        const nextMessage = (this._updateQueue ?? []).shift();
106
        if (!nextMessage) {
107
            return;
108
        }
109
        nextMessage.execute();
110
        queueMicrotask(() => {
111
            this.processQueue();
112
        });
113
    }
114
}