diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/accretion.mjs | 42 | ||||
-rw-r--r-- | src/api.mjs | 20 | ||||
-rwxr-xr-x | src/bin.mjs | 4 | ||||
-rw-r--r-- | src/cmd/papo.go | 28 | ||||
-rw-r--r-- | src/db.mjs | 57 | ||||
-rw-r--r-- | src/escape.mjs | 14 | ||||
-rw-r--r-- | src/ircd.mjs | 19 | ||||
-rw-r--r-- | src/package.json | 3 | ||||
-rw-r--r-- | src/papo.go | 8 | ||||
-rw-r--r-- | src/sqlite.cjs | 1 | ||||
-rw-r--r-- | src/utils.mjs | 105 | ||||
-rw-r--r-- | src/web.mjs | 38 |
12 files changed, 36 insertions, 303 deletions
diff --git a/src/accretion.mjs b/src/accretion.mjs deleted file mode 100644 index dd3372c..0000000 --- a/src/accretion.mjs +++ /dev/null @@ -1,42 +0,0 @@ -import assert from "node:assert/strict"; -import fs from "node:fs"; -import path from "node:path"; -import url from "node:url"; - -import sqlite from "./sqlite.cjs"; - -import * as u from "./utils.mjs"; - - -const DIRNAME = path.dirname(url.fileURLToPath(import.meta.url)); -export const MIGRATIONS_DIR = DIRNAME + "/sql/migrations/"; - -export const runMigrations = async (logFn, db) => { - assert(db); - - await db.exec(` - BEGIN TRANSACTION; - CREATE TABLE IF NOT EXISTS migrations ( - filename TEXT NOT NULL PRIMARY KEY - ); - COMMIT TRANSACTION; - `); - - const done = [...(await db.all("SELECT filename FROM migrations;"))] - .map(row => row.filename); - const allFiles = fs.readdirSync(MIGRATIONS_DIR, "UTF-8"); - const pending = u.difference(new Set(allFiles), new Set(done)); - const sortedPending = [...pending].sort(u.strSortFn); - - for (const filename of sortedPending) { - logFn({ log: "exec-migration", filename }); - const sql = fs.readFileSync(MIGRATIONS_DIR + filename, "UTF-8"); - await db.exec("BEGIN TRANSACTION;"); - await db.exec(sql); - await db.run( - "INSERT INTO migrations (filename) VALUES ($filename);", - { $filename: filename }, - ); - await db.exec("COMMIT TRANSACTION;") - } -}; diff --git a/src/api.mjs b/src/api.mjs deleted file mode 100644 index 31bb09e..0000000 --- a/src/api.mjs +++ /dev/null @@ -1,20 +0,0 @@ -import process from "node:process"; - -import * as ircd from "./ircd.mjs"; -import * as web from "./web.mjs"; - -const SUBCOMMANDS = { - ircd: ircd.app, - web: web.app, -}; - -export const main = async () => { - const [_node, _file, cmdName, ...args] = process.argv; - const cmd = SUBCOMMANDS[cmdName]; - if (cmd === undefined) { - console.error("Usage: papo SUBCOMMAND [OPTIONS]"); - return process.exit(2); - } - - await cmd(...args); -}; diff --git a/src/bin.mjs b/src/bin.mjs deleted file mode 100755 index e79904f..0000000 --- a/src/bin.mjs +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node -import * as api from "./api.mjs"; - -api.main(); diff --git a/src/cmd/papo.go b/src/cmd/papo.go new file mode 100644 index 0000000..301e4b0 --- /dev/null +++ b/src/cmd/papo.go @@ -0,0 +1,28 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "os" + + _ "github.com/mattn/go-sqlite3" + "euandre.org/papo/src" +) + + +func main() { + os.Remove("./foo.db") + + db, err := sql.Open("sqlite3", "./foo.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + message := papo.Hello("Xablau") + fmt.Println(message) + fmt.Println(message) + message = papo.Hello("Xupliu") + fmt.Println(message) +} diff --git a/src/db.mjs b/src/db.mjs deleted file mode 100644 index 7d6c6c5..0000000 --- a/src/db.mjs +++ /dev/null @@ -1,57 +0,0 @@ -import assert from "node:assert/strict"; -import fs from "node:fs"; -import path from "node:path"; -import process from "node:process"; -import url from "node:url"; -import util from "node:util"; - -import sqlite from "./sqlite.cjs"; - -import * as u from "./utils.mjs"; -import * as accretion from "./accretion.mjs"; - - -export const promisifyDb = dbHandle => ({ - ref: dbHandle, - all: util.promisify((...args) => dbHandle.all(...args)), - exec: util.promisify((...args) => dbHandle.exec(...args)), - run: util.promisify((...args) => dbHandle.run(...args)), - each: (...args) => - new Promise((resolve, reject) => { - const cb = args[args.length - 1]; - dbHandle.each( - ...args.slice(0, args.length - 1), - (err, row) => err ? reject(err) : cb(row), - (err, data) => err ? reject(err) : resolve(data), - ); - }), - prepare: (...args) => - new Promise((resolve, reject) => { - const mkStmt = stmtRef => ({ - ref: stmtRef, - run: util.promisify((...args) => stmtRef.run(...args)), - finalize: util.promisify((...args) => stmtRef.finalize(...args)), - }); - const ref = dbHandle.prepare( - ...args, - err => err ? reject(err) : resolve(mkStmt(ref)), - ); - }), -}); - -export const open = (...args) => - new Promise((resolve, reject) => { - const dbName = args[0]; - assert(dbName); - const ref = promisifyDb(new sqlite.Database( - ...args, - err => err ? reject(err) : resolve(ref), - )); - }); - -export let handle = null; - -export const init = async (logFn, dbName = process.env.PAPO_DB_PATH || ":memory:") => { - handle = await open(dbName); - await accretion.runMigrations(logFn, handle); -}; diff --git a/src/escape.mjs b/src/escape.mjs deleted file mode 100644 index 78e08f8..0000000 --- a/src/escape.mjs +++ /dev/null @@ -1,14 +0,0 @@ -const FROM = /[&<>'"]/g; - -const ESCAPES = { - '&': '&', - '<': '<', - '>': '>', - "'": ''', - '"': '"' -}; - -const mappingFn = c => ESCAPES[c]; - -export const escape = s => - String.prototype.replace.call(s, FROM, mappingFn); diff --git a/src/ircd.mjs b/src/ircd.mjs deleted file mode 100644 index 1924350..0000000 --- a/src/ircd.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import fs from "node:fs"; -import net from "node:net"; - -import * as hero from "./hero.mjs"; - - -const server = net.createServer(socket => { - socket.write("olar\r\n"); - socket.pipe(socket); -}); - -export const app = async path => { - if (fs.existsSync(path)) { - fs.unlinkSync(path); - } - server.listen(path, () => { - hero.log.info({ type: "starting-server", path }); - }); -}; diff --git a/src/package.json b/src/package.json deleted file mode 100644 index fb3cb61..0000000 --- a/src/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "api.mjs" -} diff --git a/src/papo.go b/src/papo.go new file mode 100644 index 0000000..d83ac58 --- /dev/null +++ b/src/papo.go @@ -0,0 +1,8 @@ +package papo + +import "fmt" + +func Hello(name string) string { + message := fmt.Sprintf("Hi, %v. Welcome!", name) + return message +} diff --git a/src/sqlite.cjs b/src/sqlite.cjs deleted file mode 100644 index a1b8ab7..0000000 --- a/src/sqlite.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("sqlite3"); diff --git a/src/utils.mjs b/src/utils.mjs deleted file mode 100644 index a3b36b3..0000000 --- a/src/utils.mjs +++ /dev/null @@ -1,105 +0,0 @@ -import util from "node:util"; - - -export const eq = util.isDeepStrictEqual; - -export const keys = (ks, obj) => - ks.reduce( - (ret, k) => - obj.hasOwnProperty(k) ? {...ret, [k]: obj[k]} : ret, - {}, - ); - -export const difference = (a, b) => { - const diff = new Set(a); - for (const el of b) { - diff.delete(el); - } - return diff; -}; - -export const assocIn = (obj, path, value) => - path.length === 0 ? obj : - path.length === 1 ? { ...obj, [path[0]]: value } : - { - ...obj, - [path[0]]: assocIn( - (obj[path[0]] || {}), - path.slice(1), - value - ) - }; - -export const dissoc = (obj, key) => { - const ret = { ...obj }; - delete ret[key] - return ret; -}; - -export const getIn = (obj, path) => - path.length === 0 ? obj : - getIn(obj?.[path[0]], path.slice(1)); - -export const findFirst = (arr, fn) => { - for (const x of arr) { - const ret = fn(x); - if (ret) { - return ret; - } - } - - return null; -}; - -export const partial = (fn, ...startArgs) => - (...endArgs) => - fn(...startArgs, ...endArgs); - -export const strSortFn = (a, b) => a.localeCompare(b, "POSIX"); - -export const undefinedAsNull = x => x === undefined ? null : x; - -export const first = a => a[0]; -export const rest = a => a.slice(1); -export const butlast = a => a.slice(a, a.length - 1); -export const last = a => a[a.length - 1]; - -export const take = function*(n, gen) { - let i = 0n; - for (const x of gen) { - if (i >= n) { - break; - } - i++; - yield x; - } -}; - -export const range = function*(x, y, step = 1n) { - if (x === undefined) { - let i = 0n; - while (true) { - yield i++; - } - } - const [from, to] = y === undefined ? - [0n, x] : - [x, y]; - const fromn = BigInt(from); - const ton = BigInt(to); - const stepn = BigInt(step); - if (stepn === 0n) { - while (true) { - yield fromn; - } - } - if (step < 0n) { - for (let i = fromn; i > ton; i+= stepn) { - yield i; - } - } else { - for (let i = fromn; i < ton; i += stepn) { - yield i; - } - } -}; diff --git a/src/web.mjs b/src/web.mjs deleted file mode 100644 index 69be59c..0000000 --- a/src/web.mjs +++ /dev/null @@ -1,38 +0,0 @@ -import * as u from "./utils.mjs"; -import * as hero from "./hero.mjs"; - - -const name = "papo"; - -const newConnection = (req) => { - const { socket, websocket } = req; - websocket.onmessage(message => { - console.log({ message }); - }); - // console.log({ req, socket, websocket }); - // websocket.onclose(() => console.log("closed")); - // websocket.onerror(() => console.log("errored")); - /* - req.socket.on("data", data => { - console.log("antes"); - console.log({ data }); - console.log({ data: new Uint8Array(data) }); - console.log("depois"); - }); - */ - // ws.on("error", console.error); - // ws.on("message", x => console.log(x.toString())); - // ws.send("hello from the server"); -}; - -const routes = [ - [ "WEBSOCKET", "/api/socket", newConnection ], -]; - -export const app = async (socket, pipe) => - await hero.buildServer({ - name, - routes, - socket, - pipe, - }).start(); |