Compare commits

...

6 Commits

Author SHA1 Message Date
williamlardier 29cc14c7e5
progress 2022-11-24 10:44:31 +01:00
williamlardier 11cd9ed40e
ARTESCA-6419: standardize exports 2 2022-11-23 17:49:43 +01:00
williamlardier b080ddd542
ARTESCA-6419: standardize exports 2022-11-23 17:46:23 +01:00
williamlardier f4a7c3a968
ARTESCA-6419: create base abstraction layers for http agent 2022-11-23 16:19:38 +01:00
williamlardier ce3264dd63
ARTESCA-6419: add github actions files for tests and release 2022-11-23 16:15:15 +01:00
williamlardier e5c2fa6cdb
ARTESCA-6419: initialize repository 2022-11-23 16:11:55 +01:00
13 changed files with 1808 additions and 0 deletions

23
.eslintrc.json Normal file
View File

@ -0,0 +1,23 @@
{
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"ignorePatterns": ["build/**/*.js", "build/**/*.d.ts"],
"overrides": [
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
}
}

43
.github/workflows/release.yaml vendored Normal file
View File

@ -0,0 +1,43 @@
name: release
on:
workflow_dispatch:
inputs:
tag:
description: 'Tag to be released'
required: true
jobs:
verify-release:
name: Verify if tag is valid
runs-on: ubuntu-latest
steps:
- name: Checkout CTST repository
uses: 'actions/checkout@v3'
with:
ref: ${{ github.ref }}
- name: Fetch tags
run: git fetch --tags
- name: 'Check if tag was already created'
shell: bash
run: >
git show-ref --tags v${{ github.event.inputs.tag }} --quiet \
&& exit 1 || exit 0
release:
name: Release
runs-on: ubuntu-latest
needs:
- verify-release
steps:
- name: Create Release
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
name: Release ${{ github.event.inputs.tag }}
tag_name: v${{ github.event.inputs.tag }}
generate_release_notes: true
target_commitish: ${{ github.sha }}

36
.github/workflows/tests.yaml vendored Normal file
View File

@ -0,0 +1,36 @@
name: Tests
on:
push:
branches:
- 'master/**'
- 'feature/**'
- 'documentation/**'
- 'improvement/**'
- 'bugfix/**'
- 'w/**'
- 'q/**'
- 'hotfix/**'
- 'task/**'
- 'release/**'
- 'main'
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install deps
run: sudo apt-get update -q
- uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install Yarn
run: npm install -g yarn
- name: install dependencies
run: yarn install --frozen-lockfile
- name: run lint
run: yarn run eslint
- name: run build
run: yarn build

68
.gitignore vendored Normal file
View File

@ -0,0 +1,68 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
#reports
reports/*.html
reports/*.json
#build
build
#local files
*.loc

2
.prettierignore Normal file
View File

@ -0,0 +1,2 @@
# Ignore artifacts:
build

11
.prettierrc Normal file
View File

@ -0,0 +1,11 @@
{
"arrowParens": "avoid",
"bracketSpacing": true,
"endOfLine": "auto",
"printWidth": 120,
"semi": true,
"singleQuote": true,
"tabWidth": 4,
"trailingComma": "all",
"useTabs": false
}

10
index.ts Normal file
View File

@ -0,0 +1,10 @@
import httpAgent from "./lib/http-agent";
import httpsAgent from "./lib/https-agent";
export const http = {
Agent: httpAgent,
};
export const https = {
Agent: httpsAgent,
};

6
lib/config/default.ts Normal file
View File

@ -0,0 +1,6 @@
export default interface clientConfigurationDefault {
/**
* Maximum Socket Number: true if TCP session reuse must be enabled
*/
maxSockets?: boolean;
}

39
lib/http-agent.ts Normal file
View File

@ -0,0 +1,39 @@
import * as http from 'http';
import clientConfigurationDefault from './config/default';
/**
* @class ClientHttp
* Abstracts the native http.Agent class to enforce common
* networking configuration across components.
*/
export default class ClientHttp extends http.Agent {
/**
* The maximum socket configuration defaults to 50.
*/
private static maxSocketsConfiguration = Number(process.env.MAX_SOCKETS) || 50;
/**
* Constructor for the ClientHttp class
*
* @param opts - Custom HTTP Agent options
* @param config - user-defined default configuration du apply
*/
constructor(
opts?: http.AgentOptions,
config: clientConfigurationDefault = {
maxSockets: true,
},
) {
// Enforce TCP session reuse configuration, unless explicitely specified.
const defaultConfigurations: http.AgentOptions = {};
if (config.maxSockets) {
defaultConfigurations.keepAlive = true;
defaultConfigurations.maxSockets = ClientHttp.maxSocketsConfiguration;
defaultConfigurations.maxFreeSockets = ClientHttp.maxSocketsConfiguration;
}
super({
...opts,
...defaultConfigurations,
});
}
}

39
lib/https-agent.ts Normal file
View File

@ -0,0 +1,39 @@
import * as https from 'https';
import clientConfigurationDefault from './config/default';
/**
* @class ClientHttps
* Abstracts the native https.Agent class to enforce common
* networking configuration across components.
*/
export default class ClientHttps extends https.Agent {
/**
* The maximum socket configuration defaults to 50.
*/
private static maxSocketsConfiguration = Number(process.env.MAX_SOCKETS) || 50;
/**
* Constructor for the ClientHttps class
*
* @param opts - Custom HTTPs Agent options
* @param config - user-defined default configuration du apply
*/
constructor(
opts?: https.AgentOptions,
config: clientConfigurationDefault = {
maxSockets: true,
},
) {
// Enforce TCP session reuse configuration, unless explicitely specified.
const defaultConfigurations: https.AgentOptions = {};
if (config.maxSockets) {
defaultConfigurations.keepAlive = true;
defaultConfigurations.maxSockets = ClientHttps.maxSocketsConfiguration;
defaultConfigurations.maxFreeSockets = ClientHttps.maxSocketsConfiguration;
}
super({
...opts,
...defaultConfigurations,
});
}
}

33
package.json Normal file
View File

@ -0,0 +1,33 @@
{
"name": "arsenal-networking",
"version": "1.0.0",
"description": "A utility library for networking",
"main": "build/index.js",
"repository": "git@github.com:scality/arsenal-networking.git",
"author": "Scality Inc.",
"license": "Apache-2.0",
"scripts": {
"build": "tsc --build tsconfig.json",
"format": "prettier --write \"**/*.{ts,tsx,css,html}\" ",
"prepare": "yarn build || true",
"eslint": "eslint ./ --ext .js,.ts,.tsx",
"eslint-fix": "eslint ./ --ext .js,.ts,.tsx --fix",
"eslint-init": "eslint --init",
"lint": "eslint ./ --ext .js,.ts,.tsx --format visualstudio --no-color --max-warnings 10 --report-unused-disable-directives"
},
"dependencies": {
"@types/node": "^18.11.9"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.44.0",
"@typescript-eslint/parser": "^5.44.0",
"eslint": "^8.28.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-scality": "git+https://github.com/scality/Guidelines#8.2.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.2.1",
"prettier": "^2.8.0",
"typescript": "^4.9.3"
}
}

22
tsconfig.json Normal file
View File

@ -0,0 +1,22 @@
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"rootDir": "./",
"resolveJsonModule": true,
"allowJs": true,
"checkJs": false,
"outDir": "build",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"declaration": true,
"noImplicitAny": false,
"noEmitOnError": false,
"sourceMap": true,
"declarationMap": true
},
"include": ["index.ts", "lib"],
"exclude": ["node_modules/*"],
"compileOnSave": true
}

1476
yarn.lock Normal file

File diff suppressed because it is too large Load Diff