JSPM

  • Created
  • Published
  • Downloads 16
  • Score
    100M100P100Q74319F
  • License Apache-2.0

a module for http/s and ws/s servers

Package Exports

  • saml.servercore
  • saml.servercore/ServerCore.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (saml.servercore) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

ServerCore

Hola! soy diegofmo0802.
Como comente anteriormente en mi perfil, ServerCore permitirá:

  • Crear servidores HTTP y HTTPS.
  • En proceso Sistema de plantillas.
  • Gestionar conexiones WebSocket.
  • Gestionar negociaciones de WebRTC.
  • Gestionar notificaciones WebPush.

Es posible que algunos de los puntos anteriores se subdividan en proyectos diferentes
o que se cree un gestor de paquetes para implementar las funcionalidades dentro del mismo

Sobre el proyecto

Actualmente tengo en local una copia del proyecto con varias de las funcionalidades
este comenzó como un proyecto personal y con fines de práctica de pensamiento lógico
por lo tanto no tiene las mejores prácticas ni la mejor documentación, sin embargo
publicaré el código de esta manera e iré modificando para corregir esto.

mpm install saml.servercore

Futuras correcciones

  • Documentar clases y funciones para intellisense.
  • Cambiar los nombres de variables, funciones, clases y descripciones a inglés.
  • en proceso Crear documentación para enseñar a usar el módulo.
  • en proceso Buscar y corregir malas practicas.

Esto es todo por el momento, diegofmo0802 se retira.

Documentación

Primero debemos instalar el modulo usando

mpm install saml.servercore

También es necesario que en tu package.json este el proyecto como type: module

{
  "name": "my-project",
  "main": "index.js",
  "type": "module"
}

Una ves tengas ServerCore en tu proyecto y lo hayas configurado como modulo debes importarlo
-->

  • Si en tu package.json tienes la propiedad "type": "module":
    import ServerCore from 'saml.servercore';
  • Si no tienes esta propiedad usa:
    //Actualmente no esta soportado, en futuras versiones se ampliara su compatibilidad

Servidor HTTP

Para crear un servidor HTTP puedes hacerlo de diferentes maneras:

[!NOTE] Debes haber importado el modulo primero.

  • Solo pasando el puerto

    const Server = new ServerCore(80);
  • Pasando Puerto y Host

    const Server = new ServerCore(80, 'MiDominio.com');

Servidor HTTPS

[!NOTE]

  • Debes tener un certificado ssl (la clave publica y privada).
  • Si no quieres especificar un host usa null.
  • Actualmente se inicia el servidor HTTP y HTTPS a la vez en este caso esto se corregirá y se pondrá como característica opcional en futuras versiones.
const Server = new ServerCore(80, null, {
  Public: 'Cert/MiDominio.pem',    //El archivo con la clave publica       (Obligatorio)
  Private: 'Cert/MiDominio.key',   //El archivo con la  clave privada      (Obligatorio)
  Port: 443                        //El puerto donde se abrirá el servidor (Opcional)
});

Agregar enrutador

En ServerCore existen 4 clases de enrutador:

Tipo Descripción
Folder Comparte una carpeta y sus sub-carpetas
File Comparte un único archivo
Action Te permite trabajar completamente con las solicitudes
WebSocket Permite manejar conexiones WebSocket en esa ruta

Los Métodos aceptados actualmente son:

Método Descripción
GET El método de petición GET.
POST El método de petición POST.
PUT El método de petición PUT.
DELETE El método de petición DELETE.
ALL Todos los métodos anteriormente mencionados.

Tipos de cobertura:

Cobertura Descripción
Complete Toma todas las sub-rutas y no se podrán usar
Partial Se toma solo esa ruta, las sub-rutas pueden ser usadas en otra cosa

Carpeta

Comparte una carpeta y todo su contenido tanto archivos como sub-carpetas

[!WARNING]

  • ⚠️No compartas la raíz de tu proyecto, ya que esto daría acceso a TODO su contenido.
    • Datos privados como las llaves privadas de tus certificados.
    • Contraseñas a bases de datos que estén en los archivos js del lado del servidor.
    • Tokens de seguridad y en general cualquier otro dato
  • Esto tomara la ruta que le asignes de forma completa Ejemplo: si le asignas la ruta /src tomaría todas las sub-rutas como /src/estilos

Para añadir este tipo de regla usa:

Server.AddRules({
  Method: 'ALL', Url: '/',
  Type: 'Folder', Options: {
    Source: './src'
  }
});

Server.AddRules({
  Method: 'ALL', Url: '/',
  Type: 'Folder', Options: {
    Source: './global'
  }
});

Archivo

Comparte un archivo especifico

Server.AddRules({
  Method: 'GET', Url: '/',
  Type: 'File', Options: {
    Coverage: 'Complete',
    Source: './'
  }
});

Server.AddRules({
  Method: 'GET', Url: '/',
  Type: 'File', Options: {
    Coverage: 'Partial',
    Source: './'
  }
});

Acción

Te permite tener total control sobre esas peticiones:

Server.AddRules({
  Method: 'GET', Url: '/',
  Type: 'Action', Options: {
    Coverage: 'Partial',
    Action: (Petición, Respuesta) => {
      if (Petición.Cookies.has('User_ID')) {
        Respuesta.Enviar("El User_ID que estas usando es:" + Petición.Cookies.get('User_ID'));
      } else {
        Respuesta.EnviarArchivo('./ErrorUsuario.html');
      }
    }
  }
});

WebSocket

Esto te permite gestionar una conexión WebSocket completa:

const Conexiones = new Set();

Server.AddRules({
  Method: 'GET', Url: '/Test/WS-Chat',
  Type: 'WebSocket', Options: {
    Coverage: 'Partial',
    Action: (Petición, WebSocket) => {
      console.log('[WS] CM: Conexión nueva')
      Conexiones.forEach((Usuario) => Usuario.Send("Un usuario se conecto"));
      Conexiones.add(WebSocket);
      WebSocket.on('Finish', () => Conexiones.delete(WebSocket));
      WebSocket.on('Error', (Error) => console.log('[WS-Error]:', Error));
      WebSocket.on('Message', (Info, Datos) => {
        //console.log(Info.OPCode);
        if (Info.OPCode == 1) {
          console.log('[WS] MSS:', Datos.toString());
          Conexiones.forEach((Usuario) => {
            if (Usuario !== WebSocket) Usuario.Send(Datos.toString());
          });
        } else if (Info.OPCode == 8) {
          Conexiones.forEach((Usuario) => Usuario.Send("Un usuario se desconecto"));
        }
      });
    }
  }
});