yodata 0.0.1
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 +128 -0
- package/data/collection.js +156 -0
- package/data/plugin.js +250 -0
- package/package.json +19 -0
- package/ws/Message.js +18 -0
- package/ws/index.js +195 -0
package/README.md
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# Y0data services #
|
2
|
+
|
3
|
+
**Please read y0data inc before using it**
|
4
|
+
**To get database id go to https://data.y0host.net/**
|
5
|
+
**Your data will save in servers y0data, so no disk will take from your server**
|
6
|
+
|
7
|
+
# install y0data
|
8
|
+
|
9
|
+
``` js
|
10
|
+
npm install y0data
|
11
|
+
```
|
12
|
+
|
13
|
+
# Connect Database
|
14
|
+
|
15
|
+
``` js
|
16
|
+
let y0data = require('y0data')
|
17
|
+
let db = new y0data('DATA BASE ID')
|
18
|
+
db.connect();
|
19
|
+
```
|
20
|
+
|
21
|
+
# events
|
22
|
+
|
23
|
+
```js
|
24
|
+
db.once('ready', async ()=>{
|
25
|
+
console.log(`DataBase Ready`)
|
26
|
+
})
|
27
|
+
|
28
|
+
db.on('error', (err)=>{
|
29
|
+
console.log(`Error: ` + err)
|
30
|
+
})
|
31
|
+
```
|
32
|
+
|
33
|
+
# setup collection
|
34
|
+
|
35
|
+
```js
|
36
|
+
let customersDB = db.setUpCollection('customers')
|
37
|
+
```
|
38
|
+
|
39
|
+
# functions
|
40
|
+
|
41
|
+
## Create
|
42
|
+
```js
|
43
|
+
let data = await customersDB.add([{"money": 51}, {"money": 9}]) // example output → '[Accepted Data]'
|
44
|
+
let data = await customersDB.add({"_id": "123", "money": 5}) // example output → '{Accepted Data} / null'
|
45
|
+
/*
|
46
|
+
For free plan 50 array max in same time
|
47
|
+
For Shared Plan 100 Array max in same time
|
48
|
+
For Server Plan 500 Array max in same time
|
49
|
+
*/
|
50
|
+
```
|
51
|
+
|
52
|
+
## find data
|
53
|
+
```js
|
54
|
+
let options = {
|
55
|
+
$gte: {money: 10}, // Get Users have money low of 10
|
56
|
+
$gt: {money: 50} // get Users have money more of 50
|
57
|
+
$in: {_id: ['123', '1234']} // get Users have in same _id
|
58
|
+
}
|
59
|
+
|
60
|
+
let data = await customersDB.find(options).exec(); // example output → 'Array'
|
61
|
+
let data = await customersDB.find(options).limit(20).exec(); // (Get Only 20 data) example output → 'Array'
|
62
|
+
let data = await customersDB.find(options).skip(20).exec(); // (Skip first 20) example output → 'Array'
|
63
|
+
let data = await customersDB.find(options).select({money: 1}).exec(); // (Will only see _id and money) example output → 'Array'
|
64
|
+
let data = await customersDB.find(options).select({money: 0}).exec(); // (Will hide money) example output → 'Array'
|
65
|
+
|
66
|
+
let data = await customersDB.findOne(options).exec(); // example output → 'Object/Null'
|
67
|
+
let data = await customersDB.findOne(options).skip(20).exec(); // (Skip first 20) example output → 'Object/Null'
|
68
|
+
let data = await customersDB.findOne(options).select({money: 1}).exec(); // (Will only see _id and money) example output → 'Object/Null'
|
69
|
+
let data = await customersDB.findOne(options).select({money: 0}).exec(); // (Will hide money) example output → 'Object/Null'
|
70
|
+
```
|
71
|
+
|
72
|
+
## Update Data
|
73
|
+
```js
|
74
|
+
let options = {
|
75
|
+
$gte: {money: 10}, // Get Users have money low of 10
|
76
|
+
$gt: {money: 50} // get Users have money more of 50
|
77
|
+
$in: {_id: ['123', '1234']} // get Users have in same _id
|
78
|
+
}
|
79
|
+
|
80
|
+
let new_values = {
|
81
|
+
$inc: {money: 50}, // Add money you can also do -50 to remove
|
82
|
+
|
83
|
+
$push: {arr: ["1"]}, // add in array items
|
84
|
+
$push: {arr: "1"}, // add in array item
|
85
|
+
|
86
|
+
$pull: {arr: ["1"]}, // delete from array items
|
87
|
+
$pull: {arr: "1"} // delete from array item
|
88
|
+
}
|
89
|
+
|
90
|
+
let data = await customersDB.updateOne(options, new_values) // example output → 'true/false'
|
91
|
+
|
92
|
+
let data = await customersDB.updateMany(options, new_values); // example output → 'true/false' (if update one only will return true always)
|
93
|
+
```
|
94
|
+
|
95
|
+
## Delete Data
|
96
|
+
```js
|
97
|
+
let options = {
|
98
|
+
$gte: {money: 10}, // Get Users have money low of 10
|
99
|
+
$gt: {money: 50} // get Users have money more of 50
|
100
|
+
$in: {_id: ['123', '1234']} // get Users have in same _id
|
101
|
+
}
|
102
|
+
|
103
|
+
let data = await customersDB.deleteOne(options) // example output → 'true/false'
|
104
|
+
|
105
|
+
let data = await customersDB.deleteMany(options); // example output → 'true/false' (if update one only will return true always)
|
106
|
+
```
|
107
|
+
|
108
|
+
## Other functions will support you
|
109
|
+
```js
|
110
|
+
let options = {
|
111
|
+
$gte: {money: 10}, // Get Users have money low of 10
|
112
|
+
$gt: {money: 50} // get Users have money more of 50
|
113
|
+
$in: {_id: ['123', '1234']} // get Users have in same _id
|
114
|
+
}
|
115
|
+
|
116
|
+
let data = await customersDB.countDocuments(options) // example output → 'true/false'
|
117
|
+
|
118
|
+
let data = await customersDB.getSize(options); // example output → 'true/false' (if update one only will return true always)
|
119
|
+
```
|
120
|
+
|
121
|
+
## Watch
|
122
|
+
```js
|
123
|
+
await cusotmersDB.watch()
|
124
|
+
|
125
|
+
db.on('watch', (data)=>{
|
126
|
+
console.log('data watch =>', data) // will get name of collection and more data
|
127
|
+
})
|
128
|
+
```
|
@@ -0,0 +1,156 @@
|
|
1
|
+
let randomToken = require('random-token')
|
2
|
+
let ws = require('../ws/index.js')
|
3
|
+
let EventEmitter = require("events");
|
4
|
+
|
5
|
+
let create = async function (thi, collectionName){
|
6
|
+
|
7
|
+
let requestID = randomToken(8)
|
8
|
+
|
9
|
+
setTimeout(()=>{ thi.project.createMessage({event: "createCollection", data:{name: collectionName}, requestID}) }, 100)
|
10
|
+
|
11
|
+
let res = (await thi.waitResponse(requestID))
|
12
|
+
|
13
|
+
if(res.event === 'rejected') return null
|
14
|
+
return true
|
15
|
+
|
16
|
+
}
|
17
|
+
|
18
|
+
let push = async function (thi, collectionName, options){
|
19
|
+
|
20
|
+
let requestID = randomToken(8)
|
21
|
+
|
22
|
+
setTimeout(()=>{ thi.project.createMessage({event: "create", data:{name: collectionName, options}, requestID}) }, 100)
|
23
|
+
|
24
|
+
let res = (await thi.waitResponse(requestID))
|
25
|
+
|
26
|
+
if(res.event === 'rejected') return null
|
27
|
+
return res.data
|
28
|
+
|
29
|
+
}
|
30
|
+
|
31
|
+
let find = async function (thi, collectionName, options, select, limit, skip){
|
32
|
+
|
33
|
+
let requestID = randomToken(8)
|
34
|
+
|
35
|
+
setTimeout(()=>{ thi.project.createMessage({event: "find", data:{name: collectionName, options, select, limit, skip}, requestID}) }, 100)
|
36
|
+
|
37
|
+
let res = (await thi.waitChunk(requestID))
|
38
|
+
|
39
|
+
if(res.event === 'rejected') return null
|
40
|
+
|
41
|
+
return res.data
|
42
|
+
|
43
|
+
}
|
44
|
+
|
45
|
+
let findOne = async function (thi, collectionName, options, select, skip){
|
46
|
+
|
47
|
+
let requestID = randomToken(8)
|
48
|
+
|
49
|
+
setTimeout(()=>{ thi.project.createMessage({event: "findOne", data:{name: collectionName, options, select, skip}, requestID}) }, 100)
|
50
|
+
|
51
|
+
let res = (await thi.waitResponse(requestID))
|
52
|
+
|
53
|
+
if(res.event === 'rejected') return null
|
54
|
+
|
55
|
+
return res.data
|
56
|
+
|
57
|
+
}
|
58
|
+
|
59
|
+
let deleteOne = async function (thi, collectionName, options){
|
60
|
+
|
61
|
+
let requestID = randomToken(8)
|
62
|
+
|
63
|
+
setTimeout(()=>{ thi.project.createMessage({event: "deleteOne", data:{name: collectionName, options}, requestID}) }, 100)
|
64
|
+
|
65
|
+
let res = (await thi.waitResponse(requestID))
|
66
|
+
|
67
|
+
if(res.event === 'rejected') return null
|
68
|
+
|
69
|
+
return res.data
|
70
|
+
|
71
|
+
}
|
72
|
+
|
73
|
+
let deleteMany = async function (thi, collectionName, options){
|
74
|
+
|
75
|
+
let requestID = randomToken(8)
|
76
|
+
|
77
|
+
setTimeout(()=>{ thi.project.createMessage({event: "deleteMany", data:{name: collectionName, options}, requestID}) }, 100)
|
78
|
+
|
79
|
+
let res = (await thi.waitResponse(requestID))
|
80
|
+
|
81
|
+
if(res.event === 'rejected') return null
|
82
|
+
|
83
|
+
return res.data
|
84
|
+
|
85
|
+
}
|
86
|
+
|
87
|
+
let updateOne = async function (thi, collectionName, options, new_values){
|
88
|
+
|
89
|
+
let requestID = randomToken(8)
|
90
|
+
|
91
|
+
setTimeout(()=>{ thi.project.createMessage({event: "updateOne", data:{name: collectionName, options, new_values}, requestID}) }, 100)
|
92
|
+
|
93
|
+
let res = (await thi.waitResponse(requestID))
|
94
|
+
|
95
|
+
if(res.event === 'rejected') return null
|
96
|
+
return res.data
|
97
|
+
|
98
|
+
}
|
99
|
+
|
100
|
+
let updateMany = async function (thi, collectionName, options, new_values){
|
101
|
+
|
102
|
+
let requestID = randomToken(8)
|
103
|
+
|
104
|
+
setTimeout(()=>{ thi.project.createMessage({event: "updateMany", data:{name: collectionName, options, new_values}, requestID}) }, 100)
|
105
|
+
|
106
|
+
let res = (await thi.waitResponse(requestID))
|
107
|
+
|
108
|
+
if(res.event === 'rejected') return null
|
109
|
+
|
110
|
+
return res.data
|
111
|
+
|
112
|
+
}
|
113
|
+
|
114
|
+
let countDocuments = async function (thi, collectionName, options){
|
115
|
+
|
116
|
+
let requestID = randomToken(8)
|
117
|
+
|
118
|
+
setTimeout(()=>{ thi.project.createMessage({event: "countDocuments", data:{name: collectionName, options}, requestID}) }, 100)
|
119
|
+
|
120
|
+
let res = (await thi.waitResponse(requestID))
|
121
|
+
|
122
|
+
if(res.event === 'rejected') return null
|
123
|
+
|
124
|
+
return res.data || 0
|
125
|
+
|
126
|
+
}
|
127
|
+
|
128
|
+
let getSize = async function (thi, collectionName, options){
|
129
|
+
|
130
|
+
let requestID = randomToken(8)
|
131
|
+
|
132
|
+
setTimeout(()=>{ thi.project.createMessage({event: "getSize", data:{name: collectionName, options}, requestID}) }, 100)
|
133
|
+
|
134
|
+
let res = (await thi.waitResponse(requestID))
|
135
|
+
|
136
|
+
if(res.event === 'rejected') return null
|
137
|
+
|
138
|
+
return res.data || 0
|
139
|
+
|
140
|
+
}
|
141
|
+
|
142
|
+
let watch = async function (thi, collectionName){
|
143
|
+
|
144
|
+
let requestID = randomToken(8)
|
145
|
+
|
146
|
+
setTimeout(()=>{ thi.project.createMessage({event: "watch", data:{name: collectionName}, requestID}) }, 100)
|
147
|
+
|
148
|
+
let res = (await thi.waitResponse(requestID))
|
149
|
+
|
150
|
+
if(res.event === 'rejected') return null
|
151
|
+
|
152
|
+
return res.data || 0
|
153
|
+
|
154
|
+
}
|
155
|
+
|
156
|
+
module.exports = {create, push, find, findOne, deleteOne, deleteMany, updateOne, updateMany, countDocuments, getSize, watch};
|
package/data/plugin.js
ADDED
@@ -0,0 +1,250 @@
|
|
1
|
+
let randomToken = require('random-token')
|
2
|
+
let ws = require('../ws/index.js')
|
3
|
+
let EventEmitter = require("events");
|
4
|
+
|
5
|
+
//console.log(manage.select([{must: true, love: true}, {must: true, love: false}], {love: 1}))
|
6
|
+
let collection = require('../data/collection.js')
|
7
|
+
|
8
|
+
class Plugin extends EventEmitter {
|
9
|
+
constructor (dataBaseID) {
|
10
|
+
super (dataBaseID)
|
11
|
+
|
12
|
+
this.dataBaseID = dataBaseID
|
13
|
+
this.project = new ws(`wss://y0data.glitch.me/?database_id=${this.dataBaseID}`)
|
14
|
+
|
15
|
+
process.plugin = this
|
16
|
+
|
17
|
+
}
|
18
|
+
|
19
|
+
connect(){
|
20
|
+
|
21
|
+
this.project.on('ready', ()=>{
|
22
|
+
this.emit('connect')
|
23
|
+
})
|
24
|
+
|
25
|
+
this.project.on('disconnect', () =>{
|
26
|
+
this.emit('disconnect')
|
27
|
+
this.project.reconnectStatus = true
|
28
|
+
})
|
29
|
+
|
30
|
+
this.project.on('message', (msg) =>{
|
31
|
+
|
32
|
+
let data = msg.json()
|
33
|
+
|
34
|
+
// console.log(data)
|
35
|
+
|
36
|
+
if(data.event === 'ready'){
|
37
|
+
this.emit('ready')
|
38
|
+
|
39
|
+
}
|
40
|
+
if(data.event === 'watchData'){
|
41
|
+
|
42
|
+
if(data.requestID) return;
|
43
|
+
|
44
|
+
this.emit('watch', data.data)
|
45
|
+
|
46
|
+
}
|
47
|
+
if(data.event === 'error'){
|
48
|
+
|
49
|
+
let errors = [{
|
50
|
+
num: 401,
|
51
|
+
message: "Failed Authorized with your database, please verify from id",
|
52
|
+
reconnect: false
|
53
|
+
}]
|
54
|
+
|
55
|
+
let err = errors.find(x => x.num === data.data)
|
56
|
+
|
57
|
+
if(!err?.reconnect){
|
58
|
+
|
59
|
+
this.project.reconnectStatus = false
|
60
|
+
|
61
|
+
}else{
|
62
|
+
|
63
|
+
this.project.reconnectStatus = true
|
64
|
+
|
65
|
+
}
|
66
|
+
|
67
|
+
this.emit('error', (err?.message || data.data))
|
68
|
+
}
|
69
|
+
|
70
|
+
})
|
71
|
+
|
72
|
+
}
|
73
|
+
|
74
|
+
async waitResponse(requestID){
|
75
|
+
return await new Promise(async re => {
|
76
|
+
|
77
|
+
let claimedMessage = (data)=>{
|
78
|
+
let msg = data.json()
|
79
|
+
|
80
|
+
if(msg.requestID === requestID){
|
81
|
+
re(msg);
|
82
|
+
this.project.removeListener('message', claimedMessage)
|
83
|
+
}
|
84
|
+
|
85
|
+
}
|
86
|
+
|
87
|
+
this.project.on('message', (data)=>claimedMessage(data))
|
88
|
+
|
89
|
+
})
|
90
|
+
}
|
91
|
+
|
92
|
+
async waitChunk(requestID){
|
93
|
+
return await new Promise(async re => {
|
94
|
+
|
95
|
+
let result = '';
|
96
|
+
|
97
|
+
let claimedMessage = (data)=>{
|
98
|
+
let msg = data.json()
|
99
|
+
|
100
|
+
if(msg.requestID === requestID && msg.event === 'chunk'){
|
101
|
+
// re(msg);
|
102
|
+
// this.project.removeListener('message', claimedMessage)
|
103
|
+
|
104
|
+
result += msg.data
|
105
|
+
|
106
|
+
}
|
107
|
+
|
108
|
+
if(msg.requestID === requestID && msg.event === 'finish'){
|
109
|
+
|
110
|
+
result += msg.data
|
111
|
+
|
112
|
+
re({event: "accepted", data: JSON.parse(result)})
|
113
|
+
result = ''
|
114
|
+
this.project.removeListener('message', claimedMessage)
|
115
|
+
|
116
|
+
}
|
117
|
+
|
118
|
+
}
|
119
|
+
|
120
|
+
|
121
|
+
this.project.on('message', (data)=>claimedMessage(data))
|
122
|
+
|
123
|
+
})
|
124
|
+
}
|
125
|
+
|
126
|
+
setUpCollection(collectionName){
|
127
|
+
//, withData, select
|
128
|
+
let requestID = randomToken(8)
|
129
|
+
|
130
|
+
//setTimeout(()=>{ this.project.createMessage({event: "findCollection", data:{name: collectionName, withData: withData, select: select}, requestID}) }, 100)
|
131
|
+
|
132
|
+
//var response = await this.waitResponse(requestID)
|
133
|
+
|
134
|
+
//let res = Array.isArray(response?.data) ? response?.data : [] || []
|
135
|
+
|
136
|
+
let res = []
|
137
|
+
|
138
|
+
res.add = async (options)=>{
|
139
|
+
return await collection.push(this, collectionName, options)
|
140
|
+
}
|
141
|
+
|
142
|
+
res.find = (options)=>{
|
143
|
+
|
144
|
+
let query = {}
|
145
|
+
|
146
|
+
var useSelect = null
|
147
|
+
let useLimit = null
|
148
|
+
let useSkip = null
|
149
|
+
|
150
|
+
query.select = (select)=>{
|
151
|
+
useSelect = select
|
152
|
+
return query
|
153
|
+
}
|
154
|
+
|
155
|
+
query.limit = (num)=>{
|
156
|
+
useLimit = num
|
157
|
+
return query
|
158
|
+
}
|
159
|
+
|
160
|
+
query.skip = (num)=>{
|
161
|
+
useSkip = num
|
162
|
+
return query
|
163
|
+
}
|
164
|
+
|
165
|
+
query.exec = ()=>{
|
166
|
+
return collection.find(this, collectionName, options, useSelect, useLimit, useSkip)
|
167
|
+
}
|
168
|
+
|
169
|
+
return query
|
170
|
+
}
|
171
|
+
|
172
|
+
res.findOne = (options, select)=>{
|
173
|
+
|
174
|
+
let query = {}
|
175
|
+
|
176
|
+
var useSelect = null
|
177
|
+
let useLimit = null
|
178
|
+
let useSkip = null
|
179
|
+
|
180
|
+
query.select = (select)=>{
|
181
|
+
useSelect = select
|
182
|
+
return query
|
183
|
+
}
|
184
|
+
|
185
|
+
query.limit = (num)=>{
|
186
|
+
useLimit = num
|
187
|
+
return query
|
188
|
+
}
|
189
|
+
|
190
|
+
query.skip = (num)=>{
|
191
|
+
useSkip = num
|
192
|
+
return query
|
193
|
+
}
|
194
|
+
|
195
|
+
query.exec = ()=>{
|
196
|
+
return collection.findOne(this, collectionName, options, useSelect, useSkip)
|
197
|
+
}
|
198
|
+
|
199
|
+
return query
|
200
|
+
|
201
|
+
}
|
202
|
+
|
203
|
+
res.deleteOne = (options)=>{
|
204
|
+
|
205
|
+
return collection.deleteOne(this, collectionName, options)
|
206
|
+
|
207
|
+
}
|
208
|
+
|
209
|
+
res.deleteMany = (options)=>{
|
210
|
+
|
211
|
+
return collection.deleteMany(this, collectionName, options)
|
212
|
+
|
213
|
+
}
|
214
|
+
|
215
|
+
res.updateOne = (options, new_values)=>{
|
216
|
+
|
217
|
+
return collection.updateOne(this, collectionName, options, new_values)
|
218
|
+
|
219
|
+
}
|
220
|
+
|
221
|
+
res.updateMany = (options, new_values)=>{
|
222
|
+
|
223
|
+
return collection.updateMany(this, collectionName, options, new_values)
|
224
|
+
|
225
|
+
}
|
226
|
+
|
227
|
+
res.countDocuments = (options)=>{
|
228
|
+
|
229
|
+
return collection.countDocuments(this, collectionName, options)
|
230
|
+
|
231
|
+
}
|
232
|
+
|
233
|
+
res.size = (options)=>{
|
234
|
+
|
235
|
+
return collection.getSize(this, collectionName, options)
|
236
|
+
|
237
|
+
}
|
238
|
+
|
239
|
+
res.watch = ()=>{
|
240
|
+
|
241
|
+
return collection.watch(this, collectionName)
|
242
|
+
|
243
|
+
}
|
244
|
+
|
245
|
+
return res
|
246
|
+
|
247
|
+
}
|
248
|
+
|
249
|
+
}
|
250
|
+
module.exports = Plugin;
|
package/package.json
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"name": "yodata",
|
3
|
+
"description": "Y0data online services to save your data",
|
4
|
+
"version": "0.0.1",
|
5
|
+
"main": "data/plugin.js",
|
6
|
+
"dependencies": {
|
7
|
+
"events": "^3.3.0",
|
8
|
+
"random-token": "^0.0.8",
|
9
|
+
"ws": "^8.16.0"
|
10
|
+
},
|
11
|
+
"keywords": [
|
12
|
+
"database",
|
13
|
+
"data",
|
14
|
+
"y0data"
|
15
|
+
],
|
16
|
+
"author": "Yousuf",
|
17
|
+
"license": "BSD-2-Clause",
|
18
|
+
"readmeFilename": "README.md"
|
19
|
+
}
|
package/ws/Message.js
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class Message extends Object {
|
2
|
+
constructor (message) {
|
3
|
+
super ()
|
4
|
+
this.body = message
|
5
|
+
}
|
6
|
+
|
7
|
+
json(){
|
8
|
+
try { return JSON.parse(this.body) } catch(e) { return e.message };
|
9
|
+
}
|
10
|
+
|
11
|
+
text(){
|
12
|
+
if(this.body.includes('Buffer')) return Buffer.from(this.body).toString("utf8")
|
13
|
+
return this.body
|
14
|
+
}
|
15
|
+
|
16
|
+
}
|
17
|
+
module.exports = Message
|
18
|
+
|
package/ws/index.js
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
let EventEmitter = require("events");
|
2
|
+
const ws = require('ws')
|
3
|
+
let Message = require('../ws/Message.js')
|
4
|
+
|
5
|
+
class index extends EventEmitter {
|
6
|
+
constructor (url, options) {
|
7
|
+
super ()
|
8
|
+
this.headers = {}
|
9
|
+
if(!options) options = {}
|
10
|
+
if(options.headers) this.headers = options.headers
|
11
|
+
|
12
|
+
this.eventSendMessage = options.sendMessage
|
13
|
+
|
14
|
+
if(options.sendMessage) {
|
15
|
+
if(options.sendMessage.on) this.eventSendMessage = options.sendMessage.on
|
16
|
+
}
|
17
|
+
|
18
|
+
this.options = options
|
19
|
+
this.url = url
|
20
|
+
this.pingStatus = false
|
21
|
+
this.project = null
|
22
|
+
this.autosendStatus = false
|
23
|
+
this.historyPing = []
|
24
|
+
this.historySend = []
|
25
|
+
this.autoSend = {time: 10, msg: {"event": "hello", data: {world: true}}}
|
26
|
+
this.pingOptions = {time: 35, msg: {"event": "ping", data: {}}}
|
27
|
+
this._messages = []
|
28
|
+
this.cache = true
|
29
|
+
|
30
|
+
this.ready = false
|
31
|
+
|
32
|
+
if(options.cache === false) this.cache = false
|
33
|
+
this.reconnectStatus = options.reconnect || false
|
34
|
+
this._catchSystem()
|
35
|
+
this._connect(url, this.headers, options)
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
_catchSystem(){
|
40
|
+
setInterval(async ()=>{
|
41
|
+
if(this.cache === true) return;
|
42
|
+
this._messages = []
|
43
|
+
for(const d of this.historyPing.filter(data => data.use === true)) this.historyPing.shift(d)
|
44
|
+
for(const d of this.historySend.filter(data => data.use === true)) this.historySend.shift(d)
|
45
|
+
|
46
|
+
}, 500)
|
47
|
+
}
|
48
|
+
|
49
|
+
_ready(){
|
50
|
+
this.emit("ready")
|
51
|
+
}
|
52
|
+
|
53
|
+
async _close(a1, a2, a3){
|
54
|
+
await this.disablePing()
|
55
|
+
this.emit('disconnect', a1, a2)
|
56
|
+
this.ready = false
|
57
|
+
if(this.reconnectStatus === true) this.reconnect()
|
58
|
+
}
|
59
|
+
|
60
|
+
_error(a1, a2, a3){
|
61
|
+
//this.emit('error', a1, a2)
|
62
|
+
}
|
63
|
+
|
64
|
+
_eventCreateMessage(a1){
|
65
|
+
this.emit('createMessage', a1)
|
66
|
+
}
|
67
|
+
|
68
|
+
_eventReConnect(){
|
69
|
+
this.emit('reConnect')
|
70
|
+
}
|
71
|
+
|
72
|
+
_ping(message){
|
73
|
+
this.emit('ping', message)
|
74
|
+
}
|
75
|
+
|
76
|
+
|
77
|
+
async createMessage(msg){
|
78
|
+
|
79
|
+
let data; try { data = JSON.parse(JSON.stringify(msg)) } catch(e) {this._messages.unshift({json: null, text: msg}); return new Message(msg) };
|
80
|
+
try {
|
81
|
+
await this.project.send(JSON.stringify(msg))
|
82
|
+
this._messages.unshift({json: JSON.parse(JSON.stringify(msg)), text: msg})
|
83
|
+
|
84
|
+
this.emit(this.eventSendMessage, new Message(JSON.stringify(msg)))
|
85
|
+
|
86
|
+
return new Message(JSON.stringify(msg))
|
87
|
+
} catch(e) {
|
88
|
+
return e.message
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
_message(msg){
|
93
|
+
try { this._messages.unshift({json: JSON.parse(msg), text: msg})} catch { this._messages.unshift({json: null, text: msg}) };
|
94
|
+
this.emit('message', new Message(msg))
|
95
|
+
}
|
96
|
+
|
97
|
+
async disconnect(){
|
98
|
+
await this.project.close()
|
99
|
+
return {url: this.url, headers: this.headers, options: this.options}
|
100
|
+
}
|
101
|
+
|
102
|
+
systemAutoSend(id){
|
103
|
+
this.historySend.unshift({id: id, use: false, send: null})
|
104
|
+
let d = this.historySend.find(a => a.id === id)
|
105
|
+
setInterval(async ()=>{
|
106
|
+
if(d.use === true) return;
|
107
|
+
this.systemAutoSend(this.historySend.length + 1);
|
108
|
+
d.use = true
|
109
|
+
if(this.autosendStatus === false) return d.send = false;
|
110
|
+
this.event('autoSend', this.autoSend.msg)
|
111
|
+
this.createMessage(this.autoSend.msg)
|
112
|
+
d.send = true
|
113
|
+
}, this.autoSend.time * 1000)
|
114
|
+
return {status: this.autosendStatus, options: this.autoSend, dataConnect: d}
|
115
|
+
}
|
116
|
+
|
117
|
+
systemPing(id){
|
118
|
+
this.historyPing.unshift({id: id, use: false, send: null})
|
119
|
+
let d = this.historyPing.find(a => a.id === id)
|
120
|
+
setInterval(async ()=>{
|
121
|
+
if(d.use === true) return;
|
122
|
+
this.systemPing(this.historyPing.length + 1);
|
123
|
+
d.use = true
|
124
|
+
if(this.pingStatus === false) return d.send = false;
|
125
|
+
this.event('ping', this.pingOptions.msg)
|
126
|
+
this.createMessage(this.pingOptions.msg)
|
127
|
+
d.send = true
|
128
|
+
}, this.pingOptions.time * 1000)
|
129
|
+
return {status: this.pingStatus, options: this.pingOptions, dataConnect: d}
|
130
|
+
}
|
131
|
+
|
132
|
+
|
133
|
+
enableAutoSend(options){
|
134
|
+
if(options) this.autoSend = options
|
135
|
+
this.autosendStatus = true
|
136
|
+
this.systemAutoSend(this.historySend.length + 1)
|
137
|
+
return {status: this.autosendStatus, options: this.autoSend}
|
138
|
+
}
|
139
|
+
|
140
|
+
disableAutoSend(){
|
141
|
+
this.autosendStatus = false
|
142
|
+
return {status: this.autosendStatus, options: this.autoSend}
|
143
|
+
}
|
144
|
+
enablePing(options){
|
145
|
+
if(options) this.pingOptions = options
|
146
|
+
this.pingStatus = true
|
147
|
+
this.systemPing(this.historyPing.length + 1)
|
148
|
+
return {status: this.pingStatus, options: this.pingOptions}
|
149
|
+
}
|
150
|
+
|
151
|
+
disablePing(){
|
152
|
+
this.pingStatus = false
|
153
|
+
return {status: this.pingStatus, options: this.pingOptions}
|
154
|
+
}
|
155
|
+
|
156
|
+
async reconnect(time){
|
157
|
+
return await new Promise(re => {
|
158
|
+
if(!time){
|
159
|
+
if(this.options && this.options.reconnectTime) {time = this.options.reconnectTime}else{time = 2}
|
160
|
+
}
|
161
|
+
|
162
|
+
setTimeout(()=>{
|
163
|
+
this.event('reconnect')
|
164
|
+
this._connect(this.url, this.headers, this.options)
|
165
|
+
re({url: this.url, headers: this.headers, options: this.options})
|
166
|
+
}, time * 1000)
|
167
|
+
})
|
168
|
+
}
|
169
|
+
|
170
|
+
event(d1, d2, d3){
|
171
|
+
if(d1 === "open") this._ready()
|
172
|
+
if(d1 === "close") this._close(d2, d3)
|
173
|
+
if(d1 === "error") this._error(d2, d3)
|
174
|
+
if(d1 === "message") this._message(d2)
|
175
|
+
if(d1 === "createmessage") this._eventCreateMessage(d2)
|
176
|
+
if(d1 === "reconnect") this._eventReConnect()
|
177
|
+
if(d1 === "ping") this._ping(d1)
|
178
|
+
|
179
|
+
return {dataOne: d1, dataTwo: d2, dataThree: d3}
|
180
|
+
|
181
|
+
}
|
182
|
+
|
183
|
+
_connect(url, headers, options){
|
184
|
+
this.project = new ws( url , options.protocol || options._protocol , { headers:this.headers })
|
185
|
+
this.ready=true
|
186
|
+
this.project.on('open', async (open) => {this.event('open')});
|
187
|
+
this.project.on('message', async (msg) => { this.event('message', msg) })
|
188
|
+
this.project.on('close', async (d1, d2) => {this.event('close', d1, d2)});
|
189
|
+
this.project.on('error', async (d1, d2) => {this.event('error', d1, d2);});
|
190
|
+
return {url: url, headers: headers, options: options}
|
191
|
+
}
|
192
|
+
|
193
|
+
|
194
|
+
}
|
195
|
+
module.exports = index
|