Skip to content

Commit 7c8f933

Browse files
committed
feat!: refactor server script, update validation
1 parent ac4e08d commit 7c8f933

File tree

6 files changed

+76
-55
lines changed

6 files changed

+76
-55
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ The server is in active development and its API is subject to frequent change.
77

88
### Usage
99

10-
With a recent version of Node.js installed (`v12` should be sufficient), install all dependencies via `npm install`. Then, start the annotation server via `node index.js`—3000 will be its default port. With each start, the annotation server will generate a new, random API token which will be reported in its terminal output during startup.
10+
With a recent version of Node.js installed (`v12` should be sufficient), install all dependencies via `npm install`. Then, start the annotation server via `./bin/server.js index.js`—3000 will be its default port. With each start, the annotation server will generate a new, random API token which will be reported in its terminal output during startup.
1111

1212
#### Creating Users
1313

args.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ const os = require('os')
22
const parseArgs = require('minimist')
33

44
const args = parseArgs(process.argv.slice(2), {
5-
boolean: ['x', 'ssl'],
5+
boolean: ['x', 'ssl', 'help'],
66
string: ['port', 'host'],
77
alias: {
8+
help: 'h',
89
port: 'p',
910
ssl: 's',
1011
},
1112
default: {
13+
host: undefined,
1214
port: 3000,
13-
x: false,
1415
ssl: false,
15-
host: undefined,
16+
x: false,
1617
},
1718
})
1819

@@ -29,4 +30,5 @@ module.exports = {
2930
port,
3031
open: args.x,
3132
ssl: args.ssl,
33+
help: args.help,
3234
}

index.js renamed to bin/server.js

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
1-
const Hapi = require('@hapi/hapi')
2-
const AuthBasic = require('@hapi/basic')
3-
const AuthBearer = require('hapi-auth-bearer-token')
4-
const { createAuthDummy, validateToken, validateUser } = require('./auth')
5-
const { createUser, getUser, deleteUser } = require('./handlers/user')
1+
#!/usr/bin/env node
2+
const { createServer } = require('../server')
3+
const { createUser, getUser, deleteUser } = require('../handlers/user')
64
const {
75
createCollection,
86
getCollection,
97
deleteCollection,
10-
} = require('./handlers/collection')
8+
} = require('../handlers/collection')
119
const {
1210
createAnnotation,
1311
getAnnotation,
1412
updateAnnotation,
1513
deleteAnnotation,
16-
} = require('./handlers/annotation')
17-
const { generateKey } = require('./util')
18-
const args = require('./args')
19-
20-
const apiToken = generateKey()
14+
} = require('../handlers/annotation')
15+
const { generateKey } = require('../util')
16+
const args = require('../args')
2117

2218
function addHandler (server, path, method, handler, options = {}) {
2319
server.route({
@@ -28,42 +24,20 @@ function addHandler (server, path, method, handler, options = {}) {
2824
})
2925
}
3026

31-
async function createServer (opts = {}) {
32-
const port = opts.port || 3000,
33-
open = !!opts.open || false
34-
35-
const server = Hapi.server({
36-
port,
37-
router: {
38-
stripTrailingSlash: true,
39-
},
40-
routes: {
41-
cors: {
42-
origin: ['*'],
43-
exposedHeaders: ['link', 'allow', 'etag'],
44-
},
45-
},
46-
})
47-
48-
await server.register(open ? createAuthDummy('basic') : AuthBasic)
49-
server.auth.strategy('user', 'basic', {
50-
validate: validateUser({ userParam: 'user' }),
51-
})
52-
server.auth.default('user')
53-
54-
await server.register(
55-
open ? createAuthDummy('bearer-access-token') : AuthBearer
56-
)
57-
server.auth.strategy('api-token', 'bearer-access-token', {
58-
allowQueryToken: true,
59-
validate: validateToken(apiToken),
60-
})
61-
62-
return server
63-
}
64-
6527
async function main () {
66-
const server = await createServer(args)
28+
if (args.help) {
29+
console.log(`Usage: $ simple-annotation-server
30+
31+
Options:
32+
-p --port PORT TCP port to serve on (defaults to 3000)
33+
--host HOST Full public host (e.g., www.example.com:5000)
34+
-s --ssl Runs behind an SSL proxy
35+
-x Don't require any authentication`)
36+
process.exit(0)
37+
}
38+
39+
const apiToken = generateKey()
40+
const server = await createServer({ ...args, apiToken })
6741

6842
addHandler(server, '/', 'POST', createUser, { auth: 'api-token' })
6943
addHandler(server, '/{user}', 'GET', getUser, {

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
"name": "simple-annotation-server",
33
"version": "0.1.0",
44
"description": "Simple HTTP server implementing the Web Annotation specification",
5-
"main": "index.js",
65
"scripts": {
6+
"start": "./bin/server.js",
77
"test": "tape test/*.js"
88
},
9+
"bin": {
10+
"simple-annotation-server": "./bin/server.js"
11+
},
912
"repository": {
1013
"type": "git",
1114
"url": "git+https://github.com/falafeljan/simple-annotation-server.git"
@@ -31,7 +34,7 @@
3134
"level": "^6.0.1",
3235
"minimist": "^1.2.5",
3336
"uuid": "^8.2.0",
34-
"validate-web-annotation": "^0.2.0"
37+
"validate-web-annotation": "^0.3.0"
3538
},
3639
"devDependencies": {
3740
"tape": "^5.0.1"

server.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const Hapi = require('@hapi/hapi')
2+
const AuthBasic = require('@hapi/basic')
3+
const AuthBearer = require('hapi-auth-bearer-token')
4+
const { createAuthDummy, validateToken, validateUser } = require('./auth')
5+
const { generateKey } = require('./util')
6+
7+
async function createServer (opts = {}) {
8+
const port = opts.port || 3000
9+
const open = !!opts.open || false
10+
const apiToken = opts.apiToken || generateKey()
11+
12+
const server = Hapi.server({
13+
port,
14+
router: {
15+
stripTrailingSlash: true,
16+
},
17+
routes: {
18+
cors: {
19+
origin: ['*'],
20+
exposedHeaders: ['link', 'allow', 'etag'],
21+
},
22+
},
23+
})
24+
25+
await server.register(open ? createAuthDummy('basic') : AuthBasic)
26+
server.auth.strategy('user', 'basic', {
27+
validate: validateUser({ userParam: 'user' }),
28+
})
29+
server.auth.default('user')
30+
31+
await server.register(
32+
open ? createAuthDummy('bearer-access-token') : AuthBearer
33+
)
34+
server.auth.strategy('api-token', 'bearer-access-token', {
35+
allowQueryToken: true,
36+
validate: validateToken(apiToken),
37+
})
38+
39+
return server
40+
}
41+
42+
module.exports = { createServer }

0 commit comments

Comments
 (0)