Skip to content

Commit

Permalink
feat: add onHttpServerMessage hook
Browse files Browse the repository at this point in the history
  • Loading branch information
Julien-R44 committed Mar 31, 2024
1 parent f77bca3 commit 516a1fb
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 6 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
"quick:test": "cross-env NODE_DEBUG=adonisjs:assembler node --enable-source-maps --loader=ts-node/esm bin/test.ts"
},
"devDependencies": {
"@adonisjs/application": "8.1.0",
"@adonisjs/application": "8.2.1",
"@adonisjs/eslint-config": "^1.3.0",
"@adonisjs/prettier-config": "^1.3.0",
"@adonisjs/tsconfig": "^1.3.0",
Expand Down
6 changes: 6 additions & 0 deletions src/dev_server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ export class DevServer {
})

this.#httpServer.on('message', async (message) => {
void this.#hooks.onHttpServerMessage({ colors: ui.colors, logger: this.#logger }, message, {
restartServer: () => {
this.#restartHTTPServer(port)
},
})

if (this.#isAdonisJSReadyMessage(message)) {
const host = message.host === '0.0.0.0' ? '127.0.0.1' : message.host

Expand Down
20 changes: 16 additions & 4 deletions src/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
*/

import {
RcFile,
AssemblerHookNode,
SourceFileChangedHookHandler,
AssemblerHookHandler,
RcFile,
HttpServerMessageHookHandler,
SourceFileChangedHookHandler,
} from '@adonisjs/application/types'
import { RuntimeException } from '@poppinss/utils'
import Hooks from '@poppinss/hooks'
Expand All @@ -20,10 +21,11 @@ export class AssemblerHooks {
#config: RcFile['unstable_assembler']

#hooks = new Hooks<{
onDevServerStarted: [Parameters<AssemblerHookHandler>, []]
onSourceFileChanged: [Parameters<SourceFileChangedHookHandler>, []]
onBuildStarting: [Parameters<AssemblerHookHandler>, []]
onBuildCompleted: [Parameters<AssemblerHookHandler>, []]
onDevServerStarted: [Parameters<AssemblerHookHandler>, []]
onSourceFileChanged: [Parameters<SourceFileChangedHookHandler>, []]
onHttpServerMessage: [Parameters<HttpServerMessageHookHandler>, []]
}>()

constructor(config: RcFile['unstable_assembler']) {
Expand Down Expand Up @@ -54,6 +56,9 @@ export class AssemblerHooks {
...(this.#config?.onSourceFileChanged || []).map(async (node) =>
this.#hooks.add('onSourceFileChanged', await this.#resolveHookNode(node))
),
...(this.#config?.onHttpServerMessage || []).map(async (node) =>
this.#hooks.add('onHttpServerMessage', await this.#resolveHookNode(node))
),
])
}

Expand Down Expand Up @@ -98,4 +103,11 @@ export class AssemblerHooks {
async onBuildCompleted(...args: Parameters<AssemblerHookHandler>) {
await this.#hooks.runner('onBuildCompleted').run(...args)
}

/**
* When a message is received from the HTTP server process
*/
async onHttpServerMessage(...args: Parameters<HttpServerMessageHookHandler>) {
await this.#hooks.runner('onHttpServerMessage').run(...args)
}
}
2 changes: 1 addition & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export type DevServerOptions = {
*/
hooks?: Pick<
NonNullable<RcFile['unstable_assembler']>,
'onDevServerStarted' | 'onSourceFileChanged'
'onDevServerStarted' | 'onSourceFileChanged' | 'onHttpServerMessage'
>
}

Expand Down
90 changes: 90 additions & 0 deletions tests/dev_server.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,94 @@ test.group('DevServer', () => {

await sleep(500)
}).timeout(10_000)

test('onHttpServerMessage hook should be executed', async ({ assert, fs, cleanup }) => {
let receivedMessages: any[] = []

await fs.createJson('tsconfig.json', {
include: ['**/*'],
exclude: [],
})
await fs.create('index.ts', 'console.log("hey")')
await fs.create(
'bin/server.js',
`
process.send({ isAdonisJS: true, environment: 'web' });
process.send({ type: 'http-server-message', message: 'hello' });
`
)
await fs.create('.env', 'PORT=3334')

const devServer = new DevServer(fs.baseUrl, {
assets: { enabled: false },
nodeArgs: [],
scriptArgs: [],
hooks: {
onHttpServerMessage: [
async () => ({
default: (_, message, __) => {
receivedMessages.push(message)
},
}),
],
},
})

await devServer.startAndWatch(ts)
cleanup(() => devServer.close())

await sleep(500)

assert.deepEqual(receivedMessages, [
{ isAdonisJS: true, environment: 'web' },
{ type: 'http-server-message', message: 'hello' },
])
})

test('can restart server from onHttpServerMessage hook', async ({ assert, fs, cleanup }) => {
let receivedMessages: any[] = []

await fs.createJson('tsconfig.json', {
include: ['**/*'],
exclude: [],
})
await fs.create('index.ts', 'console.log("hey")')
await fs.create(
'bin/server.js',
`
process.send({ isAdonisJS: true, environment: 'web' });
process.send({ type: 'restart' });
`
)
await fs.create('.env', 'PORT=3334')

let wasRestarted = false

const devServer = new DevServer(fs.baseUrl, {
assets: { enabled: false },
nodeArgs: [],
scriptArgs: [],
hooks: {
onHttpServerMessage: [
async () => ({
default: (_, message, { restartServer }) => {
receivedMessages.push(message)

if (message.type === 'restart' && !wasRestarted) {
restartServer()
wasRestarted = true
}
},
}),
],
},
})

await devServer.startAndWatch(ts)
cleanup(() => devServer.close())

await sleep(500)

assert.deepEqual(receivedMessages.length, 4)
})
})

0 comments on commit 516a1fb

Please sign in to comment.