{"id":18421487,"url":"https://github.com/luisdasartimanhas/npm-package-nodejs-utils-lda","last_synced_at":"2026-03-05T00:16:22.485Z","repository":{"id":257827343,"uuid":"870716489","full_name":"LUISDASARTIMANHAS/npm-package-nodejs-utils-lda","owner":"LUISDASARTIMANHAS","description":"Este projeto tem como fins de criar e abstrair módulos basicos e utilidades para o node js, referencia https://docs.npmjs.com/creating-a-package-json-file","archived":false,"fork":false,"pushed_at":"2026-02-21T01:35:53.000Z","size":1912,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-21T07:30:10.415Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/npm-package-nodejs-utils-lda","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LUISDASARTIMANHAS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-10T14:37:55.000Z","updated_at":"2026-02-21T01:31:35.000Z","dependencies_parsed_at":"2025-02-02T01:19:04.000Z","dependency_job_id":"3ce328b5-4023-4465-8465-f68d77a37d50","html_url":"https://github.com/LUISDASARTIMANHAS/npm-package-nodejs-utils-lda","commit_stats":null,"previous_names":["luisdasartimanhas/npm-package-nodejs-utils-lda","luisdasartimanhas/npm-package-nodejs-utils"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/LUISDASARTIMANHAS/npm-package-nodejs-utils-lda","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LUISDASARTIMANHAS%2Fnpm-package-nodejs-utils-lda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LUISDASARTIMANHAS%2Fnpm-package-nodejs-utils-lda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LUISDASARTIMANHAS%2Fnpm-package-nodejs-utils-lda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LUISDASARTIMANHAS%2Fnpm-package-nodejs-utils-lda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LUISDASARTIMANHAS","download_url":"https://codeload.github.com/LUISDASARTIMANHAS/npm-package-nodejs-utils-lda/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LUISDASARTIMANHAS%2Fnpm-package-nodejs-utils-lda/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29874559,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T21:05:00.265Z","status":"ssl_error","status_checked_at":"2026-02-26T20:57:13.669Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T04:25:51.031Z","updated_at":"2026-02-26T22:17:59.430Z","avatar_url":"https://github.com/LUISDASARTIMANHAS.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# npm-package-nodejs-utils\nEste projeto tem como fins de criar e abstrair módulos basicos e utilidades para o node js\n\nrequires\n.env file\nconfig.json file\ndata folder\n\nautomatic create requires folders and files.\nautomatic generation of AES + RSA KEYS FOR ENCRYPTION\n\n## Functions\n[FUNCTIONS](./functionsList.md)\n\n## self-hosted status dashboard\n\nThe dashboard uses the /status route, automatically created with the function StatusDashboard(app). This means you can also use the endpoint, but don't overwrite it.\n\n// PT-BR\n\nO dashboard utiliza a rota /status, criado automaticamente com function StatusDashboard(app), isso significa que voce tambem pode usar o endpoint mas não o sobrescreva\n\n![StatusDashboard - app](./StatusDashboard%20-%20app.png)\n\nEste arquivo implementa um canal criptográfico seguro no nível da aplicação, funcionando como um mini-TLS customizado, porém controlado totalmente por código.\nUsa padrões modernos e seguros\n\n- RSA-OAEP com SHA-256 (correto)\n\n- AES-256-GCM (estado da arte)\n\n- Proteção contra replay\n\n- Separação clara de responsabilidades\n\n\n### Casos de uso reais\n\n  - APIs seguras entre servidores\n\n  - Comunicação cliente ↔ backend sensível\n\n  - Sistemas financeiros\n\n  - Troca de credenciais\n\n  - Licenciamento de software\n\n  - Autenticação forte sem TLS customizado\n\n  - Comunicação entre containers isolados\n\n# usage\n```js\nimport express from 'express';\nimport { encryptedPayloadMiddleware } from 'npm-package-nodejs-utils-lda';\n\nconst app = express();\napp.use(express.json());\n\napp.post('/secure-endpoint', encryptedPayloadMiddleware, (req, res) =\u003e {\n  res.json({ received: req.decryptedBody });\n});\n\napp.listen(3000, () =\u003e console.log('Servidor rodando na porta 3000'));\n```\n\n# client mode\n\n🔑 Crypto Client Implementation (Front-end/Node.js)\nPara que o cliente (browser, React, ou outro servidor) possa se comunicar com segurança, ele deve:\n\nBuscar a chave RSA pública do servidor (/public-keys/public_key.pem).\n\nGerar uma chave AES efêmera.\n\nCriptografar a chave AES com a chave RSA pública (Key Exchange).\n\nCriptografar o payload da mensagem com a chave AES (Data Encryption).\n\nEnviar o pacote completo (AES key, IV, AuthTag, Timestamp, Nonce) ao endpoint seguro.\n\nExemplo de Código do Lado do Cliente (Browser/Web Crypto API)\n\n```js\n// crypto_client.js (Implementação de referência)\n\n// 1. Defina a URL da chave pública (deve ser a rota que você expôs)\nconst PUBLIC_KEY_URL = '/public-keys/public_key.pem';\nconst API_URL = '/secure-endpoint';\n\n/**\n * Converte um buffer para string Base64 (Web-Safe)\n * @param {ArrayBuffer} buffer\n * @returns {string} Base64 Web-Safe string.\n */\nfunction arrayBufferToBase64(buffer) {\n    let binary = '';\n    const bytes = new Uint8Array(buffer);\n    for (let i = 0; i \u003c bytes.byteLength; i++) {\n        binary += String.fromCharCode(bytes[i]);\n    }\n    return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Busca e importa a chave RSA pública do servidor.\n * @returns {Promise\u003cCryptoKey\u003e} Chave RSA importada.\n */\nasync function getPublicKey() {\n    const response = await fetch(PUBLIC_KEY_URL);\n    if (!response.ok) throw new Error('Falha ao buscar chave pública do servidor.');\n    \n    const pem = await response.text();\n    \n    // Remove cabeçalho e rodapé PEM e trata Base64\n    const base64 = pem\n        .replace('-----BEGIN PUBLIC KEY-----', '')\n        .replace('-----END PUBLIC KEY-----', '')\n        .replace(/\\s/g, ''); \n        \n    const binaryDer = Uint8Array.from(atob(base64), c =\u003e c.charCodeAt(0));\n    \n    // Importa a chave pública para a Web Crypto API\n    return crypto.subtle.importKey(\n        'spki',\n        binaryDer,\n        {\n            name: \"RSA-OAEP\",\n            hash: \"SHA-256\",\n        },\n        true,\n        [\"wrapKey\"]\n    );\n}\n\n/**\n * Criptografa o payload para ser enviado ao servidor.\n * @param {object} data - O objeto JSON a ser criptografado.\n * @returns {Promise\u003cobject\u003e} O payload criptografado pronto para envio.\n */\nexport async function encryptAndSend(data) {\n    const rsaPublicKey = await getPublicKey();\n\n    // 1. Gerar Chave AES-256-GCM (Chave Secreta Efêmera)\n    const aesKey = await crypto.subtle.generateKey(\n        { name: \"AES-GCM\", length: 256 },\n        true,\n        [\"encrypt\", \"decrypt\", \"wrapKey\", \"unwrapKey\"]\n    );\n\n    // 2. Criptografar (Wrap) a Chave AES com a Chave RSA Pública (RSA-OAEP)\n    const encryptedKeyBuffer = await crypto.subtle.wrapKey(\n        \"raw\",\n        aesKey,\n        rsaPublicKey,\n        { name: \"RSA-OAEP\" }\n    );\n\n    // 3. Criptografar o Payload (AES-256-GCM)\n    const iv = crypto.getRandomValues(new Uint8Array(12)); // Initialization Vector (IV)\n    const plaintext = JSON.stringify(data);\n    const encodedData = new TextEncoder().encode(plaintext);\n    \n    const cipherBuffer = await crypto.subtle.encrypt(\n        { name: \"AES-GCM\", iv: iv },\n        aesKey,\n        encodedData\n    );\n\n    // O AES-GCM anexa o AuthTag ao final do ciphertext\n    const authTagLength = 16; // 16 bytes para GCM\n    const encryptedDataBuffer = cipherBuffer.slice(0, cipherBuffer.byteLength - authTagLength);\n    const authTagBuffer = cipherBuffer.slice(cipherBuffer.byteLength - authTagLength);\n\n    // Gerar Timestamp e Nonce para Proteção Anti-Replay\n    const timestamp = Date.now();\n    const nonce = arrayBufferToBase64(crypto.getRandomValues(new Uint8Array(16)));\n\n    // 4. Preparar o Pacote Final\n    const payload = {\n        encryptedData: arrayBufferToBase64(encryptedDataBuffer),\n        encryptedKey: arrayBufferToBase64(encryptedKeyBuffer),\n        iv: arrayBufferToBase64(iv.buffer),\n        authTag: arrayBufferToBase64(authTagBuffer),\n        timestamp: timestamp,\n        nonce: nonce\n    };\n\n    // 5. Enviar para o Servidor\n    const response = await fetch(API_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(payload)\n    });\n    \n    return response.json();\n}\n\n// Exemplo de uso:\n/*\nencryptAndSend({ nome: \"Luis das Artimanhas\", valor: 500.00 })\n    .then(res =\u003e console.log(\"Resposta do Servidor:\", res))\n    .catch(err =\u003e console.error(\"Erro na comunicação segura:\", err));\n*/\n```\n\n***\n\n# user system\n```js\ninsertUser(name,userdata);\nreturn userdata saved\nselectUser(ID);\nreturn userdata\nusersList();\nreturn users ID,name\ndeleteUser(ID);\nalterUser(ID, name, newUserData);\ndisableUser(ID);\nreactivateUser(ID);\n```\n\n# STORAGE\n\nExpress (ESM)\n\n```js\nimport express from \"express\";\nimport { saveFile, saveBot } from \"npm-package-nodejs-utils-lda\";\n\nconst app = express();\n\napp.post(\"/upload/page\", saveFile.single(\"file\"), (req, res) =\u003e {\n  res.json({ ok: true, file: req.file });\n});\n\napp.post(\"/upload/bot\", saveBot.single(\"file\"), (req, res) =\u003e {\n  res.json({ ok: true, file: req.file });\n});\n```\n\n# mongo DB\n```js\nmongoConnect(connectionString)\n\n// SET 'MONGO_CONNECTION_STRING' VARIABLE IN .ENV FILE FOR SECURE AND AUTOMATIC CONNECTION\nmongoConnect()\n\n// connection = await mongoConnect(connectionString);\nselect(connection, database, table)\nreturn all data of selected table\n\ninsert(connection, database, table, data)\n\nreturn mongoClient or connection\n```\n\n# AUTH\n```js\nconst { requestAuthCode } = require(\"npm-package-nodejs-utils-lda\");\n\n/**\n * POST /api/auth/request-code\n * Body: { email: string }\n */\nrouter.post(\"/request-code\", async (req, res) =\u003e {\n  try {\n    const { email } = req.body;\n\n    if (!email) {\n      return res.status(400).json({ error: \"Email é obrigatório\" });\n    }\n\n    await requestAuthCode(email);\n\n    return res.status(200).json({\n      success: true,\n      message: \"Código enviado para o email\",\n    });\n  } catch (err) {\n    console.error(err);\n    return res.status(500).json({\n      error: \"Erro ao enviar código\",\n    });\n  }\n});\n\nmodule.exports = router;\n```\n\n## verify codes\n```js\nconst { verifyAuthCode } = require(\"npm-package-nodejs-utils-lda\");\n\napp.post(\"/api/auth/verify-code\", async (req, res) =\u003e {\n  try {\n    const { email, code } = req.body;\n\n    await verifyAuthCode(email, code);\n\n    res.json({ success: true });\n  } catch (err) {\n    res.status(401).json({ error: err.message });\n  }\n});\n```\n\n## Generals Usage\n\n````js\nimport { fopen, fwrite, generateToken, fetchGet } from \"npm-package-nodejs-utils-lda\";\nconst filePath = \"database.json\"\n// Usando as funções\nconst data = fopen(filePath);\n\ndata.push(\"X\");\n\nfwrite(filePath, data);\nconst token = generateToken();\nfetchGet(\"https://example.com\",null, (onError,data)=\u003e{\n    if(onError){\n        res.send(error);\n    }\n    res.send(data);\n});\n\n\napp.get(\"/baixar\", (req, res) =\u003e {\n  const fileUrl = \"https://exemplo.com/arquivo.zip\"; // URL do arquivo\n\n  fetchDownloadStream(fileUrl, (err, fileStream) =\u003e {\n    if (err) {\n      return res.status(500).send(\"Erro ao baixar o arquivo.\");\n    }\n\n    // Define o cabeçalho para download\n    res.setHeader(\"Content-Disposition\", 'attachment; filename=\"arquivo.zip\"');\n    res.setHeader(\"Content-Type\", \"application/octet-stream\");\n\n    // Envia o stream do arquivo para o cliente\n    fileStream.pipe(res);\n  });\n});\n\n\n# WSChat\n\n## With Express (recommended)\n\nIf you already have an Express server, just pass the app instance to WSChat:\n\n````js\nimport express from \"express\";\nimport WSChat from \"./WSchat.lib.mjs\"; // or require() for CommonJS\n\nconst app = express();\n\nconst server = WSChat(app, {\n  welcomeMessage: \"Hello! Welcome to the chat.\"\n});\n\nserver.listen(3000, () =\u003e {\n  console.log(\"Server running on port 3000\");\n});\n````\n\nThis creates the HTTP + WebSocket server using the same Express server.\n\n## Without Express (standalone WebSocket server)\n\nIf you want to run WSChat alone, without Express:\n\n````js\nimport WSChat from \"./WSchat.lib.mjs\";\n\nWSChat(null, { port: 8080 }); // starts HTTP + WS server on port 8080\n````\n\n---\n\n## Options\n\nThe second argument is an optional object with the following properties:\n\n````js\n{\n  port: 8080,               // Number - Port to listen on if WSChat creates its own HTTP server (default 8080)\n  welcomeMessage: \"Welcome to WSChat!\" // String - Message sent to clients immediately after connection\n}\n````\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluisdasartimanhas%2Fnpm-package-nodejs-utils-lda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluisdasartimanhas%2Fnpm-package-nodejs-utils-lda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluisdasartimanhas%2Fnpm-package-nodejs-utils-lda/lists"}