holepunch-hop 0.2.6 → 0.2.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "holepunch-hop",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "data interface to HOP",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -38,7 +38,8 @@
38
38
  "hyperswarm": "^4.3.5",
39
39
  "localdrive": "github:holepunchto/localdrive",
40
40
  "luxon": "^3.4.4",
41
- "chrono-node": "^2.7.5"
41
+ "chrono-node": "^2.7.5",
42
+ "sqlite3": "^5.1.7"
42
43
  },
43
44
  "devDependencies": {
44
45
  "assert": "^2.0.0",
@@ -0,0 +1,163 @@
1
+ 'use strict'
2
+ /**
3
+ * Adapter utility for sqlite database
4
+ *
5
+ *
6
+ * @class SqliteAdapter
7
+ * @package holepunch-hop
8
+ * @copyright Copyright (c) 2024 James Littlejohn
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-3.0.html
10
+ * @version $Id$
11
+ */
12
+ import EventEmitter from 'events'
13
+ import sqlite3 from 'sqlite3'
14
+
15
+ class SqliteAdapter extends EventEmitter {
16
+
17
+ constructor(options) {
18
+ super()
19
+ this.dataBase = {}
20
+ }
21
+
22
+ /**
23
+ * setup new sqlite Database
24
+ * @method newDatabase
25
+ *
26
+ */
27
+ newDatabase = async function (db) {
28
+ let newSqlite = {}
29
+ this.createDbConnection(db)
30
+ // ask for tables
31
+ let tables = await this.discoverTables()
32
+ // let header = await this.discoverColumns()
33
+ newSqlite.tables = tables
34
+ // newSqlite.headers = header
35
+ return newSqlite
36
+ }
37
+
38
+ /**
39
+ * discover colum names in a table
40
+ * @method tableQuery
41
+ *
42
+ */
43
+ tableQuery = async function (data) {
44
+ let newSqlite = {}
45
+ this.createDbConnection(data.file)
46
+ // ask for tables
47
+ let headers = await this.discoverColumns(data.table)
48
+ newSqlite.headers = headers
49
+ return newSqlite
50
+ }
51
+
52
+ /**
53
+ * setup sqlite db and get tables and columns
54
+ * @method createDbConnection
55
+ *
56
+ */
57
+ createDbConnection = function (db) {
58
+ this.dataBase = new sqlite3.Database(db, (error) => {
59
+ if (error) {
60
+ return console.error(error.message)
61
+ }
62
+ })
63
+ console.log("Connection with SQLite has been established")
64
+ }
65
+
66
+
67
+ /**
68
+ * setup sqlite db and get tables and columns
69
+ * @method discoverTables
70
+ *
71
+ */
72
+ discoverTables = async function () {
73
+ // tables available
74
+ let tables = []
75
+ const res = await new Promise((resolve, reject) => {
76
+ let sqlTable = `SELECT name FROM sqlite_master WHERE type='table'`
77
+
78
+ this.dataBase.all(sqlTable, [], (err, rows) => {
79
+ if (err) {
80
+ reject(err)
81
+ }
82
+ rows.forEach((row) => {
83
+ tables.push(row)
84
+ })
85
+ resolve(tables)
86
+ })
87
+ })
88
+ return res
89
+ }
90
+
91
+ /**
92
+ * setup sqlite db and get tables and columns
93
+ * @method discoverColumns
94
+ *
95
+ */
96
+ discoverColumns = async function (table) {
97
+ // columns in table
98
+ let header = []
99
+ const res = await new Promise((resolve, reject) => {
100
+ let sqlTableCols = `PRAGMA table_info('` + table + `')`
101
+ this.dataBase.all(sqlTableCols, [], (err, rows) => {
102
+ if (err) {
103
+ reject(err)
104
+ }
105
+ rows.forEach((row) => {
106
+ header.push(row)
107
+ })
108
+ resolve(header)
109
+ })
110
+ })
111
+ return res
112
+ }
113
+
114
+ /**
115
+ * query a table for data
116
+ * @method queryTable
117
+ *
118
+ */
119
+ queryTable = async function (table) {
120
+ // columns in table
121
+ let data = []
122
+ const res = await new Promise((resolve, reject) => {
123
+ let sqlQuery = `SELECT * FROM MI_BAND_ACTIVITY_SAMPLE WHERE DEVICE_ID = 3 ORDER BY TIMESTAMP DESC LIMIT 1400` // AND TIMESTAMP BETWEEN 1627677840 AND 1627678380`
124
+
125
+ this.dataBase.all(sqlQuery, [], (err, rows) => {
126
+ if (err) {
127
+ reject(err)
128
+ }
129
+ rows.forEach((row) => {
130
+ data.push(row)
131
+ })
132
+ resolve(data)
133
+ })
134
+ })
135
+ return res
136
+ }
137
+
138
+ /**
139
+ * query device table
140
+ * @method deviceQuery
141
+ *
142
+ */
143
+ deviceQuery = async function (table) {
144
+ let data = []
145
+ const res = await new Promise((resolve, reject) => {
146
+ let sqlQuery = `SELECT * FROM ` + table
147
+
148
+ this.dataBase.all(sqlQuery, [], (err, rows) => {
149
+ if (err) {
150
+ reject(err)
151
+ }
152
+ rows.forEach((row) => {
153
+ data.push(row)
154
+ })
155
+ resolve(data)
156
+ })
157
+ })
158
+ return res
159
+ }
160
+
161
+ }
162
+
163
+ export default SqliteAdapter
@@ -0,0 +1,43 @@
1
+ 'use strict'
2
+ /**
3
+ * standard time inputs
4
+ *
5
+ *
6
+ * @class TimeConvertor
7
+ * @package holepunch-hop
8
+ * @copyright Copyright (c) 2024 James Littlejohn
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-3.0.html
10
+ * @version $Id$
11
+ */
12
+ import EventEmitter from 'events'
13
+ import { DateTime, Interval } from 'luxon'
14
+ import * as chrono from 'chrono-node'
15
+
16
+ class TimeConvertor extends EventEmitter {
17
+
18
+ constructor(options) {
19
+ super()
20
+ }
21
+
22
+ /**
23
+ * try to match to known time formats
24
+ * @method testDataExtact
25
+ *
26
+ */
27
+ testDataExtact = function (sampleDate) {
28
+ let parseDate0 = DateTime.fromISO(sampleDate)
29
+ let parseDate1 = DateTime.fromHTTP(sampleDate)
30
+ let parseDate2 = DateTime.fromJSDate(sampleDate)
31
+ /* let parseDate3 = DateTime.fromFormat(sampleDate, "dd-MM-yyyy HH:MM")
32
+ console.log(parseDate3)
33
+ let parseDate4 = DateTime.local(sampleDate)
34
+ console.log(parseDate4)
35
+ // .fromJSDate(sampleDate) // .fromHTTP(sampleDate) // fromFormat(sampleDate, "YYY-MM-DD ") //.fromISO(sampleDate) // or DateTime. fromFormat("23-06-2019", "dd-MM-yyyy") .(splitRow[0])// new Date(splitRow[0])
36
+ // console.log(parseDate) */
37
+ let millDate = parseDate2.toMillis()
38
+ return millDate
39
+ }
40
+
41
+ }
42
+
43
+ export default TimeConvertor
package/src/bees.js CHANGED
@@ -113,6 +113,7 @@ class HyperBee extends EventEmitter {
113
113
  *
114
114
  */
115
115
  savePubliclibrary = async function (refContract) {
116
+ console.log(refContract)
116
117
  let beeSave = await this.dbPublicLibrary.put(refContract.data.hash, refContract.data.contract)
117
118
  // go query the key are return the info. to ensure data save asplanned.
118
119
  let saveCheck = await this.getPublicLibrary(refContract.data.hash)
@@ -131,8 +132,8 @@ class HyperBee extends EventEmitter {
131
132
  *
132
133
  */
133
134
  savePeerLibrary = async function (refContract) {
134
- await this.dbPeerLibrary.put(refContract.hash, refContract.contract)
135
- let saveCheck = await this.getPeerLibrary(refContract.hash)
135
+ await this.dbPeerLibrary.put(refContract.data.hash, refContract.data.contract)
136
+ let saveCheck = await this.getPeerLibrary(refContract.data.hash)
136
137
  let returnMessage = {}
137
138
  returnMessage.stored = true
138
139
  returnMessage.type = refContract.reftype
@@ -398,6 +399,21 @@ class HyperBee extends EventEmitter {
398
399
 
399
400
  }
400
401
 
402
+
403
+
404
+ /**
405
+ * delete nxp ref contract public
406
+ * @method deleteRefcontPubliclibrary
407
+ *
408
+ */
409
+ deleteRefcontPubliclibrary = async function (nxpID) {
410
+ let deleteInfo = {}
411
+ let deleteStatus = await this.dbPublicLibrary.del(nxpID)
412
+ deleteInfo.success = deleteStatus
413
+ deleteInfo.nxp = nxpID
414
+ return deleteInfo
415
+ }
416
+
401
417
  /**
402
418
  * delete nxp ref contract from peer library
403
419
  * @method deleteRefcontPeerlibrary
package/src/drive.js CHANGED
@@ -13,7 +13,10 @@ import fs from 'fs'
13
13
  import Hyperdrive from 'hyperdrive'
14
14
  import b4a from 'b4a'
15
15
  import Fileparser from './fileParser.js'
16
+ import SqliteAdapter from './adapters/sqliteDatabase.js'
16
17
  import csv from 'csv-parser'
18
+ import { DateTime, Interval } from 'luxon'
19
+ import * as chrono from 'chrono-node'
17
20
 
18
21
  class HypDrive extends EventEmitter {
19
22
 
@@ -24,6 +27,8 @@ class HypDrive extends EventEmitter {
24
27
  this.swarm = swarm
25
28
  this.drive = {}
26
29
  this.fileUtility = new Fileparser('')
30
+ this.AdapterSqlite = new SqliteAdapter()
31
+ this.dataBase = {}
27
32
  // this.setupHyperdrive()
28
33
  }
29
34
 
@@ -83,7 +88,6 @@ class HypDrive extends EventEmitter {
83
88
  */
84
89
  listFilesFolder = function (folder) {
85
90
  const stream = this.drive.list('') // [options])
86
- // console.log(stream)
87
91
  // Handle stream events --> data, end, and error
88
92
  let dataDrive = []
89
93
  stream.on('data', function(chunk) {
@@ -150,6 +154,37 @@ class HypDrive extends EventEmitter {
150
154
  }
151
155
 
152
156
 
157
+ /**
158
+ * save csv data to hyperdrive file
159
+ * @method saveSqliteFirst
160
+ *
161
+ */
162
+ saveSqliteFirst = async function (path, name, data) {
163
+ let fileResponse = {}
164
+ // file input management
165
+ // protocol to save original file
166
+ let newPathFile = await this.hyperdriveFilesave(path, name, data)
167
+ // extract table and then table columns
168
+ // extract out the headers name for columns
169
+ const parseData = await this.SQLiteSetup(name)
170
+ fileResponse.filename = name
171
+ fileResponse.header = parseData.headers
172
+ fileResponse.tables = parseData.tables
173
+ return fileResponse
174
+ }
175
+
176
+
177
+ /**
178
+ * blind sqlite lookup of data (maybe restricture no. of rows of data iniitally)
179
+ * @method blindDataSqlite
180
+ *
181
+ */
182
+ blindDataSqlite = async function (dataInfo) {
183
+ let parseData = await this.SQLiteQuery(dataInfo)
184
+ return parseData
185
+ }
186
+
187
+
153
188
  /**
154
189
  * save to hyperdrive file
155
190
  * @method hyperdriveFilesave
@@ -184,8 +219,6 @@ class HypDrive extends EventEmitter {
184
219
  }
185
220
  }))
186
221
  }
187
-
188
-
189
222
  return hyperdrivePath
190
223
  }
191
224
 
@@ -206,20 +239,108 @@ class HypDrive extends EventEmitter {
206
239
  * rebuidl file and give directory location
207
240
  * @method hyperdriveLocalfile
208
241
  *
209
- */
242
+ */
210
243
  hyperdriveLocalfile = async function (path) {
211
244
  // File reads to buffer and recreate file
212
245
  // const bufFromGet2 = await this.drive.get(path)
213
246
  const { value: entry } = await this.drive.entry(path)
214
247
  const blobs = await this.drive.getBlobs()
215
248
  const bufFromEntry = await blobs.get(entry.blob)
216
-
217
249
  let localFile = 'localdb'
218
- // fs.writeFileSync(localFile, bufFromGet2)
219
250
  fs.writeFileSync(localFile, bufFromEntry)
220
251
  return localFile
221
252
  }
222
253
 
254
+ /**
255
+ * set file path, read and make sqlite3 connect db
256
+ * @method SQLiteSetup
257
+ *
258
+ */
259
+ SQLiteSetup = async function (file) {
260
+ // const stream = this.liveDataAPI.DriveFiles.listFilesFolder('sqlite/')
261
+ let dbFile = await this.hyperdriveLocalfile('sqlite/' + file)
262
+ let summarySQLinfo = await this.AdapterSqlite.newDatabase(dbFile)
263
+ return summarySQLinfo
264
+ }
265
+
266
+ /**
267
+ * set file path, read and make sqlite3 connect db
268
+ * @method SQLiteSourceSetup
269
+ *
270
+ */
271
+ SQLiteSourceSetup = async function (data) {
272
+ // const stream = this.liveDataAPI.DriveFiles.listFilesFolder('sqlite/')
273
+ let dbFile = await this.hyperdriveLocalfile('sqlite/' + data.db)
274
+ data.file = dbFile
275
+ let summarySQLinfo = await this.AdapterSqlite.tableQuery(data)
276
+ return summarySQLinfo
277
+ }
278
+
279
+
280
+ /**
281
+ * ask for device tables and info.
282
+ * @method SQLiteDeviceSetup
283
+ *
284
+ */
285
+ SQLiteDeviceSetup = async function (data) {
286
+ // const stream = this.liveDataAPI.DriveFiles.listFilesFolder('sqlite/')
287
+ let dbFile = await this.hyperdriveLocalfile('sqlite/' + data.db)
288
+ data.file = dbFile
289
+ let summaryTable = await this.AdapterSqlite.tableQuery(data)
290
+ let summaryDevice = await this.AdapterSqlite.deviceQuery(data.table)
291
+ let summarySQLinfo = {}
292
+ summarySQLinfo.tables = summaryTable
293
+ summarySQLinfo.devices = summaryDevice
294
+ return summarySQLinfo
295
+ }
296
+
297
+ /**
298
+ * set file path, read and make sqlite3 connect db
299
+ * @method SQLiteQuery
300
+ *
301
+ */
302
+ SQLiteQuery = async function (dataInfo) {
303
+ let timestampCol = ''
304
+ // is the sqliite database sill accive?
305
+ // const stream = this.liveDataAPI.DriveFiles.listFilesFolder('sqlite/')
306
+ let dbFile = await this.hyperdriveLocalfile('sqlite/' + dataInfo.file.file)
307
+ let queryData = await this.AdapterSqlite.queryTable(dataInfo)
308
+ let contextKeys = Object.keys(queryData[0])
309
+ timestampCol = contextKeys[dataInfo.context.timestamp]
310
+ // now prepare into data and labels
311
+ let blindData = {}
312
+ let extractCol = []
313
+ let extractLabel = []
314
+ for (let rowi of queryData) {
315
+ extractCol.push(rowi[dataInfo.context.name.name])
316
+ // assume data column for now and parse to mills seconds
317
+ let testCH1 = chrono.parseDate(rowi[timestampCol])
318
+ let parseDate = testCH1 * 1000 // this.testDataExtact(testCH1)
319
+ extractLabel.push(parseDate)
320
+ }
321
+ blindData.data = extractCol
322
+ blindData.label = extractLabel
323
+ return blindData
324
+ }
325
+
326
+
327
+ /**
328
+ * try to match to known time formats
329
+ * @method testDataExtact
330
+ *
331
+ */
332
+ testDataExtact = function (sampleDate) {
333
+ let parseDate0 = DateTime.fromISO(sampleDate)
334
+ let parseDate1 = DateTime.fromHTTP(sampleDate)
335
+ let parseDate2 = DateTime.fromJSDate(sampleDate)
336
+ /* let parseDate3 = DateTime.fromFormat(sampleDate, "dd-MM-yyyy HH:MM")
337
+ let parseDate4 = DateTime.local(sampleDate)
338
+ // .fromJSDate(sampleDate) // .fromHTTP(sampleDate) // fromFormat(sampleDate, "YYY-MM-DD ") //.fromISO(sampleDate) // or DateTime. fromFormat("23-06-2019", "dd-MM-yyyy") .(splitRow[0])// new Date(splitRow[0])
339
+ */
340
+ let millDate = parseDate2.toMillis()
341
+ return millDate
342
+ }
343
+
223
344
  /**
224
345
  * taken in csv file and read per line
225
346
  * @method readCSVfile
package/src/fileParser.js CHANGED
@@ -11,7 +11,6 @@ import atob from 'atob'
11
11
  * @license http://www.gnu.org/licenses/old-licenses/gpl-3.0.html
12
12
  * @version $Id$
13
13
  */
14
-
15
14
  import fs from 'fs'
16
15
  import os from 'os'
17
16
  import util from 'util'
@@ -19,12 +18,14 @@ import events from 'events'
19
18
  import axios from 'axios'
20
19
  import csv from 'csv-parser'
21
20
  import crypto from 'crypto'
21
+ import TimeConvert from './adapters/timeConvertor.js'
22
22
  import { DateTime, Interval } from 'luxon'
23
23
  import * as chrono from 'chrono-node'
24
24
 
25
25
  var FileParser = function (path) {
26
26
  events.EventEmitter.call(this)
27
27
  this.storepath = path
28
+ this.convertTime = new TimeConvert()
28
29
  }
29
30
 
30
31
  /**
@@ -162,7 +163,7 @@ FileParser.prototype.TEMPwebCSVparse = function (fData) {
162
163
  extractCol.push(splitRow[fData.context.id])
163
164
  // assume data column for now and parse to mills seconds
164
165
  let testCH1 = chrono.parseDate(splitRow[fData.context.timestamp])
165
- let parseDate = this.testDataExtact(testCH1)
166
+ let parseDate = this.convertTime.testDataExtact(testCH1)
166
167
  // let parseDate = DateTime.fromISO(splitRow[0])
167
168
  // let millDate = parseDate.toMillis()
168
169
  extractLabel.push(parseDate)
@@ -173,30 +174,9 @@ FileParser.prototype.TEMPwebCSVparse = function (fData) {
173
174
  let extractedPair = {}
174
175
  extractedPair.label = extractLabel
175
176
  extractedPair.data = extractCol
176
- console.log('finsiehd')
177
- console.log(extractedPair)
178
177
  return extractedPair
179
178
  }
180
179
 
181
- /**
182
- * try to match to known time formats
183
- * @method testDataExtact
184
- *
185
- */
186
- FileParser.prototype.testDataExtact = function (sampleDate) {
187
- let parseDate0 = DateTime.fromISO(sampleDate)
188
- let parseDate1 = DateTime.fromHTTP(sampleDate)
189
- let parseDate2 = DateTime.fromJSDate(sampleDate)
190
- /* let parseDate3 = DateTime.fromFormat(sampleDate, "dd-MM-yyyy HH:MM")
191
- console.log(parseDate3)
192
- let parseDate4 = DateTime.local(sampleDate)
193
- console.log(parseDate4)
194
- // .fromJSDate(sampleDate) // .fromHTTP(sampleDate) // fromFormat(sampleDate, "YYY-MM-DD ") //.fromISO(sampleDate) // or DateTime. fromFormat("23-06-2019", "dd-MM-yyyy") .(splitRow[0])// new Date(splitRow[0])
195
- // console.log(parseDate) */
196
- let millDate = parseDate2.toMillis()
197
- return millDate
198
- }
199
-
200
180
  /**
201
181
  * read csv headers and extract info
202
182
  * @method extractCSVHeaderInfo