rqlite-js 2.5.7 → 2.6.0

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.
Files changed (78) hide show
  1. package/README.md +174 -155
  2. package/lib/api/backup/index.js +46 -46
  3. package/lib/api/backup/index.js.map +1 -1
  4. package/lib/api/backup/test.unit.js +45 -0
  5. package/lib/api/backup/test.unit.js.map +1 -0
  6. package/lib/api/backup-formats.js +16 -0
  7. package/lib/api/backup-formats.js.map +1 -0
  8. package/lib/api/client/index.js +63 -42
  9. package/lib/api/client/index.js.map +1 -1
  10. package/lib/api/client/test.unit.js +53 -0
  11. package/lib/api/client/test.unit.js.map +1 -0
  12. package/lib/api/consistency-levels.js +30 -0
  13. package/lib/api/consistency-levels.js.map +1 -0
  14. package/lib/api/data/index.js +50 -72
  15. package/lib/api/data/index.js.map +1 -1
  16. package/lib/api/data/test.unit.js +98 -0
  17. package/lib/api/data/test.unit.js.map +1 -0
  18. package/lib/api/paths.js +33 -0
  19. package/lib/api/paths.js.map +1 -0
  20. package/lib/api/query-params.js +43 -0
  21. package/lib/api/query-params.js.map +1 -0
  22. package/lib/api/results/data-result-error.js +39 -10
  23. package/lib/api/results/data-result-error.js.map +1 -1
  24. package/lib/api/results/data-result.js +57 -51
  25. package/lib/api/results/data-result.js.map +1 -1
  26. package/lib/api/results/data-results.js +50 -30
  27. package/lib/api/results/data-results.js.map +1 -1
  28. package/lib/api/results/index.js +1 -1
  29. package/lib/api/results/result-fields.js +47 -0
  30. package/lib/api/results/result-fields.js.map +1 -0
  31. package/lib/api/results/test.unit.js +238 -0
  32. package/lib/api/results/test.unit.js.map +1 -0
  33. package/lib/api/status/index.js +40 -28
  34. package/lib/api/status/index.js.map +1 -1
  35. package/lib/api/status/test.unit.js +57 -0
  36. package/lib/api/status/test.unit.js.map +1 -0
  37. package/lib/http-request/auth-keys.js +15 -0
  38. package/lib/http-request/auth-keys.js.map +1 -0
  39. package/lib/http-request/http-headers.js +20 -0
  40. package/lib/http-request/http-headers.js.map +1 -0
  41. package/lib/http-request/index.js +291 -271
  42. package/lib/http-request/index.js.map +1 -1
  43. package/lib/http-request/test.unit.js +560 -0
  44. package/lib/http-request/test.unit.js.map +1 -0
  45. package/lib/index.js +23 -4
  46. package/lib/index.js.map +1 -1
  47. package/lib/test/api-data-execute-nock.js +142 -0
  48. package/lib/test/api-data-execute-nock.js.map +1 -0
  49. package/lib/test/api-data-query-nock.js +210 -0
  50. package/lib/test/api-data-query-nock.js.map +1 -0
  51. package/lib/test/backups/backup-nock.js +29 -0
  52. package/lib/test/backups/backup-nock.js.map +1 -0
  53. package/lib/test/backups/restore-nock.js +30 -0
  54. package/lib/test/backups/restore-nock.js.map +1 -0
  55. package/lib/test/env.js +15 -0
  56. package/lib/test/env.js.map +1 -0
  57. package/lib/test/unit/index.unit.js +27 -0
  58. package/lib/test/unit/index.unit.js.map +1 -0
  59. package/lib/test.integration.js +238 -0
  60. package/lib/test.integration.js.map +1 -0
  61. package/package.json +33 -23
  62. package/.eslintrc +0 -20
  63. package/.travis.yml +0 -24
  64. package/es6/api/backup/index.js +0 -71
  65. package/es6/api/client/index.js +0 -83
  66. package/es6/api/data/index.js +0 -129
  67. package/es6/api/results/data-result-error.js +0 -32
  68. package/es6/api/results/data-result.js +0 -134
  69. package/es6/api/results/data-results.js +0 -121
  70. package/es6/api/results/index.js +0 -7
  71. package/es6/api/status/index.js +0 -54
  72. package/es6/http-request/content-types.js +0 -4
  73. package/es6/http-request/errors.js +0 -16
  74. package/es6/http-request/http-methods.js +0 -39
  75. package/es6/http-request/index.js +0 -743
  76. package/es6/http-request/retryable.js +0 -41
  77. package/es6/index.js +0 -19
  78. package/jsconfig.json +0 -19
@@ -0,0 +1,30 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports, "__esModule", { value: true });exports.RESTORE_SUCCESS_RESPONSE = void 0;exports.restoreSuccess = restoreSuccess;var _nock = _interopRequireDefault(require("nock"));
2
+ var _contentTypes = require("../../http-request/content-types");
3
+ var _httpHeaders = require("../../http-request/http-headers");
4
+
5
+ const RESTORE_SUCCESS_RESPONSE = exports.RESTORE_SUCCESS_RESPONSE = {
6
+ results: [
7
+ {
8
+ last_insert_id: 2,
9
+ rows_affected: 1
10
+ }]
11
+
12
+ };
13
+
14
+ /**
15
+ * Creates a nock that represents a successful call to data query endpoint.
16
+ */
17
+ function restoreSuccess(options) {
18
+ const {
19
+ url, path, auth, response = RESTORE_SUCCESS_RESPONSE, body
20
+ } = options;
21
+ const scope = (0, _nock.default)(url).
22
+ matchHeader(_httpHeaders.HTTP_HEADER_ACCEPT, _contentTypes.CONTENT_TYPE_APPLICATION_JSON).
23
+ matchHeader(_httpHeaders.HTTP_HEADER_CONTENT_TYPE, _contentTypes.CONTENT_TYPE_TEXT_PLAIN).
24
+ post(path, body);
25
+ if (auth) {
26
+ scope.basicAuth(auth);
27
+ }
28
+ return scope.reply(200, response);
29
+ }
30
+ //# sourceMappingURL=restore-nock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-nock.js","names":["_nock","_interopRequireDefault","require","_contentTypes","_httpHeaders","RESTORE_SUCCESS_RESPONSE","exports","results","last_insert_id","rows_affected","restoreSuccess","options","url","path","auth","response","body","scope","nock","matchHeader","HTTP_HEADER_ACCEPT","CONTENT_TYPE_APPLICATION_JSON","HTTP_HEADER_CONTENT_TYPE","CONTENT_TYPE_TEXT_PLAIN","post","basicAuth","reply"],"sources":["../../../es6/test/backups/restore-nock.js"],"sourcesContent":["import nock from 'nock'\nimport { CONTENT_TYPE_APPLICATION_JSON, CONTENT_TYPE_TEXT_PLAIN } from '../../http-request/content-types'\nimport { HTTP_HEADER_ACCEPT, HTTP_HEADER_CONTENT_TYPE } from '../../http-request/http-headers'\n\nexport const RESTORE_SUCCESS_RESPONSE = {\n results: [\n {\n last_insert_id: 2,\n rows_affected: 1,\n },\n ],\n}\n\n/**\n * Creates a nock that represents a successful call to data query endpoint.\n */\nexport function restoreSuccess (options) {\n const {\n url, path, auth, response = RESTORE_SUCCESS_RESPONSE, body,\n } = options\n const scope = nock(url)\n .matchHeader(HTTP_HEADER_ACCEPT, CONTENT_TYPE_APPLICATION_JSON)\n .matchHeader(HTTP_HEADER_CONTENT_TYPE, CONTENT_TYPE_TEXT_PLAIN)\n .post(path, body)\n if (auth) {\n scope.basicAuth(auth)\n }\n return scope.reply(200, response)\n}\n"],"mappings":"kPAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;;AAEO,MAAMG,wBAAwB,GAAAC,OAAA,CAAAD,wBAAA,GAAG;EACtCE,OAAO,EAAE;EACP;IACEC,cAAc,EAAE,CAAC;IACjBC,aAAa,EAAE;EACjB,CAAC;;AAEL,CAAC;;AAED;AACA;AACA;AACO,SAASC,cAAcA,CAAEC,OAAO,EAAE;EACvC,MAAM;IACJC,GAAG,EAAEC,IAAI,EAAEC,IAAI,EAAEC,QAAQ,GAAGV,wBAAwB,EAAEW;EACxD,CAAC,GAAGL,OAAO;EACX,MAAMM,KAAK,GAAG,IAAAC,aAAI,EAACN,GAAG,CAAC;EACpBO,WAAW,CAACC,+BAAkB,EAAEC,2CAA6B,CAAC;EAC9DF,WAAW,CAACG,qCAAwB,EAAEC,qCAAuB,CAAC;EAC9DC,IAAI,CAACX,IAAI,EAAEG,IAAI,CAAC;EACnB,IAAIF,IAAI,EAAE;IACRG,KAAK,CAACQ,SAAS,CAACX,IAAI,CAAC;EACvB;EACA,OAAOG,KAAK,CAACS,KAAK,CAAC,GAAG,EAAEX,QAAQ,CAAC;AACnC","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.ENV_RQLITE_HOSTS = exports.DEFAULT_RQLITE_HOST = void 0; /**
2
+ * Integration test environment constants
3
+ * @module test/env
4
+ */
5
+
6
+ /**
7
+ * Environment variable name for RQLite host list
8
+ */
9
+ const ENV_RQLITE_HOSTS = exports.ENV_RQLITE_HOSTS = 'RQLITE_HOSTS';
10
+
11
+ /**
12
+ * Default RQLite host when ENV_RQLITE_HOSTS is unset
13
+ */
14
+ const DEFAULT_RQLITE_HOST = exports.DEFAULT_RQLITE_HOST = 'http://localhost:4001';
15
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","names":["ENV_RQLITE_HOSTS","exports","DEFAULT_RQLITE_HOST"],"sources":["../../es6/test/env.js"],"sourcesContent":["/**\n * Integration test environment constants\n * @module test/env\n */\n\n/**\n * Environment variable name for RQLite host list\n */\nexport const ENV_RQLITE_HOSTS = 'RQLITE_HOSTS'\n\n/**\n * Default RQLite host when ENV_RQLITE_HOSTS is unset\n */\nexport const DEFAULT_RQLITE_HOST = 'http://localhost:4001'\n"],"mappings":"4IAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO,MAAMA,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,cAAc;;AAE9C;AACA;AACA;AACO,MAAME,mBAAmB,GAAAD,OAAA,CAAAC,mBAAA,GAAG,uBAAuB","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
2
+
3
+
4
+
5
+ var _nock = _interopRequireDefault(require("nock"));
6
+ var _chai = _interopRequireDefault(require("chai"));
7
+ var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised")); /**
8
+ * Bootstrap for unit tests
9
+ * @module test/unit
10
+ */ /**
11
+ * Disable external network connections except to localhost before all tests
12
+ */before(() => {
13
+ _chai.default.use(_chaiAsPromised.default);
14
+ _nock.default.disableNetConnect();
15
+ _nock.default.enableNetConnect('127.0.0.1');
16
+ });
17
+
18
+ /**
19
+ * Destory all nocks before each test
20
+ */
21
+ beforeEach(() => _nock.default.cleanAll());
22
+
23
+ /**
24
+ * Enable network connection after all tests
25
+ */
26
+ after(() => _nock.default.enableNetConnect());
27
+ //# sourceMappingURL=index.unit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.unit.js","names":["_nock","_interopRequireDefault","require","_chai","_chaiAsPromised","before","chai","use","chaiAsPromised","nock","disableNetConnect","enableNetConnect","beforeEach","cleanAll","after"],"sources":["../../../es6/test/unit/index.unit.js"],"sourcesContent":["/**\n * Bootstrap for unit tests\n * @module test/unit\n */\nimport nock from 'nock'\nimport chai from 'chai'\nimport chaiAsPromised from 'chai-as-promised'\n\n/**\n * Disable external network connections except to localhost before all tests\n */\nbefore(() => {\n chai.use(chaiAsPromised)\n nock.disableNetConnect()\n nock.enableNetConnect('127.0.0.1')\n})\n\n/**\n * Destory all nocks before each test\n */\nbeforeEach(() => nock.cleanAll())\n\n/**\n * Enable network connection after all tests\n */\nafter(() => nock.enableNetConnect())\n"],"mappings":";;;;AAIA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,eAAA,GAAAH,sBAAA,CAAAC,OAAA,sBAA6C,CAN7C;AACA;AACA;AACA,GAHA,CAQA;AACA;AACA,GACAG,MAAM,CAAC,MAAM;EACXC,aAAI,CAACC,GAAG,CAACC,uBAAc,CAAC;EACxBC,aAAI,CAACC,iBAAiB,CAAC,CAAC;EACxBD,aAAI,CAACE,gBAAgB,CAAC,WAAW,CAAC;AACpC,CAAC,CAAC;;AAEF;AACA;AACA;AACAC,UAAU,CAAC,MAAMH,aAAI,CAACI,QAAQ,CAAC,CAAC,CAAC;;AAEjC;AACA;AACA;AACAC,KAAK,CAAC,MAAML,aAAI,CAACE,gBAAgB,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,238 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");var _chai = require("chai");
2
+ var _http = _interopRequireDefault(require("http"));
3
+ var _https = _interopRequireDefault(require("https"));
4
+ var _retryAsPromised = _interopRequireDefault(require("retry-as-promised"));
5
+ var _data = require("./api/data");
6
+ var _backup = require("./api/backup");
7
+ var _status = require("./api/status");
8
+ var _ = require(".");
9
+ var _env = require("./test/env");
10
+
11
+ /**
12
+ * The RQLite host for integration tests, which can be changed
13
+ * using the RQLITE_HOSTS environment variable or defaults to
14
+ * http://localhost:4001
15
+ * @type {String} The RQLite host address
16
+ */
17
+ const HOST = process.env[_env.ENV_RQLITE_HOSTS] || _env.DEFAULT_RQLITE_HOST;
18
+
19
+ const httpAgent = new _http.default.Agent({ keepAlive: true });
20
+ const httpsAgent = new _https.default.Agent({ keepAlive: true });
21
+
22
+ describe('api status client', () => {
23
+ const statusApiClient = new _.StatusApiClient(HOST, { httpAgent, httpsAgent });
24
+ /**
25
+ * Before beginning test check the status endpoint for a response from
26
+ * RQLite server
27
+ * @param {Number} backoffBase The amount of time to wait
28
+ * @param {Number} max The maximum number of attempts before
29
+ * throw the current error
30
+ */
31
+ async function checkRqliteServerReady(backoffBase = 500, max = 10) {
32
+ return (0, _retryAsPromised.default)(async () => {
33
+ const status = await statusApiClient.statusAllHosts();
34
+ const ready = status.map((v) => v.response?.body?.store?.ready).every((v) => v === true);
35
+ if (!ready) {
36
+ throw new Error('All stores are not ready');
37
+ }
38
+ return status;
39
+ }, {
40
+ backoffBase,
41
+ max
42
+ });
43
+ }
44
+
45
+ before('check RQLite Server ready', () => checkRqliteServerReady());
46
+ describe('should get status response', () => {
47
+ it(`should call ${HOST}${_status.PATH_STATUS} and create table named foo`, async () => {
48
+ const { body } = await statusApiClient.status();
49
+ _chai.assert.isObject(body, 'response body is object');
50
+ _chai.assert.property(body, 'build');
51
+ _chai.assert.property(body, 'http');
52
+ // assert.property(body, 'last_backup')
53
+ _chai.assert.property(body, 'node');
54
+ _chai.assert.property(body, 'runtime');
55
+ _chai.assert.property(body, 'store');
56
+ });
57
+ });
58
+ });
59
+
60
+ describe('api data client', () => {
61
+ const dataApiClient = new _.DataApiClient(HOST, { httpAgent, httpsAgent });
62
+ // eslint-disable-next-line prefer-arrow-callback
63
+ after('clean up data', async function cleanUpApiDataClientTests() {
64
+ await dataApiClient.execute('DROP TABLE IF EXISTS foo');
65
+ });
66
+ describe('create table', () => {
67
+ it(`should call ${HOST}${_data.PATH_EXECUTE} and create table named foo`, async () => {
68
+ const sql = 'CREATE TABLE foo (id integer not null primary key, name text)';
69
+ const dataResults = await dataApiClient.execute(sql);
70
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
71
+ const results = dataResults.getResults();
72
+ _chai.assert.lengthOf(results, 1);
73
+ });
74
+ });
75
+ describe('insert one row', () => {
76
+ it(`should call ${HOST}${_data.PATH_EXECUTE} and insert a record with the name fiona`, async () => {
77
+ const sql = 'INSERT INTO foo(name) VALUES("fiona")';
78
+ const dataResults = await dataApiClient.execute(sql);
79
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
80
+ const dataResult = dataResults.get(0);
81
+ _chai.assert.isDefined(dataResult, 'dataResult');
82
+ _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
83
+ _chai.assert.equal(dataResult.getLastInsertId(), 1, 'last_insert_id');
84
+ });
85
+ it(`should call ${HOST}${_data.PATH_QUERY} and select a record with the name fiona`, async () => {
86
+ const sql = 'SELECT name FROM foo WHERE name="fiona"';
87
+ const dataResults = await dataApiClient.query(sql);
88
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
89
+ const dataResult = dataResults.get(0);
90
+ _chai.assert.isDefined(dataResult, 'dataResult');
91
+ _chai.assert.equal(dataResult.get('name'), 'fiona', 'name');
92
+ });
93
+ });
94
+ describe('update one row', () => {
95
+ it(`should call ${HOST}${_data.PATH_EXECUTE} and update the record with the name fiona to the name justin`, async () => {
96
+ const sql = 'UPDATE foo SET name="justin" WHERE name="fiona"';
97
+ const dataResults = await dataApiClient.execute(sql);
98
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
99
+ const dataResult = dataResults.get(0);
100
+ _chai.assert.isDefined(dataResult, 'dataResult');
101
+ _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
102
+ });
103
+ it(`should call ${HOST}${_data.PATH_QUERY} and select a record with the name justin`, async () => {
104
+ const sql = 'SELECT name FROM foo WHERE name="justin"';
105
+ const dataResults = await dataApiClient.query(sql);
106
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
107
+ const dataResult = dataResults.get(0);
108
+ _chai.assert.isDefined(dataResult, 'dataResult');
109
+ _chai.assert.equal(dataResult.get('name'), 'justin', 'name');
110
+ });
111
+ });
112
+ describe('delete one row', () => {
113
+ it(`should call ${HOST}${_data.PATH_EXECUTE} and delete a record with the name justin`, async () => {
114
+ const sql = 'DELETE FROM foo WHERE name="justin"';
115
+ const dataResults = await dataApiClient.execute(sql);
116
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
117
+ const dataResult = dataResults.get(0);
118
+ _chai.assert.isDefined(dataResult, 'dataResult');
119
+ _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
120
+ });
121
+ it(`should call ${HOST}${_data.PATH_QUERY} and select a count of foo item that has a result of zero`, async () => {
122
+ const sql = 'SELECT COUNT(id) AS idCount FROM foo';
123
+ const dataResults = await dataApiClient.query(sql);
124
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
125
+ const dataResult = dataResults.get(0);
126
+ _chai.assert.isDefined(dataResult, 'dataResult');
127
+ _chai.assert.equal(dataResult.get('idCount'), 0, 'idCount');
128
+ });
129
+ });
130
+ describe('insert multiple rows', () => {
131
+ const total = 100;
132
+ const dataList = Array(total).fill(0);
133
+ it(`should call ${HOST}${_data.PATH_EXECUTE} and insert a record with the name fiona and justin using a transaction`, async () => {
134
+ const sql = dataList.map((_v, i) => `INSERT INTO foo(name) VALUES("justin-${i}")`);
135
+ const dataResults = await dataApiClient.execute(sql, { atomic: true });
136
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
137
+ dataList.forEach((_v, i) => {
138
+ const dataResult = dataResults.get(i);
139
+ _chai.assert.isDefined(dataResult, 'dataResult');
140
+ _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
141
+ _chai.assert.equal(dataResult.getLastInsertId(), i + 1, 'last_insert_id');
142
+ });
143
+ });
144
+ it(`should call ${HOST}${_data.PATH_QUERY} and select a count of foo items that has a result of two`, async () => {
145
+ const sql = 'SELECT COUNT(*) AS total FROM foo WHERE name like("justin-%")';
146
+ const dataResults = await dataApiClient.query(sql);
147
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
148
+ const dataResult = dataResults.get(0);
149
+ _chai.assert.isDefined(dataResult, 'dataResult');
150
+ _chai.assert.equal(dataResult.get('total'), total, 'total');
151
+ });
152
+ it(`should call ${HOST}${_data.PATH_QUERY} and select an array of records with the name fiona then justin`, async () => {
153
+ const sql = dataList.map((_v, i) => `SELECT name FROM foo WHERE name="justin-${i}"`);
154
+ const dataResults = await dataApiClient.query(sql);
155
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
156
+ dataList.forEach((_v, i) => {
157
+ _chai.assert.equal(dataResults.get(i).get('name'), `justin-${i}`, `item ${i} name`);
158
+ });
159
+ });
160
+ });
161
+ describe('drop the table', () => {
162
+ it(`should call ${HOST}${_data.PATH_EXECUTE} and drop the table foo`, async () => {
163
+ const sql = 'DROP TABLE foo';
164
+ const dataResults = await dataApiClient.execute(sql);
165
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
166
+ const dataResult = dataResults.get(0);
167
+ _chai.assert.isDefined(dataResult, 'dataResult');
168
+ _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
169
+ });
170
+ });
171
+ });
172
+
173
+ describe('api backups client', () => {
174
+ const backupApiClient = new _.BackupApiClient(HOST, { httpAgent, httpsAgent });
175
+ const dataApiClient = new _.DataApiClient(HOST, { httpAgent, httpsAgent });
176
+ /**
177
+ * Capture the stream data and resolve a promise with the parsed JSON
178
+ * @returns {Stream} The stream
179
+ */
180
+ function handleRequestStreamAsPromise(request) {
181
+ return new Promise((resolve, reject) => {
182
+ let result = Buffer.alloc(0);
183
+ request.
184
+ on('data', (data) => {
185
+ result = Buffer.concat([result, data]);
186
+ }).
187
+ on('end', () => resolve(result)).
188
+ on('error', reject);
189
+ });
190
+ }
191
+
192
+ // eslint-disable-next-line prefer-arrow-callback
193
+ after('clean up backup data', async function cleanUpApiBackupTests() {
194
+ await dataApiClient.execute('DROP TABLE IF EXISTS fooBackups');
195
+ await dataApiClient.execute('DROP TABLE IF EXISTS fooRestore');
196
+ });
197
+ describe('backup database', () => {
198
+ it(`should call ${HOST}${_backup.PATH_BACKUP} and get a SQL backup string`, async () => {
199
+ const sql = 'CREATE TABLE fooBackups (id integer not null primary key, name text)';
200
+ let dataResults = await dataApiClient.execute(sql);
201
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
202
+ dataResults = await dataApiClient.execute([
203
+ 'INSERT INTO fooBackups(name) VALUES("fiona")',
204
+ 'INSERT INTO fooBackups(name) VALUES("justin")'],
205
+ { atomic: true });
206
+ _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
207
+ const request = await backupApiClient.backup();
208
+ const stream = await handleRequestStreamAsPromise(request);
209
+ _chai.assert.isString(stream.toString());
210
+ });
211
+ });
212
+ describe('restore database', () => {
213
+ it(`should call ${HOST}${_backup.PATH_LOAD} and send a SQLite backup stream`, async () => {
214
+ /**
215
+ * Individual SQL statements to create back up data
216
+ */
217
+ const BACKUP_SQL_STATEMENTS = [
218
+ 'CREATE TABLE fooRestore (id integer not null primary key, name text)',
219
+ 'INSERT INTO fooRestore(name) VALUES ("fiona")',
220
+ 'INSERT INTO fooRestore(name) VALUES ("justin")'];
221
+
222
+ const sql = Buffer.from(BACKUP_SQL_STATEMENTS.join(';'));
223
+ const request = await backupApiClient.load(sql);
224
+ const { results } = JSON.parse(await handleRequestStreamAsPromise(request));
225
+ _chai.assert.nestedPropertyVal(results, '[0].rows_affected', 1, 'results of last SQL statment is 1 row');
226
+ const dataResults = await dataApiClient.query('SELECT id, name FROM fooRestore WHERE name="fiona"', { level: 'strong' });
227
+ const error = dataResults.getFirstError();
228
+ if (error) {
229
+ throw error;
230
+ }
231
+ const dataResult = dataResults.get(0);
232
+ _chai.assert.isDefined(dataResult, 'dataResult');
233
+ _chai.assert.deepEqual(dataResult.get('id'), 1, 'id');
234
+ _chai.assert.deepEqual(dataResult.get('name'), 'fiona', 'name');
235
+ });
236
+ });
237
+ });
238
+ //# sourceMappingURL=test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.integration.js","names":["_chai","require","_http","_interopRequireDefault","_https","_retryAsPromised","_data","_backup","_status","_","_env","HOST","process","env","ENV_RQLITE_HOSTS","DEFAULT_RQLITE_HOST","httpAgent","http","Agent","keepAlive","httpsAgent","https","describe","statusApiClient","StatusApiClient","checkRqliteServerReady","backoffBase","max","retryAsPromise","status","statusAllHosts","ready","map","v","response","body","store","every","Error","before","it","PATH_STATUS","assert","isObject","property","dataApiClient","DataApiClient","after","cleanUpApiDataClientTests","execute","PATH_EXECUTE","sql","dataResults","isUndefined","getFirstError","results","getResults","lengthOf","dataResult","get","isDefined","equal","getRowsAffected","getLastInsertId","PATH_QUERY","query","total","dataList","Array","fill","_v","i","atomic","forEach","backupApiClient","BackupApiClient","handleRequestStreamAsPromise","request","Promise","resolve","reject","result","Buffer","alloc","on","data","concat","cleanUpApiBackupTests","PATH_BACKUP","backup","stream","isString","toString","PATH_LOAD","BACKUP_SQL_STATEMENTS","from","join","load","JSON","parse","nestedPropertyVal","level","error","deepEqual"],"sources":["../es6/test.integration.js"],"sourcesContent":["import { assert } from 'chai'\nimport http from 'http'\nimport https from 'https'\nimport retryAsPromise from 'retry-as-promised'\nimport { PATH_EXECUTE, PATH_QUERY } from './api/data'\nimport { PATH_LOAD, PATH_BACKUP } from './api/backup'\nimport { PATH_STATUS } from './api/status'\nimport { DataApiClient, BackupApiClient, StatusApiClient } from '.'\nimport { DEFAULT_RQLITE_HOST, ENV_RQLITE_HOSTS } from './test/env'\n\n/**\n * The RQLite host for integration tests, which can be changed\n * using the RQLITE_HOSTS environment variable or defaults to\n * http://localhost:4001\n * @type {String} The RQLite host address\n */\nconst HOST = process.env[ENV_RQLITE_HOSTS] || DEFAULT_RQLITE_HOST\n\nconst httpAgent = new http.Agent({ keepAlive: true })\nconst httpsAgent = new https.Agent({ keepAlive: true })\n\ndescribe('api status client', () => {\n const statusApiClient = new StatusApiClient(HOST, { httpAgent, httpsAgent })\n /**\n * Before beginning test check the status endpoint for a response from\n * RQLite server\n * @param {Number} backoffBase The amount of time to wait\n * @param {Number} max The maximum number of attempts before\n * throw the current error\n */\n async function checkRqliteServerReady (backoffBase = 500, max = 10) {\n return retryAsPromise(async () => {\n const status = await statusApiClient.statusAllHosts()\n const ready = status.map((v) => v.response?.body?.store?.ready).every((v) => v === true)\n if (!ready) {\n throw new Error('All stores are not ready')\n }\n return status\n }, {\n backoffBase,\n max,\n })\n }\n\n before('check RQLite Server ready', () => checkRqliteServerReady())\n describe('should get status response', () => {\n it(`should call ${HOST}${PATH_STATUS} and create table named foo`, async () => {\n const { body } = await statusApiClient.status()\n assert.isObject(body, 'response body is object')\n assert.property(body, 'build')\n assert.property(body, 'http')\n // assert.property(body, 'last_backup')\n assert.property(body, 'node')\n assert.property(body, 'runtime')\n assert.property(body, 'store')\n })\n })\n})\n\ndescribe('api data client', () => {\n const dataApiClient = new DataApiClient(HOST, { httpAgent, httpsAgent })\n // eslint-disable-next-line prefer-arrow-callback\n after('clean up data', async function cleanUpApiDataClientTests () {\n await dataApiClient.execute('DROP TABLE IF EXISTS foo')\n })\n describe('create table', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and create table named foo`, async () => {\n const sql = 'CREATE TABLE foo (id integer not null primary key, name text)'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const results = dataResults.getResults()\n assert.lengthOf(results, 1)\n })\n })\n describe('insert one row', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and insert a record with the name fiona`, async () => {\n const sql = 'INSERT INTO foo(name) VALUES(\"fiona\")'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n assert.equal(dataResult.getLastInsertId(), 1, 'last_insert_id')\n })\n it(`should call ${HOST}${PATH_QUERY} and select a record with the name fiona`, async () => {\n const sql = 'SELECT name FROM foo WHERE name=\"fiona\"'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('name'), 'fiona', 'name')\n })\n })\n describe('update one row', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and update the record with the name fiona to the name justin`, async () => {\n const sql = 'UPDATE foo SET name=\"justin\" WHERE name=\"fiona\"'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n })\n it(`should call ${HOST}${PATH_QUERY} and select a record with the name justin`, async () => {\n const sql = 'SELECT name FROM foo WHERE name=\"justin\"'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('name'), 'justin', 'name')\n })\n })\n describe('delete one row', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and delete a record with the name justin`, async () => {\n const sql = 'DELETE FROM foo WHERE name=\"justin\"'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n })\n it(`should call ${HOST}${PATH_QUERY} and select a count of foo item that has a result of zero`, async () => {\n const sql = 'SELECT COUNT(id) AS idCount FROM foo'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('idCount'), 0, 'idCount')\n })\n })\n describe('insert multiple rows', () => {\n const total = 100\n const dataList = Array(total).fill(0)\n it(`should call ${HOST}${PATH_EXECUTE} and insert a record with the name fiona and justin using a transaction`, async () => {\n const sql = dataList.map((_v, i) => `INSERT INTO foo(name) VALUES(\"justin-${i}\")`)\n const dataResults = await dataApiClient.execute(sql, { atomic: true })\n assert.isUndefined(dataResults.getFirstError(), 'error')\n dataList.forEach((_v, i) => {\n const dataResult = dataResults.get(i)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n assert.equal(dataResult.getLastInsertId(), i + 1, 'last_insert_id')\n })\n })\n it(`should call ${HOST}${PATH_QUERY} and select a count of foo items that has a result of two`, async () => {\n const sql = 'SELECT COUNT(*) AS total FROM foo WHERE name like(\"justin-%\")'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('total'), total, 'total')\n })\n it(`should call ${HOST}${PATH_QUERY} and select an array of records with the name fiona then justin`, async () => {\n const sql = dataList.map((_v, i) => `SELECT name FROM foo WHERE name=\"justin-${i}\"`)\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n dataList.forEach((_v, i) => {\n assert.equal(dataResults.get(i).get('name'), `justin-${i}`, `item ${i} name`)\n })\n })\n })\n describe('drop the table', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and drop the table foo`, async () => {\n const sql = 'DROP TABLE foo'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n })\n })\n})\n\ndescribe('api backups client', () => {\n const backupApiClient = new BackupApiClient(HOST, { httpAgent, httpsAgent })\n const dataApiClient = new DataApiClient(HOST, { httpAgent, httpsAgent })\n /**\n * Capture the stream data and resolve a promise with the parsed JSON\n * @returns {Stream} The stream\n */\n function handleRequestStreamAsPromise (request) {\n return new Promise((resolve, reject) => {\n let result = Buffer.alloc(0)\n request\n .on('data', (data) => {\n result = Buffer.concat([result, data])\n })\n .on('end', () => resolve(result))\n .on('error', reject)\n })\n }\n\n // eslint-disable-next-line prefer-arrow-callback\n after('clean up backup data', async function cleanUpApiBackupTests () {\n await dataApiClient.execute('DROP TABLE IF EXISTS fooBackups')\n await dataApiClient.execute('DROP TABLE IF EXISTS fooRestore')\n })\n describe('backup database', () => {\n it(`should call ${HOST}${PATH_BACKUP} and get a SQL backup string`, async () => {\n const sql = 'CREATE TABLE fooBackups (id integer not null primary key, name text)'\n let dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n dataResults = await dataApiClient.execute([\n 'INSERT INTO fooBackups(name) VALUES(\"fiona\")',\n 'INSERT INTO fooBackups(name) VALUES(\"justin\")',\n ], { atomic: true })\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const request = await backupApiClient.backup()\n const stream = await handleRequestStreamAsPromise(request)\n assert.isString(stream.toString())\n })\n })\n describe('restore database', () => {\n it(`should call ${HOST}${PATH_LOAD} and send a SQLite backup stream`, async () => {\n /**\n * Individual SQL statements to create back up data\n */\n const BACKUP_SQL_STATEMENTS = [\n 'CREATE TABLE fooRestore (id integer not null primary key, name text)',\n 'INSERT INTO fooRestore(name) VALUES (\"fiona\")',\n 'INSERT INTO fooRestore(name) VALUES (\"justin\")',\n ]\n const sql = Buffer.from(BACKUP_SQL_STATEMENTS.join(';'))\n const request = await backupApiClient.load(sql)\n const { results } = JSON.parse(await handleRequestStreamAsPromise(request))\n assert.nestedPropertyVal(results, '[0].rows_affected', 1, 'results of last SQL statment is 1 row')\n const dataResults = await dataApiClient.query('SELECT id, name FROM fooRestore WHERE name=\"fiona\"', { level: 'strong' })\n const error = dataResults.getFirstError()\n if (error) {\n throw error\n }\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.deepEqual(dataResult.get('id'), 1, 'id')\n assert.deepEqual(dataResult.get('name'), 'fiona', 'name')\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,25 +1,36 @@
1
1
  {
2
2
  "name": "rqlite-js",
3
- "version": "2.5.7",
3
+ "version": "2.6.0",
4
4
  "description": "A client library for RQLite written in Javascript that works in NodeJS or the browser.",
5
5
  "main": "lib/index.js",
6
+ "engines": {
7
+ "node": ">=18"
8
+ },
9
+ "files": [
10
+ "lib",
11
+ "LICENSE",
12
+ "README.md"
13
+ ],
6
14
  "scripts": {
7
15
  "build": "babel es6 --out-dir lib --source-maps --ignore es6/**/*.unit.js,es6/**/*.integration.js,es6/test",
8
16
  "build-all": "babel es6 --out-dir lib --source-maps",
9
17
  "build-clean": "rm -rf lib",
10
18
  "build-release": "npm run build && npm run test-build",
11
- "docker-build": "docker-compose -p rqlitejs build",
12
- "docker-down": "docker-compose -p rqlitejs down",
13
- "docker-logs": "docker-compose -p rqlitejs logs",
14
- "docker-run-test": "docker-compose -p rqlitejs run test",
15
- "docker-stop": "docker-compose -p rqlitejs stop",
19
+ "docker-build": "docker compose -p rqlitejs build",
20
+ "docker-down": "docker compose -p rqlitejs down",
21
+ "docker-logs": "docker compose -p rqlitejs logs",
22
+ "docker-run-test": "docker compose -p rqlitejs run --rm test",
23
+ "docker-stop": "docker compose -p rqlitejs stop",
16
24
  "lint": "eslint es6/**/*.js",
17
- "release": "npm run lint && npm run build-all && npm run test-build && standard-version",
25
+ "type-check": "tsc -p jsconfig.json --noEmit",
26
+ "verify": "npm run lint && npm run type-check && npm test && npm run build-all && npm run test-build",
27
+ "verify:integrations": "npm run docker-build && npm run docker-run-test",
28
+ "release": "npm run verify",
18
29
  "test": "mocha --require @babel/register es6/test/unit/index.unit.js es6/**/*.unit.js",
19
- "test-integrations": "mocha --require @babel/register --timeout 10000 lib/**/*.integration.js",
30
+ "test-integrations": "mocha --require @babel/register --timeout 10000 es6/**/*.integration.js",
20
31
  "test-build": "mocha lib/test/unit/index.unit.js lib/**/*.unit.js",
21
32
  "test-build-integrations": "mocha --timeout 30000 lib/**/*.integration.js",
22
- "prepublishOnly": "npm run lint && npm run build && npm run test-build"
33
+ "prepublishOnly": "npm run lint && npm run type-check && npm run build && npm run test-build"
23
34
  },
24
35
  "repository": {
25
36
  "type": "git",
@@ -37,30 +48,29 @@
37
48
  },
38
49
  "homepage": "https://github.com/rqlite/rqlite-js#readme",
39
50
  "devDependencies": {
40
- "@babel/cli": "^7.26.4",
41
- "@babel/core": "^7.26.0",
42
- "@babel/eslint-parser": "^7.25.9",
43
- "@babel/plugin-proposal-class-properties": "^7.18.6",
44
- "@babel/plugin-transform-runtime": "^7.25.9",
45
- "@babel/preset-env": "^7.26.0",
46
- "@babel/register": "^7.25.9",
47
- "@babel/runtime": "^7.26.0",
51
+ "@babel/cli": "^7.29.7",
52
+ "@babel/core": "^7.29.13",
53
+ "@babel/eslint-parser": "^7.29.13",
54
+ "@babel/plugin-transform-runtime": "^7.29.7",
55
+ "@babel/preset-env": "^7.29.7",
56
+ "@babel/register": "^7.29.13",
57
+ "@babel/runtime": "^7.29.13",
58
+ "@types/node": "^22.20.5",
48
59
  "babel-plugin-add-module-exports": "^1.0.4",
49
60
  "chai": "^4.5.0",
50
61
  "chai-as-promised": "^7.1.2",
51
62
  "eslint": "^8.57.1",
52
63
  "eslint-config-airbnb-base": "^15.0.0",
53
64
  "eslint-plugin-babel": "^5.3.1",
54
- "eslint-plugin-import": "^2.31.0",
65
+ "eslint-plugin-import": "^2.32.0",
55
66
  "eslint-plugin-mocha": "^10.5.0",
56
67
  "mocha": "^10.8.2",
57
68
  "nock": "^13.5.6",
58
- "retry-as-promised": "^7.0.4",
59
- "standard-version": "^9.5.0"
69
+ "retry-as-promised": "^7.1.1",
70
+ "typescript": "^5.9.3"
60
71
  },
61
72
  "dependencies": {
62
- "axios": "^1.7.9",
63
- "install": "^0.13.0",
64
- "qs": "^6.13.1"
73
+ "axios": "^1.21.0",
74
+ "qs": "^6.17.1"
65
75
  }
66
76
  }
package/.eslintrc DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "env": {
3
- "node": true,
4
- "mocha": true
5
- },
6
- "extends": "airbnb-base",
7
- "plugins": [
8
- "mocha",
9
- "babel"
10
- ],
11
- "rules": {
12
- "import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
13
- "mocha/no-exclusive-tests": "error",
14
- "object-curly-newline": 0,
15
- "object-curly-spacing": [2, "always"],
16
- "semi": [2, "never"],
17
- "space-before-function-paren": [2, "always"]
18
- },
19
- "parser": "@babel/eslint-parser"
20
- }
package/.travis.yml DELETED
@@ -1,24 +0,0 @@
1
- sudo: required
2
-
3
- services:
4
- - docker
5
-
6
- language: node_js
7
-
8
- node_js:
9
- - "14"
10
-
11
- cache:
12
- directories:
13
- - "node_modules"
14
-
15
- before_install:
16
- - docker pull rqlite/rqlite:5.12.1
17
- - docker run -d -p 4001:4001 -p 4002:4002 --name=rqlite-js rqlite/rqlite:5.12.1
18
-
19
- script:
20
- - npm run build-all
21
- - npm run test-build -- --reporter tap
22
- - npm run test-build-integrations -- --reporter tap
23
- - docker stop rqlite-js
24
- - docker rm rqlite-js
@@ -1,71 +0,0 @@
1
- /**
2
- * Backup api client to perform RQLite back and load operations
3
- * @module api/backup
4
- */
5
- import HttpRequest from '../../http-request'
6
- import { CONTENT_TYPE_APPLICATION_OCTET_STREAM, CONTENT_TYPE_TEXT_PLAIN } from '../../http-request/content-types'
7
-
8
- /**
9
- * The RQLite load api path
10
- */
11
- export const PATH_LOAD = '/db/load'
12
-
13
- /**
14
- * The RQLite backup api path
15
- */
16
- export const PATH_BACKUP = '/db/backup'
17
-
18
- /**
19
- * Use plain SQL dump as the back up format
20
- */
21
- export const BACKUP_DATA_FORMAT_SQL = 'sql'
22
-
23
- /**
24
- * Use sqlite3 dump as the back up format
25
- */
26
- export const BACKUP_DATA_FORMAT_DUMP = 'dump'
27
-
28
- /**
29
- * Backup api client to perform RQLite back up and load operations
30
- */
31
- export default class BackupApiClient extends HttpRequest {
32
- /**
33
- * Perform a SQL dump backup from the RQLite server
34
- * @param {String} [format=BACKUP_DATA_FORMAT_DUMP] The backup data format
35
- * @returns {Stream} The response stream
36
- */
37
- async backup (format = BACKUP_DATA_FORMAT_DUMP) {
38
- const stream = super.get({
39
- headers: {
40
- // Always sends application/octet-stream from the server in RQLite v4.x
41
- Accept: CONTENT_TYPE_APPLICATION_OCTET_STREAM,
42
- },
43
- query: { fmt: format === BACKUP_DATA_FORMAT_SQL ? format : undefined },
44
- json: false,
45
- stream: true,
46
- uri: PATH_BACKUP,
47
- useLeader: true,
48
- })
49
- return stream
50
- }
51
-
52
- /**
53
- * Perform a SQL restore by sending data the RQLite server
54
- * @param {Buffer|String} data The data to be loaded
55
- * @param {String} [format=BACKUP_DATA_FORMAT_SQL] The backup data format
56
- * @returns {Stream} The response stream
57
- */
58
- async load (data, format = BACKUP_DATA_FORMAT_SQL) {
59
- return super.post({
60
- body: data,
61
- headers: {
62
- // eslint-disable-next-line max-len
63
- 'Content-Type': format === BACKUP_DATA_FORMAT_SQL ? CONTENT_TYPE_TEXT_PLAIN : CONTENT_TYPE_APPLICATION_OCTET_STREAM,
64
- },
65
- json: false,
66
- stream: true,
67
- uri: PATH_LOAD,
68
- useLeader: true,
69
- })
70
- }
71
- }