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 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