-
Notifications
You must be signed in to change notification settings - Fork 479
/
11-using-facts-in-events.js
148 lines (132 loc) · 2.8 KB
/
11-using-facts-in-events.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
'use strict'
/*
* This is an advanced example demonstrating an event that emits the value
* of a fact in it's parameters.
*
* Usage:
* node ./examples/11-using-facts-in-events.js
*
* For detailed output:
* DEBUG=json-rules-engine node ./examples/11-using-facts-in-events.js
*/
require('colors')
const { Engine, Fact } = require('json-rules-engine')
async function start () {
/**
* Setup a new engine
*/
const engine = new Engine([], { replaceFactsInEventParams: true })
// in-memory "database"
let currentHighScore = null
const currentHighScoreFact = new Fact('currentHighScore', () => currentHighScore)
/**
* Rule for when you've gotten the high score
* event will include your score and initials.
*/
const highScoreRule = {
conditions: {
any: [
{
fact: 'currentHighScore',
operator: 'equal',
value: null
},
{
fact: 'score',
operator: 'greaterThan',
value: {
fact: 'currentHighScore',
path: '$.score'
}
}
]
},
event: {
type: 'highscore',
params: {
initials: { fact: 'initials' },
score: { fact: 'score' }
}
}
}
/**
* Rule for when the game is over and you don't have the high score
* event will include the previous high score
*/
const gameOverRule = {
conditions: {
all: [
{
fact: 'score',
operator: 'lessThanInclusive',
value: {
fact: 'currentHighScore',
path: '$.score'
}
}
]
},
event: {
type: 'gameover',
params: {
initials: {
fact: 'currentHighScore',
path: '$.initials'
},
score: {
fact: 'currentHighScore',
path: '$.score'
}
}
}
}
engine.addRule(highScoreRule)
engine.addRule(gameOverRule)
engine.addFact(currentHighScoreFact)
/**
* Register listeners with the engine for rule success
*/
engine
.on('success', async ({ params: { initials, score } }) => {
console.log(`HIGH SCORE\n${initials} - ${score}`)
})
.on('success', ({ type, params }) => {
if (type === 'highscore') {
currentHighScore = params
}
})
let facts = {
initials: 'DOG',
score: 968
}
// first run, without a high score
await engine.run(facts)
console.log('\n')
// new player
facts = {
initials: 'AAA',
score: 500
}
// new player hasn't gotten the high score yet
await engine.run(facts)
console.log('\n')
facts = {
initials: 'AAA',
score: 1000
}
// second run, with a high score
await engine.run(facts)
}
start()
/*
* OUTPUT:
*
* NEW SCORE:
* DOG - 968
*
* HIGH SCORE:
* DOG - 968
*
* HIGH SCORE:
* AAA - 1000
*/