Deze POC toont aan dat een monolithische microkernel architectuur mogelijk is waarbij levels (plug-ins) dynamisch geladen worden zonder de core te herstarten.
| Eigenschap | Bewijs |
|---|---|
| Plug-ins laden bij opstart | Core scant de plugins map en laadt alle levels automatisch |
| Contract validatie | Core weigert plug-ins die de LevelPlugin interface niet implementeren |
| Hot-reload | Nieuwe plug-in laden via API zonder herstart van de core |
| Isolatie | Fout in een plug-in crasht de core niet |
docker-compose upDe core start op poort 3000 en laadt automatisch alle plug-ins uit de plugins/ map.
| Method | Route | Beschrijving |
|---|---|---|
| GET | /levels | Alle geladen plug-ins ophalen |
| GET | /levels/:id | Één level ophalen |
| POST | /levels/:id/submit | Code indienen voor een level |
| POST | /plugins/load | Hot-load een nieuwe plug-in |
| DELETE | /plugins/:id | Plug-in verwijderen op runtime |
curl http://localhost:3000/levelsDit is de oplossing voor een plugin-level:
curl -X POST http://localhost:3000/levels/level-hello/submit \
-H "Content-Type: application/json" \
-d '{"code": "function solution() { return \"Hello, World!\"; }"}'Verwacht resultaat:
{ "passed": true, "feedback": "Correct!", "output": "Hello, World!" }Maak een nieuwe plug-in aan terwijl de core draait (zonder te herstarten)
Voorbeeldplugin:
Maak de map plugins/level-reverse/ aan met dit index.js bestand:
module.exports = {
id: 'level-reverse',
name: 'Reverse String',
description: 'Schrijf een functie reverse(s) die een string omkeert.',
version: '1.0.0'
evaluate(submittedCode) {
try {
const fn = new Function(`${submittedCode}; return reverse("hello");`);
const output = fn();
const passed = output === 'olleh';
return {
passed,
feedback: passed ? 'Correct!' : `Verwacht "olleh", kreeg "${output}"`,
output: String(output),
};
} catch (err) {
return { passed: false, feedback: `Fout: ${err.message}` };
}
},
};Laad de plug-in via de API (hot reload triggeren):
curl -X POST http://localhost:3000/plugins/load \
-H "Content-Type: application/json" \
-d '{"pluginDir": "level-reverse"}'Controleer in de Docker logs:
Plugin loaded: [level-reverse] Reverse String
Test de nieuwe plug-in:
curl -X POST http://localhost:3000/levels/level-reverse/submit \
-H "Content-Type: application/json" \
-d '{"code": "function reverse(s) { return s.split(\"\").reverse().join(\"\"); }"}'curl -X DELETE http://localhost:3000/plugins/level-reverse├── docker-compose.yml
├── README.md
├── core/ ← NestJS applicatie
│ ├── Dockerfile
│ ├── package.json
│ ├── tsconfig.json
│ └── src/
│ ├── main.ts
│ ├── app.module.ts
│ ├── plugin
│ │ └── plugin.interface.ts ← het contract
│ ├── plugin-registry\
│ │ └── plugin-registry.service.ts ← dynamisch laden + hot-reload
│ └── level-controller\
│ └── level.controller.ts ← REST endpoints
└── plugins/ ← plug-ins (los van de core)
├── level-hello/index.js
├── level-fibonacci/index.js
└── level-palindrome/index.js