Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Héberger dans NodeJs d’autres langages que JavaScript

Poster un commentaire

En faisant diverses recherches j’ai découvert qu’Owin est l’ancien nom d’un projet appelé maintenant edge.js que vous pouvez découvrir ici:

http://tjanczuk.github.io/edge

 

Ce projet consiste à essayer d’enrichir NodeJs pour y héberger du code venu d’autres langages:

  • les langages .Net
  • T-SQL
  • Powershell
  • Python

 

Edge fournit des passerelles asynchrone de nodejs vers .Net et de .Net vers nodejs.

Il se charge également de réconcilier les deux modèles de thread (.Net est multi-thread, pas nodejs).

Bref du beau boulot!

Une idée que je trouve fascinante car on s’affranchit de la nécessité de compiler (en tout cas en C#), mais on ne perd pas les fantastiques possibilités de débogage de Visual Studio.

 

Le plus simple est d’examiner un exemple. Je ne suis pas allé très loin dans la mesure où pour l’instant j’ai assez peu travaillé sur NodeJs, mais le site du projet propose un HelloWorld, voici une version en français de cet exemple.

 

on a besoin de quoi?

  • Vous devrez disposer de .Net Framework 4.5

http://www.microsoft.com/en-us/download/details.aspx?id=30653

  • Vous devrez aussi installer la dernière version de nodejs
  • vous installez edgejs en entrant la ligne de commande en tant qu’administrateur:
    npm install edge
  • Vous ouvrez un éditeur de texte, oui, oui, note.exe fait l’affaire et saisissez ce code:

var edge = require('edge');

var hello = edge.func(function () {/*
    async (input) => {
        return "CSharp welcomes " + input.ToString();
    }
*/});

hello('Node.js', function (error, result) {
    if (error) throw error;
    console.log(result);
});

  • Vous lancez ensuite en ligne de commande

node sample.js

  • Et il s’affiche:

Capture

Examinons ce code. La première question que je me suis posé, mais comment il sait que c’est C#! La réponse est que c’est le langage par défaut. Si vous voulez du Python par exemple on devrait utiliser une autre surcharge:

var hello = edge.func(‘py’, function () {/*

Apparemment on récupère un conteneur edge que l’on utilise pour créer une méthode JavaScript hello dotée d’un paramètre en entrée d’un côté et encapsuler une méthode C# de l’autre.

Le code C# est bien entendu passé dans une chaîne de commentaire, on ne pourrait évidemment pas le poser tel quel dans un code JavaScript.

Intéressons nous aux conventions d’appel entre la CLR et nodeJs. Dans la documentation on trouve justement ce schéma:

Capture2

Il nous raconte quoi?

Tout d’abord le code .Net doit être appelé avecdélégué dont la signature est:

Func<object,Task<object>>

Une méthode qui attend dont un paramètre quelconque et retourne une Task et un éventuel paramètre de retour (la réponse de la méthode). La méthode doit en outre être décorée de async ce qui explique la dépendance avec .Net 4.5.

La Task sera attachée à la méthode de callback de la méthode JavaScript. Elle pourra renvoyer une instance d’error ou bien le résultat (éventuel) de la méthode .NET.

Le code est donc appelé de façon asynchrone dans cette syntaxe.

 

Toutefois on peut très bien faire un appel synchrone en passant true à la place de la méthode de rappel:


var result = myFunction('Some input', true);

 

Donc rien de très méchant, juste une habitude à prendre.

Dans certains cas on souhaite appeler un code C# un peut plus sophistiqué que <em>Hello World</em> et donc être amené à regretter le confort des classes. Edge propose un support justement.

La classe doit s’appeler Startup et exposer une méthode Invoke. Si je réécris l’exemple précédent:


var edge = require('edge');

var hello = edge.func(function() {/*
    using System.Threading.Tasks;

    public class Startup
    {
        public async Task<object> Invoke(object input)
        {
            return "CSharp welcomes " + input.ToString();
        }
    }
*/});

hello('Node.js', function (error, result) {
    if (error) throw error;
    console.log(result);
});

Le code est simpliste, mais il pourrait facilement s’appuyer sur d’autres internes, des appels à d’autres espaces de noms…

 

Pour l’instant nous avons vus l’usage de code compilé à la volée, mais il est parfaitement possible de faire appel à une librairie toute prête. Vous trouverez des informations ici:

https://github.com/tjanczuk/edge#how-to-integrate-c-code-into-nodejs-code

 

 

 

 

 

 

 

 

 

 

 

https://github.com/tjanczuk/owin

http://tomasz.janczuk.org/2013/03/run-c-and-nodejs-code-in-process-with.html

http://tomasz.janczuk.org/2013/02/hosting-net-code-in-nodejs-applications.html

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s