{"id":20612876,"url":"https://github.com/richytong/presidium","last_synced_at":"2025-04-15T07:09:20.118Z","repository":{"id":40415659,"uuid":"307195267","full_name":"richytong/presidium","owner":"richytong","description":"A library for creating web services","archived":false,"fork":false,"pushed_at":"2025-04-04T16:22:17.000Z","size":605,"stargazers_count":7,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-12T19:13:33.477Z","etag":null,"topics":["aws","aws-sdk","docker","docker-swarm","dynamodb","dynamodb-streams","elasticsearch","http","kinesis","mongodb","redis","s3","types","web","websocket"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/richytong.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2020-10-25T21:22:52.000Z","updated_at":"2025-04-04T16:22:21.000Z","dependencies_parsed_at":"2023-11-21T00:42:54.443Z","dependency_job_id":"693edcae-afe8-44c4-ba85-5b8c67b9e54e","html_url":"https://github.com/richytong/presidium","commit_stats":{"total_commits":606,"total_committers":1,"mean_commits":606.0,"dds":0.0,"last_synced_commit":"c81b8598f03346b8dde7064bc3110bf1af168973"},"previous_names":["richytong/servicio"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richytong%2Fpresidium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richytong%2Fpresidium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richytong%2Fpresidium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richytong%2Fpresidium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/richytong","download_url":"https://codeload.github.com/richytong/presidium/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248824681,"owners_count":21167345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["aws","aws-sdk","docker","docker-swarm","dynamodb","dynamodb-streams","elasticsearch","http","kinesis","mongodb","redis","s3","types","web","websocket"],"created_at":"2024-11-16T11:08:12.199Z","updated_at":"2025-04-15T07:09:20.113Z","avatar_url":"https://github.com/richytong.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Presidium\n![Node.js CI](https://github.com/richytong/presidium/workflows/Node.js%20CI/badge.svg)\n[![codecov](https://codecov.io/gh/richytong/presidium/branch/master/graph/badge.svg)](https://codecov.io/gh/richytong/presidium)\n[![npm version](https://img.shields.io/npm/v/presidium.svg?style=flat)](https://www.npmjs.com/package/presidium)\n\nA library for creating web services.\n\n## Handle Http\n```javascript\nconst { HttpServer, Http } = require('presidium')\n\nnew HttpServer((request, response) =\u003e {\n  response.writeHead(200, { 'Content-Type': 'application/json' })\n  response.write(JSON.stringify({ greeting: 'Hello World' }))\n  response.end()\n}).listen(3000)\n\nconst http = new Http('http://localhost:3000/')\n\nhttp.get('/')\n  .then(response =\u003e response.json())\n  .then(console.log) // { greeting: 'Hello World' }\n```\n\n## Handle WebSocket\n```javascript\nconst { WebSocketServer, WebSocket } = require('presidium')\n\nnew WebSocketServer(socket =\u003e {\n  socket.on('message', message =\u003e {\n    console.log('Got message:', message)\n  })\n  socket.on('close', () =\u003e {\n    console.log('Socket closed')\n  })\n}).listen(1337)\n\n\nconst socket = new WebSocket('ws://localhost:1337/')\nsocket.addEventListener('open', function (event) {\n  socket.send('Hello Server!')\n})\nsocket.addEventListener('message', function (event) {\n  console.log('Message from server:', event.data)\n})\n```\n\n## CRUD and Query DynamoDB\n```javascript\nconst { DynamoTable, DynamoIndex } = require('presidium')\n\nconst awsCreds = {\n  accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n  region: process.env.AWS_REGION,\n}\n\n;(async function() {\n  const myTable = new DynamoTable({\n    name: 'my-table',\n    key: [{ id: 'string' }],\n    ...awsCreds,\n  })\n  const myIndex = new DynamoIndex({\n    table: 'my-table',\n    key: [{ name: 'string' }, { age: 'number' }],\n    ...awsCreds,\n  })\n  const myStream = new DynamoStream({\n    table: 'my-table',\n    ...awsCreds,\n  })\n\n  await myTable.ready\n  await myIndex.ready\n  await myStream.ready\n\n  await myTable.putItem({ id: '1', name: 'George' })\n  await myTable.updateItem({ id: '1' }, { age: 32 })\n  console.log(\n    await myTable.getItem({ id: '1' }),\n  ) // { Item: { id: { S: '1' }, ... } }\n\n  console.log(\n    await myIndex.query('name = :name AND age \u003c :age', {\n      name: 'George',\n      age: 33,\n    }),\n  ) // [{ Items: [{ id: { S: '1' }, ... }, ...] }]\n\n  for await (const record of myStream) {\n    console.log(record) // { dynamodb: { NewImage: {...}, OldImage: {...} }, ... }\n  }\n})()\n```\n\n## Consume Kinesis Streams\n```javascript\nconst { KinesisStream } = require('presidium')\n\nconst awsCreds = {\n  accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n  region: process.env.AWS_REGION,\n}\n\nconst myStream = new KinesisStream({\n  name: 'my-stream',\n  ...awsCreds,\n})\n\n;(async function() {\n  await myStream.ready\n\n  await myStream.putRecord('hey')\n  await myStream.putRecord('hey')\n  await myStream.putRecord('hey')\n\n  for await (const item of myStream) {\n    console.log(item) /*\n    {\n      SequenceNumber: '49614...',\n      ApproximateArrivalTimestamp: 2021-01-12T16:01:24.432Z,\n      Data: \u003cBuffer ...\u003e, // hey\n      PartitionKey: 'hey',\n    }\n    {\n      SequenceNumber: '...',\n      SequenceNumber: '49614...',\n      ApproximateArrivalTimestamp: 2021-01-12T16:01:24.432Z,\n      Data: \u003cBuffer ...\u003e, // hey\n      PartitionKey: 'hey',\n    }\n    {\n      SequenceNumber: '49614...',\n      ApproximateArrivalTimestamp: 2021-01-12T16:01:24.432Z,\n      Data: \u003cBuffer ...\u003e, // hey\n      PartitionKey: 'hey',\n    }\n    */\n  }\n})\n```\n\n## Upload to S3\n```javascript\nconst { S3Bucket } = require('presidium')\n\nconst awsCreds = {\n  accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n  region: process.env.AWS_REGION,\n}\n\nconst myBucket = new S3Bucket({\n  name: 'my-bucket',\n  ...awsCreds,\n})\n\n;(async function () {\n  await myBucket.ready\n\n  await myBucket.putObject('some-key', '{\"hello\":\"world\"}', {\n    ContentType: 'application/json',\n  })\n  console.log(\n    await myBucket.getObject('some-key'),\n  ) // { Etag: ..., Body: '{\"hello\":\"world\"}', ContentType: 'application/json' }\n  await myBucket.deleteAllObjects()\n  await myBucket.delete()\n})()\n```\n\n## Build and Push Docker Images\n\u003e Stop using --build-arg for that npm token\n```javascript\nconst { DockerImage } = require('presidium')\n\nconst myImage = new DockerImage('my-app:1.0.0')\n\nconst buildStream = myImage.build(__dirname, {\n  ignore: ['.github', 'node_modules'],\n  archive: {\n    Dockerfile: `\nFROM node:15-alpine\nWORKDIR /opt\nCOPY . .\nRUN echo //registry.npmjs.org/:_authToken=${myNpmToken} \u003e .npmrc \\\n  \u0026\u0026 npm i \\\n  \u0026\u0026 rm .npmrc\n  \u0026\u0026 rm Dockerfile\nEXPOSE 8080\nCMD [\"npm\", \"start\"]\n    `,\n  },\n})\n\nbuildStream.on('end', () =\u003e {\n  const pushStream = myImage.push('my-registry.io')\n  pushStream.pipe(process.stdout)\n})\nbuildStream.pipe(process.stdout)\n```\n\n## Execute Docker Containers\n```javascript\nconst { DockerContainer } = require('presidium')\n\nconst container = new DockerContainer({\n  image: 'node:15-alpine',\n  env: { FOO: 'foo' },\n  cmd: ['node', '-e', 'console.log(process.env.FOO)'],\n  rm: true,\n})\n\ncontainer.run().pipe(process.stdout) // foo\n```\n\n## Deploy Docker Swarm Services\n```javascript\nconst { DockerSwarm, DockerService } = require('presidium')\n\n;(async function() {\n  const mySwarm = new DockerSwarm('eth0:2377')\n  await mySwarm.ready // initiated new docker swarm\n\n  const myService = new DockerService({\n    name: 'my-service',\n    image: 'nginx:1.19',\n    publish: { 80: 80 },\n    healthCheck: ['curl', '[::1]'],\n    replicas: 5,\n  })\n  await myService.ready // new nginx service is up running\n})()\n```\n\n# Support\n * minimum Node.js version: 16\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frichytong%2Fpresidium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frichytong%2Fpresidium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frichytong%2Fpresidium/lists"}