Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

POC: Monolithische Microkernel (NestJS)

Wat bewijst deze POC?

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

Vereisten


Opstarten

docker-compose up

De core start op poort 3000 en laadt automatisch alle plug-ins uit de plugins/ map.


Endpoints

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

Testen

1. Alle levels ophalen

curl http://localhost:3000/levels

2. Code indienen

Dit 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!" }

3. Hot-reload demo ← kernbewijs van de POC

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(\"\"); }"}'

4. Plug-in verwijderen op runtime

curl -X DELETE http://localhost:3000/plugins/level-reverse

Projectstructuur

├── 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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages