Skip to content
This repository was archived by the owner on Jun 19, 2021. It is now read-only.

Commit 69cd2f0

Browse files
committed
feat(lifecycle): add register event handler️ ⌛️
🏁 **started** fire when bot is started 🗣 **answered** fire everytime bot recieve an answer from a question ❔ **onAsking** fire when bot asking specific question ❗️ **onError** fire when error occur on specific event
1 parent c957981 commit 69cd2f0

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

src/event-handler.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
type Response = string | void
2+
type Callback = (query?: string) => (Response | Promise<Response>)
3+
type EventHandler<T extends string> = { [key in T]?: Callback }
4+
5+
export type Question = 'passphrase' | 'devicename'
6+
export type ErrorEvent = Question | keyof Event
7+
export interface Event {
8+
started: Callback,
9+
answered: Callback,
10+
onAsking: EventHandler<Question>
11+
onError: EventHandler<ErrorEvent>
12+
}
13+
14+
// #region where the event handler being stored
15+
export const bot: Event = {
16+
started: () => {},
17+
answered: () => {},
18+
onAsking: {},
19+
onError: {}
20+
}
21+
// #endregion
22+
23+
/**
24+
* Register event handler
25+
* each event represent the lifecycle of the bot
26+
* and each handler support both normal and async function
27+
*/
28+
export default {
29+
started: (callback: Callback) => (bot.started = callback),
30+
onAsking: (question: Question, callback: Callback) => (bot.onAsking[question] = callback),
31+
onError: (event: ErrorEvent, callback: Callback) => (bot.onError[event] = callback)
32+
}

src/shim-readline.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
import {ReadLineOptions} from 'readline'
22

3+
import {bot, Question} from './event-handler'
4+
35
/**
46
* Shim readline.createInterface()
57
* @see https://nodejs.org/api/readline.html#readline_readline_createinterface_options
68
*/
79
export function createInterface(_options: ReadLineOptions) {
810
return {
9-
question(_query: string, answering: (response: string | void) => void) {
10-
answering()
11-
},
12-
close() {}
11+
close: bot.answered,
12+
question(query: string, answering: (response: string | void) => void) {
13+
// #region helpers
14+
query = query.toLocaleLowerCase()
15+
const on = (event: Question) => Promise.resolve(bot.onAsking[event]!())
16+
const questionIncludes = (keywords: string[]) => keywords.every(keyword => query.includes(keyword))
17+
// #endregion helpers
18+
19+
Promise.resolve(bot.started(query)).then(async () => {
20+
if (questionIncludes(['passphrase'])) answering(await on('passphrase'))
21+
else if (questionIncludes(['device', 'name'])) answering(await on('devicename'))
22+
else answering()
23+
}).catch(bot.onError.started)
24+
}
1325
}
1426
}

0 commit comments

Comments
 (0)