HARCON-RADIATION - Une extension de la bibliothèque Harcon pour exposer automatiquement les services via REST et / ou WebSocket à l'aide des formats de message HARCON et JSONRPC.
================ HARCON-RADIATION est un petit outil étendant la bibliothèque Harcon pour fournir une interface de repos et basée sur WebSocket. Suite à votre configuration, vos services au sein de vos entités seront exposés via REST / WebSocket automatiquement.
Chaque fois que vous publiez ou révoquez une entité basée sur des objets, le radiation Harcon réagit aux modifications et maintenez les interfaces de manière transparente.
! Remarque: Depuis la version 8.0.0, Harcon ne prend en charge que le nœud V8 et attend les fonctions. Pour la version basée sur un rappel, veuillez utiliser V7 ou ci-dessous.
$ npm install harcon-radiation
LET SERVERCONFIG = {} LET harConConfig = {} Let RadiationConfig = {} LET Server = require ('Harcon-Radiation / Util / Server') LET Server = Server = new Server ({Name: 'King', Server: ServerConfig, Harcon : Harconconfig, Radiation: RadiationConfig}) Await Server.init ()
L'exemple montre comment créer une instance de serveur facilement. Le serveur est une instance Fastify en utilisant plusieurs plugins intégrés comme Fastify-WS fournissant une prise en charge WebSocket. Le serveur initie le Harcon et le Radiation Harcon ainsi que configuré.
L'idée principale est d'exposer toutes les entités basées sur des objets publiées pour Harcon possédant des attributs «repos» et «WebSocket» via ces interfaces REST et / ou WebSocket sans aucune action requise.
Le comportement par défaut consiste à publier tous les services définis par l'utilisateur. Cependant, on peut définir des règles pour faire des exceptions. En définissant l'option Hideinnerservices , Harcon-Radiation masquera les services intérieurs et ne les publiera pas
var radiationconfig = {..., hideinnerservices: true}
HARCON-RADIATION peut être configuré de 2 manières:
Pour définir une chaîne de préfixe
var radiationconfig = {..., hideinnerservices: true, innerservicesprefix: '_'})
Pour définir une fonction évaluant le nom des fonctions
var radiationconfig = {..., hideinnerservices: true, innerservicesfn: function (name) {return name.startswith ('inner') || name.startswith ('sys')}})
Spec openapi
Il existe 3 façons d'exposer les services par le repos:
RESTFUL: chaque service sera exposé sur différents URI selon le nom de la division, du contexte / de l'entité et du service. Le modèle URI général est / {division} / {entité} / {event} . Bien sûr, chaque pièce peut être un nom qualifié en fonction de votre orchestration Harcon.
JSON-RPC 2.0: Un seul URI acceva JSON-RPC 2.0 comme la spécification définit.
Harcon RPC: un seul uri acceptant un messages Harcon JSON
Par défaut, l'option 3 est active, les options 1 et 2 sont passives.
Les paramètres suivants activeront l'option Harcon-RPC sur URI '/ Harcon' :
var radiationConfig = {..., {rest: {ignorestpattern: false}})
L'interface Restful accepte uniquement les messages de publication. Pour aborder un service exposé, vous devez composer un URI suivant le modèle / {Division} / {Entity} / {Event} . Par exemple:
post -> 'http://localhost:8080/Harcon/book/log'
avec un corps de
{ params: [ 'Hello!'] }
abordera le service «journal» du «livre» du composant dans la division «Harcon» . La réponse de l'entité sera renvoyée comme JSON.
Harcon-Radiation prend en charge JSON-RPC 2.0 si vous créez l'instace comme suit:
var radiationconfig = {..., rest: {jsonrpcpath: '/ rpctwo'})
Cela acceptera la demande de poste sur le chemin '/ RPCTWO' en respectant la norme JSON-RPC 2.0.
Remarque: soyez conscient des limites de JSON-RPC. Il ne prend pas en charge l'orchestration comme les divisions ou les contextes, donc l'adressage doit être limité à EntityName.Service , les sous-domaines / sous-contextes ne peuvent pas être traités.
Les paramètres suivants activeront l'option Harcon-RPC sur URI '/ Harcon' :
var radiationConfig = {..., {rest: {harconrpcpath: '/ harcon'}})
En envoyant le JSON suivant à l'adresse, vous pouvez aborder la méthode «terminus» de l'entité «Marie» dans la division «King.charming» :
{Division: 'King.Charming', événement: 'Marie.terminus', params: ['Szióka!']}
Schéma JSON Message de Harcon
L'utilisation de WebSockets est également simple. La configuration suivante active les interfaces acceptant les messages JSON Harcon.
var radiationconfig = {..., {WebSocket: {harconpath: '/ socket'}})
Envoyer un paquet à cette interface:
const WebSocket = require ('ws') socketClient = new WebSocket ('ws: // localhost: 8080 / kingsocket') ... socketclient.send (json.stringify ({id: mid, division: 'King', événement: 'saluer.simple', paramètres: ['bonjour!', 'salut!']})) .Error (nouvelle erreur (data.error)) if (data.id === mid) console.log (data.result)})
Cela enverra un message JSON au serveur effectuant le service simple de l' accueil de l'entité dans Division King . La réponse sera renvoyée. Remarque: Un ID est fortement recommandé pour différencier les paquets de réponse entrants.
La configuration suivante active les interfaces acceptant les messages JSON RPC 2.0 JSON.
var radiationconfig = {..., {WebSocket: {jsonrpcpath: '/ jSonsocket'}})
Envoyer un paquet à cette interface:
socketjsonrpcclient.send (json.stringify ({jsonrpc: '2.0', id: mid, division: 'King', méthode: 'julie.wakeup', params: []})) socketjsonrpcclient.on ('message', fonction (fonction (function data) {data = json.parse (data) if (data.error) console.error (nouvelle erreur (data.error)) if (data.id === mid) console.log (data.result)})
Vous pouvez envoyer / diffuser des messages aux auditeurs connectés si votre entité commerciale appelle la méthode «décalée» , qui est un service intégré de Harcon laissant les entités pour informer le système des modifications de l'État. HARCON-RADIATION utilise ce mécanisme pour envoyer ces messages aux auditeurs WebSocket s'il est configuré.
Katie = {name: 'katie', contexte: 'Morning', dobusiness: function async () {attendre this.shifted ({humeur: 'couler toi, marie'}) return 'ok'}}
Cela enverra le message «Humeur» aux clients connectés avec les données «vers Toi, Marie» . Toutes les propriétés de l'objet transmises à la fonction «décalée» seront transformées en messages distincts à diffuser. La charge utile de chaque message sera définie par la valeur de la propriété donnée.
Remarque: Compte tenu de la nature du JSON-RPC 2.0, ce niveau de service nécessite d'implémenter la gestion des messages hors de portée de la spécification.
Par défaut, la fonction «décalée» émet un message à tous les auditeurs connectés. Certaines analyses de rentabilisation souhaitent une approche plus ciblée, ciblant un groupe défini de clients. Harcon-Radiation vous permet de définir 2 services pour marquer et sélectionner les clients.
Le fichier de configuration peut définir la fonction suivante:
AssignSocket: Fonction Async (événement, termes, res, socket) {return 'ok'}
La fonction «AssignSocket» est appelée étape finale de chaque traitement de message, ce qui donne la possibilité de marquer la prise client actuelle est nécessaire comme le démontre l'exemple ci-dessous:
AssignSocket: Fonction Async (événement, termes, res, socket) {if (event === 'Julie.login') socket.name = resreturn 'ok'}
Si un message «Julie.login» a été traité avec succès, le résultat du service sera associé à la prise connectée.
Ce qu'un changement d'état change et les clients doivent être informés, la fonction Identifysockets sera appelée comme suit:
this.shifted ({humeur: 'couler toi, claire'}, 'Claire') ... identifysockets: fonction asynchrone (sockets, cible) {let filtré = [] pour (socket de socket) if (cible === '*' || socket.name === Target ||
La fonction Identifysockets est appelée par la diffusion de fonction interne effectuée par la fonction appelée utilisateur décalée . Le rôle de la fonction Identifysockets est de filtrer les clients pour envoyer les messages. Par défaut, tous les clients WebSocket connectés seront informés.
HARCON-RADIATION vous permet de définir une fonction de bouclier dans le fichier de configuration afin de protéger le système contre l'adressage indésirable ou l'atteinte de zone restreinte:
var harcon = new Harcon ({ ... SHIELD: fonction (division, événement) {return false}})
Si cette fonction renvoie «vrai», le message entrant doit être rejeté avec une erreur: «Le message a été bloqué»
Nimesis est une entité intégrée de la radiation Harcon fournissant un seul service:
Mimic: fonction (entityDef) {
Il accepte les définitions d'entité Harcon comme String et les convertit en définitions d'entité, puis la publie en fonction de sa configuration. Par défaut, tous les services seront également exposés via REST et WebSockets. Serve bien lorsque l'extension dynamique ou la capacité de publier des services à la volée est une exigence. Le Nimesis ne détiendra qu'une définition comme référence. Lorsqu'une nouvelle définition revient, la précédente sera détruite.
L'appel de la fonction «Reshape» supprimera l'entité publiée.
Remarque: Cette fonctionnalité sert des objectifs spéciaux, utilisez-le avec une prudence suffisante.
(La licence MIT)
Copyright (C) 2018 Imre Fazekas
L'autorisation est accordée gratuitement par la présente à toute personne qui obtient une copie de ce logiciel et des fichiers de documentation associés (le "logiciel"), pour traiter le logiciel sans restriction, y compris sans limiter les droits d'utilisation, de copier, de modifier, de fusionner , publier, distribuer, sous-licencier et / ou vendre des copies du logiciel et permettre aux personnes à qui le logiciel est fourni pour le faire, sous réserve des conditions suivantes:
L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation sont inclus dans toutes les copies ou des parties substantielles du logiciel.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas, les auteurs ou les titulaires de droits d'auteur ne seront pas responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de contrat, de délit ou autre, découlant de, hors du logiciel ou de l'utilisation ou d'autres transactions dans le LOGICIEL.
Voir https://github.com/imrefazekas/harcon-diation/issues.