-
Notifications
You must be signed in to change notification settings - Fork 7
/
pgbootdemo.js
130 lines (112 loc) · 3.31 KB
/
pgbootdemo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Demo of using pgBoot - a keepie client - to start a server and initialize it
// The sql scripts use to initialze are kept in sql-scripts in this repository
// Copyright (C) 2018 by Nic Ferrier, ferrier.nic@gmail.com
const pgBoot = require("./server.js").pgBoot;
const path = require("path");
const readline = require('readline');
// PSQL command line
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false,
});
function devCli(dbConfig) {
rl.question("> ", (command) => {
console.log("got a command");
switch (command) {
case "psql":
dbConfig.psqlSpawn(devCli);
break;
case "help":
console.log("this is a simple cli allowing launching of psql");
devCli();
break;
default:
console.log("type help");
devCli();
break;
}
});
}
// Webapp
const port = 8004;
// Config
const options = {
webApp: true,
cli: false
};
const dbConfig = {};
// Listen for the dbUp event to receive the connection pool
pgBoot.events.on("dbUp", async dbDetails => {
let { pgPool, psql } = dbDetails;
// when we get the pool make a query method available
dbConfig.query = async function (sql, parameters) {
let client = await pgPool.connect();
try {
let result = await client.query(sql, parameters);
return result;
}
catch (e) {
return {
dberror: e
};
}
finally {
client.release();
}
};
dbConfig.psqlSpawn = psql;
});
pgBoot.events.on("dbPostInit", () => {
console.log("pgboot webapp listening on ", port);
if (options.cli) {
devCli(dbConfig);
}
});
// Main
pgBoot.boot(port, {
dbDir: path.join(__dirname, "dbfiles"),
sqlScriptsDir: path.join(__dirname, "sql-scripts"),
pgPoolConfig: {
max: 3,
idleTimeoutMillis: 10 * 1000,
connectionTimeoutMillis: 5 * 1000
},
listenerCallback: function (listenerAddress) {
console.log("listening on", listenerAddress);
},
appCallback: function (app) {
app.set('json spaces', 4);
// Dummy query function until we have a db up
app.query = async function (sql, parameters) {
if (dbConfig.query !== undefined) {
return dbConfig.query(sql, parameters);
}
throw new Error("no db connection yet");
};
// psqlweb if we want it
if (options.webApp) {
try {
const auth = require("simple-auth-4-express");
const psqlWebApp = require("psql-web-app");
psqlWebApp.init(app, {
middleware: auth.middleware(function (username, password) {
return true;
})
});
}
catch (e) {
console.error("pgboot webapp problem? just requires?", e.message);
}
}
// end psqlweb
app.get("/status", async function (req, res) {
let query = "SELECT * FROM nictest;";
res.json({
up: true,
nictestRows: await app.query(query)
});
});
}
});
// Ends here