fix(ci): Update CI workflows, build scripts, and export configuration
This commit is contained in:
66
.gitea/workflows/default_nottags.yaml
Normal file
66
.gitea/workflows/default_nottags.yaml
Normal file
@ -0,0 +1,66 @@
|
||||
name: Default (not tags)
|
||||
|
||||
on:
|
||||
push:
|
||||
tags-ignore:
|
||||
- '**'
|
||||
|
||||
env:
|
||||
IMAGE: code.foss.global/host.today/ht-docker-node:npmci
|
||||
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git
|
||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||
|
||||
jobs:
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install pnpm and npmci
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @ship.zone/npmci
|
||||
|
||||
- name: Run npm prepare
|
||||
run: npmci npm prepare
|
||||
|
||||
- name: Audit production dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --prod
|
||||
continue-on-error: true
|
||||
|
||||
- name: Audit development dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --dev
|
||||
continue-on-error: true
|
||||
|
||||
test:
|
||||
if: ${{ always() }}
|
||||
needs: security
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Test stable
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm test
|
||||
|
||||
- name: Test build
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm build
|
124
.gitea/workflows/default_tags.yaml
Normal file
124
.gitea/workflows/default_tags.yaml
Normal file
@ -0,0 +1,124 @@
|
||||
name: Default (tags)
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
env:
|
||||
IMAGE: code.foss.global/host.today/ht-docker-node:npmci
|
||||
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git
|
||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||
|
||||
jobs:
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @ship.zone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Audit production dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --prod
|
||||
continue-on-error: true
|
||||
|
||||
- name: Audit development dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --dev
|
||||
continue-on-error: true
|
||||
|
||||
test:
|
||||
if: ${{ always() }}
|
||||
needs: security
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @ship.zone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Test stable
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm test
|
||||
|
||||
- name: Test build
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm build
|
||||
|
||||
release:
|
||||
needs: test
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @ship.zone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Release
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm publish
|
||||
|
||||
metadata:
|
||||
needs: test
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
continue-on-error: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @ship.zone/npmci
|
||||
npmci npm prepare
|
||||
|
||||
- name: Code quality
|
||||
run: |
|
||||
npmci command npm install -g typescript
|
||||
npmci npm install
|
||||
|
||||
- name: Trigger
|
||||
run: npmci trigger
|
||||
|
||||
- name: Build docs and upload artifacts
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
pnpm install -g @git.zone/tsdoc
|
||||
npmci command tsdoc
|
||||
continue-on-error: true
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -3,7 +3,6 @@
|
||||
# artifacts
|
||||
coverage/
|
||||
public/
|
||||
pages/
|
||||
|
||||
# installs
|
||||
node_modules/
|
||||
@ -17,4 +16,5 @@ node_modules/
|
||||
dist/
|
||||
dist_*/
|
||||
|
||||
# custom
|
||||
#------# custom
|
||||
**/.claude/settings.local.json
|
||||
|
313
changelog.md
Normal file
313
changelog.md
Normal file
@ -0,0 +1,313 @@
|
||||
# Changelog
|
||||
|
||||
## 2025-05-11 - 3.0.8 - fix(ci)
|
||||
Update CI workflows, build scripts, and export configuration
|
||||
|
||||
- Add separate Gitea workflows for tag and non-tag pushes to automate testing, auditing, and release steps
|
||||
- Revise package.json exports and update dependency versions and build scripts for improved module resolution
|
||||
- Enhance tsconfig settings with baseUrl and paths for consistency
|
||||
- Refine source code formatting and adjust test cases for better maintenance
|
||||
|
||||
## 2024-06-06 - 3.0.7 - no notable changes
|
||||
This release contains no detailed changes.
|
||||
|
||||
## 2024-06-06 - 3.0.6 - core
|
||||
A few fixes and updates were made in this release.
|
||||
|
||||
- fix(core): update
|
||||
- update description
|
||||
|
||||
## 2024-05-17 - 3.0.5 - core
|
||||
A minor core fix was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2024-05-17 - 3.0.4 - core
|
||||
This release includes several updates to core files and configuration.
|
||||
|
||||
- fix(core): update
|
||||
- update tsconfig
|
||||
- update npmextra.json: githost
|
||||
- update npmextra.json: githost
|
||||
- update npmextra.json: githost
|
||||
|
||||
## 2023-08-08 - 3.0.3 - core
|
||||
A simple core update was performed.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2023-07-12 - 3.0.2 - core
|
||||
Core updates and a change of organizational scheme were introduced.
|
||||
|
||||
- fix(core): update
|
||||
- switch to new org scheme (x2)
|
||||
|
||||
## 2022-10-26 - 3.0.1 - core
|
||||
A core fix was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2022-07-26 - 3.0.0 - core
|
||||
A minor core update was made.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2022-06-26 - 2.0.44 - core
|
||||
A breaking change switched the module system to esm.
|
||||
|
||||
- BREAKING CHANGE(core): switch to esm
|
||||
|
||||
## 2021-07-21 - 2.0.43 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2021-07-20 - 2.0.42 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2021-07-20 - 2.0.41 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2021-07-20 - 2.0.40 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2021-07-06 - 2.0.39 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-09-08 - 2.0.38 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-09-07 - 2.0.37 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-09-07 - 2.0.36 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-08-02 - 2.0.35 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.34 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.33 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.32 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.31 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.30 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.29 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-11 - 2.0.28 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-08 - 2.0.27 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-08 - 2.0.26 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-08 - 2.0.25 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-08 - 2.0.24 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-07 - 2.0.23 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-05 - 2.0.22 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2020-06-05 - 2.0.21 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-10-22 - 2.0.20 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-10-22 - 2.0.19 - core
|
||||
Dependencies were updated in the core.
|
||||
|
||||
- fix(core): update dependencies
|
||||
|
||||
## 2019-01-30 - 2.0.18 - license
|
||||
License files were updated.
|
||||
|
||||
- fix(license): update license files
|
||||
|
||||
## 2019-01-30 - 2.0.17 - readme
|
||||
A typo in the readme was fixed.
|
||||
|
||||
- fix(readme): fix typo
|
||||
|
||||
## 2019-01-30 - 2.0.16 - readme
|
||||
A typo in the readme was fixed.
|
||||
|
||||
- fix(readme): fix typo
|
||||
|
||||
## 2019-01-28 - 2.0.15 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-01-28 - 2.0.14 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-01-22 - 2.0.13 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-01-22 - 2.0.12 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-01-18 - 2.0.11 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-01-15 - 2.0.10 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2019-01-15 - 2.0.9 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-11-11 - 2.0.8 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-11-04 - 2.0.7 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-11-04 - 2.0.6 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-11-04 - 2.0.5 - api
|
||||
An API improvement was made.
|
||||
|
||||
- fix(api): streamline api
|
||||
|
||||
## 2018-11-04 - 2.0.4 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-11-03 - 2.0.3 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-10-31 - 2.0.2 - core
|
||||
A core update was applied.
|
||||
|
||||
- fix(core): update
|
||||
|
||||
## 2018-10-30 - 2.0.1 - core
|
||||
A new log router was implemented in core.
|
||||
|
||||
- fix(core): implement log router
|
||||
|
||||
## 2018-07-10 - 2.0.0 - core
|
||||
Console enabling was fixed.
|
||||
|
||||
- fix(.enableConsole()): now works
|
||||
|
||||
## 2018-07-10 - 1.0.6 - core
|
||||
A breaking change added a simple defaultLogger to core.
|
||||
|
||||
- BREAKING CHANGE(core): now has simple defaultLogger
|
||||
|
||||
## 2018-07-08 - 1.0.5 - npm
|
||||
Package distribution was fixed.
|
||||
|
||||
- fix(npm): package distribution
|
||||
|
||||
## 2018-06-05 - 1.0.4 - package
|
||||
The package name was updated.
|
||||
|
||||
- fix(package): update package name
|
||||
|
||||
## 2018-06-05 - 1.0.3 - core
|
||||
Several changes were made to update standards and system behavior.
|
||||
|
||||
- fix(core): update to latest standards
|
||||
- system change
|
||||
|
||||
## 2018-01-28 - 1.0.2 - docs
|
||||
Documentation was added to the readme.
|
||||
|
||||
- docs(readme): add readme
|
||||
|
||||
## 2018-01-28 - 1.0.1 - misc
|
||||
Initial cleanup and TypeScript support were introduced.
|
||||
|
||||
- fix(cleanup):
|
||||
- feat(ts): initial
|
||||
|
||||
## 2016-10-15 - 1.0.0 - no notable changes
|
||||
This initial release contains no detailed changes.
|
50
package.json
50
package.json
@ -19,27 +19,48 @@
|
||||
"error tracking",
|
||||
"development tools"
|
||||
],
|
||||
"main": "dist_ts/index.js",
|
||||
"typings": "dist_ts/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./dist_ts/index.js"
|
||||
},
|
||||
"./context": "./dist_ts_context/index.js",
|
||||
"./interfaces": "./dist_ts_interfaces/index.js",
|
||||
"./source-ora": "./dist_ts_source_ora/index.js",
|
||||
"./destination-clickhouse": "./dist_ts_destination_clickhouse/index.js",
|
||||
"./destination-devtools": "./dist_ts_destination_devtools/index.js",
|
||||
"./destination-file": "./dist_ts_destination_file/index.js",
|
||||
"./destination-local": "./dist_ts_destination_local/index.js",
|
||||
"./destination-receiver": "./dist_ts_destination_receiver/index.js",
|
||||
"./receiver": "./dist_ts_receiver/index.js"
|
||||
},
|
||||
"author": "Lossless GmbH",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"test": "(tstest test/)",
|
||||
"build": "(tsbuild --web && tsbundle npm)",
|
||||
"build": "(tsbuild tsfolders --allowimplicitany && tsbundle npm)",
|
||||
"format": "(gitzone format)",
|
||||
"buildDocs": "tsdoc"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@git.zone/tsbuild": "^2.1.66",
|
||||
"@git.zone/tsbundle": "^2.0.8",
|
||||
"@git.zone/tsrun": "^1.2.44",
|
||||
"@git.zone/tstest": "^1.0.77",
|
||||
"@push.rocks/tapbundle": "^5.0.23",
|
||||
"@types/node": "^20.14.2"
|
||||
"@git.zone/tsbuild": "^2.3.2",
|
||||
"@git.zone/tsbundle": "^2.2.5",
|
||||
"@git.zone/tsrun": "^1.3.3",
|
||||
"@git.zone/tstest": "^1.0.96",
|
||||
"@push.rocks/tapbundle": "^6.0.3",
|
||||
"@types/node": "^22.15.17"
|
||||
},
|
||||
"dependencies": {
|
||||
"@api.global/typedrequest-interfaces": "^3.0.19",
|
||||
"@push.rocks/consolecolor": "^2.0.2",
|
||||
"@push.rocks/isounique": "^1.0.4",
|
||||
"@push.rocks/smartlog-interfaces": "^3.0.2"
|
||||
"@push.rocks/smartclickhouse": "^2.0.17",
|
||||
"@push.rocks/smartfile": "^11.2.0",
|
||||
"@push.rocks/smarthash": "^3.0.4",
|
||||
"@push.rocks/smartpromise": "^4.2.3",
|
||||
"@push.rocks/smarttime": "^4.1.1",
|
||||
"@push.rocks/webrequest": "^3.0.37",
|
||||
"@tsclass/tsclass": "^9.2.0",
|
||||
"ora": "^8.2.0"
|
||||
},
|
||||
"files": [
|
||||
"ts/**/*",
|
||||
@ -57,9 +78,16 @@
|
||||
"last 1 chrome versions"
|
||||
],
|
||||
"type": "module",
|
||||
"homepage": "https://code.foss.global/push.rocks/smartlog",
|
||||
"homepage": "https://code.foss.global/push.rocks/smartlog#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://code.foss.global/push.rocks/smartlog.git"
|
||||
},
|
||||
"packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39",
|
||||
"bugs": {
|
||||
"url": "https://code.foss.global/push.rocks/smartlog/issues"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {}
|
||||
}
|
||||
}
|
7164
pnpm-lock.yaml
generated
7164
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
10
readme.md
10
readme.md
@ -30,8 +30,8 @@ const logger = new Smartlog({
|
||||
containerName: 'awesome-container',
|
||||
environment: 'kubernetes-production',
|
||||
runtime: 'node',
|
||||
zone: 'zone x'
|
||||
}
|
||||
zone: 'zone x',
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
@ -76,7 +76,11 @@ class MyCustomLogDestination implements ILogDestination {
|
||||
}
|
||||
}
|
||||
|
||||
const logger = new Smartlog({ logContext: { /* your context */ } });
|
||||
const logger = new Smartlog({
|
||||
logContext: {
|
||||
/* your context */
|
||||
},
|
||||
});
|
||||
logger.addLogDestination(new MyCustomLogDestination());
|
||||
```
|
||||
|
||||
|
0
readme.plan.md
Normal file
0
readme.plan.md
Normal file
9
test/test.context.ts
Normal file
9
test/test.context.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import * as smartlogContext from '../ts_context/index.js';
|
||||
|
||||
tap.test('should correctly export strings from context module', async () => {
|
||||
expect(typeof smartlogContext.standardExport).toEqual('string');
|
||||
expect(smartlogContext.standardExport).toEqual('Hi there! :) This is an exported string');
|
||||
});
|
||||
|
||||
export default tap.start();
|
19
test/test.destination-clickhouse.node.ts
Normal file
19
test/test.destination-clickhouse.node.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogDestinationClickhouse } from '../ts_destination_clickhouse/index.js';
|
||||
import * as smartclickhouse from '@push.rocks/smartclickhouse';
|
||||
|
||||
// Test we can create a destination instance
|
||||
tap.test('should create a ClickHouse destination instance', async () => {
|
||||
// Use mock configuration
|
||||
const clickhouseOptions: smartclickhouse.IClickhouseConstructorOptions = {
|
||||
url: 'defult:@localhost:8123',
|
||||
database: 'test_logs'
|
||||
};
|
||||
|
||||
// Verify we can create an instance
|
||||
// We won't start it to avoid making real connections
|
||||
const clickhouseDestination = new SmartlogDestinationClickhouse(clickhouseOptions);
|
||||
expect(clickhouseDestination).toBeTruthy();
|
||||
});
|
||||
|
||||
export default tap.start();
|
117
test/test.destination-devtools.browser.ts
Normal file
117
test/test.destination-devtools.browser.ts
Normal file
@ -0,0 +1,117 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogDestinationDevtools } from '../ts_destination_devtools/index.js';
|
||||
import * as smartlogInterfaces from '../ts_interfaces/index.js';
|
||||
|
||||
let testDestination: SmartlogDestinationDevtools;
|
||||
let originalConsoleLog: any;
|
||||
let consoleLogCalls: any[] = [];
|
||||
|
||||
// Helper to create log package
|
||||
const createMockLogPackage = (level: smartlogInterfaces.TLogLevel, message: string): smartlogInterfaces.ILogPackage => {
|
||||
return {
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level,
|
||||
message,
|
||||
context: {
|
||||
environment: 'test',
|
||||
runtime: 'chrome'
|
||||
},
|
||||
correlation: {
|
||||
id: '123',
|
||||
type: 'none'
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
// Tests
|
||||
tap.test('should setup test environment', async () => {
|
||||
// Save original console.log
|
||||
originalConsoleLog = console.log;
|
||||
|
||||
// Replace with mock
|
||||
console.log = (...args: any[]) => {
|
||||
consoleLogCalls.push(args);
|
||||
// Don't call original to avoid polluting test output
|
||||
};
|
||||
});
|
||||
|
||||
tap.test('should create a devtools destination instance', async () => {
|
||||
testDestination = new SmartlogDestinationDevtools();
|
||||
expect(testDestination).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('should log error level messages with appropriate styling', async () => {
|
||||
consoleLogCalls = [];
|
||||
|
||||
const logPackage = createMockLogPackage('error', 'Test error message');
|
||||
await testDestination.handleLog(logPackage);
|
||||
|
||||
expect(consoleLogCalls.length).toEqual(1);
|
||||
expect(consoleLogCalls[0][0]).toContain('Error:');
|
||||
expect(consoleLogCalls[0][1]).toContain('background:#000000;color:#800000;');
|
||||
expect(consoleLogCalls[0][2]).toContain('Test error message');
|
||||
});
|
||||
|
||||
tap.test('should log info level messages with appropriate styling', async () => {
|
||||
consoleLogCalls = [];
|
||||
|
||||
const logPackage = createMockLogPackage('info', 'Test info message');
|
||||
await testDestination.handleLog(logPackage);
|
||||
|
||||
expect(consoleLogCalls.length).toEqual(1);
|
||||
expect(consoleLogCalls[0][0]).toContain('Info:');
|
||||
expect(consoleLogCalls[0][1]).toContain('background:#EC407A;color:#ffffff;');
|
||||
expect(consoleLogCalls[0][2]).toContain('Test info message');
|
||||
});
|
||||
|
||||
tap.test('should log ok level messages with appropriate styling', async () => {
|
||||
consoleLogCalls = [];
|
||||
|
||||
const logPackage = createMockLogPackage('ok', 'Test ok message');
|
||||
await testDestination.handleLog(logPackage);
|
||||
|
||||
expect(consoleLogCalls.length).toEqual(1);
|
||||
expect(consoleLogCalls[0][0]).toContain('OK:');
|
||||
expect(consoleLogCalls[0][2]).toContain('Test ok message');
|
||||
});
|
||||
|
||||
tap.test('should log success level messages with appropriate styling', async () => {
|
||||
consoleLogCalls = [];
|
||||
|
||||
const logPackage = createMockLogPackage('success', 'Test success message');
|
||||
await testDestination.handleLog(logPackage);
|
||||
|
||||
expect(consoleLogCalls.length).toEqual(1);
|
||||
expect(consoleLogCalls[0][0]).toContain('Success:');
|
||||
expect(consoleLogCalls[0][2]).toContain('Test success message');
|
||||
});
|
||||
|
||||
tap.test('should log warn level messages with appropriate styling', async () => {
|
||||
consoleLogCalls = [];
|
||||
|
||||
const logPackage = createMockLogPackage('warn', 'Test warning message');
|
||||
await testDestination.handleLog(logPackage);
|
||||
|
||||
expect(consoleLogCalls.length).toEqual(1);
|
||||
expect(consoleLogCalls[0][0]).toContain('Warn:');
|
||||
expect(consoleLogCalls[0][2]).toContain('Test warning message');
|
||||
});
|
||||
|
||||
tap.test('should log note level messages with appropriate styling', async () => {
|
||||
consoleLogCalls = [];
|
||||
|
||||
const logPackage = createMockLogPackage('note', 'Test note message');
|
||||
await testDestination.handleLog(logPackage);
|
||||
|
||||
expect(consoleLogCalls.length).toEqual(1);
|
||||
expect(consoleLogCalls[0][0]).toContain('Note:');
|
||||
expect(consoleLogCalls[0][2]).toContain('Test note message');
|
||||
});
|
||||
|
||||
tap.test('should clean up test environment', async () => {
|
||||
// Restore the original console.log
|
||||
console.log = originalConsoleLog;
|
||||
});
|
||||
|
||||
export default tap.start();
|
10
test/test.destination-devtools.node.ts
Normal file
10
test/test.destination-devtools.node.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogDestinationDevtools } from '../ts_destination_devtools/index.js';
|
||||
|
||||
// Test we can create a destination instance
|
||||
tap.test('should create a DevTools destination instance', async () => {
|
||||
const devtoolsDestination = new SmartlogDestinationDevtools();
|
||||
expect(devtoolsDestination).toBeTruthy();
|
||||
});
|
||||
|
||||
export default tap.start();
|
87
test/test.destination-file.node.ts
Normal file
87
test/test.destination-file.node.ts
Normal file
@ -0,0 +1,87 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogDestinationFile } from '../ts_destination_file/index.js';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as os from 'os';
|
||||
|
||||
let testLogDir: string;
|
||||
let testLogFile: string;
|
||||
let testDestination: SmartlogDestinationFile;
|
||||
|
||||
// Setup and teardown helpers
|
||||
const createTempLogDir = () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'smartlog-test-'));
|
||||
return tempDir;
|
||||
};
|
||||
|
||||
const removeTempDir = (dirPath: string) => {
|
||||
if (fs.existsSync(dirPath)) {
|
||||
const files = fs.readdirSync(dirPath);
|
||||
for (const file of files) {
|
||||
fs.unlinkSync(path.join(dirPath, file));
|
||||
}
|
||||
fs.rmdirSync(dirPath);
|
||||
}
|
||||
};
|
||||
|
||||
// Tests
|
||||
tap.test('should prepare test environment', async () => {
|
||||
testLogDir = createTempLogDir();
|
||||
testLogFile = path.join(testLogDir, 'test.log');
|
||||
expect(fs.existsSync(testLogDir)).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('should create a file destination instance with a valid path', async () => {
|
||||
testDestination = new SmartlogDestinationFile(testLogFile);
|
||||
expect(testDestination).toBeTruthy();
|
||||
expect(fs.existsSync(testLogFile)).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('should throw error when file path is not absolute', async () => {
|
||||
let errorThrown = false;
|
||||
try {
|
||||
new SmartlogDestinationFile('relative/path/file.log');
|
||||
} catch (error) {
|
||||
errorThrown = true;
|
||||
expect(error.message).toContain('filePath needs to be absolute');
|
||||
}
|
||||
expect(errorThrown).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('should write log messages to file', async () => {
|
||||
const testMessage = 'Test log message';
|
||||
|
||||
await testDestination.handleLog({
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level: 'info',
|
||||
message: testMessage,
|
||||
context: {
|
||||
environment: 'test',
|
||||
runtime: 'node'
|
||||
},
|
||||
correlation: {
|
||||
id: '123',
|
||||
type: 'none'
|
||||
}
|
||||
});
|
||||
|
||||
// Give file system a moment to write
|
||||
await new Promise(resolve => setTimeout(resolve, 50));
|
||||
|
||||
const fileContent = fs.readFileSync(testLogFile, 'utf8');
|
||||
expect(fileContent).toContain(testMessage);
|
||||
});
|
||||
|
||||
tap.test('should clean up test resources', async () => {
|
||||
// Close file handle before cleanup
|
||||
testDestination.fileWriteStream.end();
|
||||
|
||||
// Small delay to ensure file is properly closed
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
|
||||
removeTempDir(testLogDir);
|
||||
expect(fs.existsSync(testLogDir)).toBeFalse();
|
||||
});
|
||||
|
||||
export default tap.start();
|
96
test/test.destination-local.node.ts
Normal file
96
test/test.destination-local.node.ts
Normal file
@ -0,0 +1,96 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { DestinationLocal } from '../ts_destination_local/index.js';
|
||||
import * as smartlogInterfaces from '../ts_interfaces/index.js';
|
||||
|
||||
let testDestination: DestinationLocal;
|
||||
|
||||
// Mock log package
|
||||
const createMockLogPackage = (level: smartlogInterfaces.TLogLevel, message: string): smartlogInterfaces.ILogPackage => {
|
||||
return {
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level,
|
||||
message,
|
||||
context: {
|
||||
environment: 'test',
|
||||
runtime: 'node'
|
||||
},
|
||||
correlation: {
|
||||
id: '123',
|
||||
type: 'none'
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
// Tests
|
||||
tap.test('should create a local destination instance', async () => {
|
||||
testDestination = new DestinationLocal();
|
||||
expect(testDestination).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('should handle logs with different levels', async () => {
|
||||
// Testing with a spy would be ideal, but since we don't have a mocking framework,
|
||||
// we'll just verify the method runs without errors for different log levels
|
||||
|
||||
// Test info level
|
||||
const logPackageInfo = createMockLogPackage('info', 'Info message');
|
||||
await testDestination.handleLog(logPackageInfo);
|
||||
|
||||
// Test error level
|
||||
const logPackageError = createMockLogPackage('error', 'Error message');
|
||||
await testDestination.handleLog(logPackageError);
|
||||
|
||||
// Test warn level
|
||||
const logPackageWarn = createMockLogPackage('warn', 'Warning message');
|
||||
await testDestination.handleLog(logPackageWarn);
|
||||
|
||||
// Test silly level
|
||||
const logPackageSilly = createMockLogPackage('silly', 'Silly message');
|
||||
await testDestination.handleLog(logPackageSilly);
|
||||
});
|
||||
|
||||
tap.test('should handle reduced logging', async () => {
|
||||
testDestination = new DestinationLocal();
|
||||
|
||||
// Note: In a real test environment with a mocking framework,
|
||||
// we would capture console output and verify it's only written
|
||||
// according to the expected behavior. Here we just ensure
|
||||
// the methods execute without errors.
|
||||
|
||||
// First call with message
|
||||
testDestination.logReduced('Test message');
|
||||
|
||||
// Same message immediately after
|
||||
testDestination.logReduced('Test message');
|
||||
|
||||
// Different message
|
||||
testDestination.logReduced('Different message');
|
||||
});
|
||||
|
||||
tap.test('should handle repeated logging with repeatEveryTimesArg', async () => {
|
||||
testDestination = new DestinationLocal();
|
||||
|
||||
// First call with message
|
||||
testDestination.logReduced('Repeated with count', 3);
|
||||
|
||||
// Second call
|
||||
testDestination.logReduced('Repeated with count', 3);
|
||||
|
||||
// Third call
|
||||
testDestination.logReduced('Repeated with count', 3);
|
||||
|
||||
// Fourth call (3rd repetition)
|
||||
testDestination.logReduced('Repeated with count', 3);
|
||||
});
|
||||
|
||||
tap.test('should create new line(s)', async () => {
|
||||
testDestination = new DestinationLocal();
|
||||
|
||||
// Default 1 line
|
||||
testDestination.newLine();
|
||||
|
||||
// Multiple lines
|
||||
testDestination.newLine(3);
|
||||
});
|
||||
|
||||
export default tap.start();
|
72
test/test.destination-receiver.node.ts
Normal file
72
test/test.destination-receiver.node.ts
Normal file
@ -0,0 +1,72 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogDestinationReceiver } from '../ts_destination_receiver/index.js';
|
||||
import { Smartlog } from '../ts/index.js';
|
||||
import * as smartlogInterfaces from '../ts_interfaces/index.js';
|
||||
|
||||
let testDestination: SmartlogDestinationReceiver;
|
||||
let testSmartlog: Smartlog;
|
||||
|
||||
// Mock log package
|
||||
const createMockLogPackage = (level: smartlogInterfaces.TLogLevel, message: string): smartlogInterfaces.ILogPackage => {
|
||||
return {
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level,
|
||||
message,
|
||||
context: {
|
||||
environment: 'test',
|
||||
runtime: 'node'
|
||||
},
|
||||
correlation: {
|
||||
id: '123',
|
||||
type: 'none'
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
// Tests
|
||||
tap.test('should create a Smartlog instance', async () => {
|
||||
testSmartlog = new Smartlog({
|
||||
logContext: {
|
||||
environment: 'test',
|
||||
runtime: 'node',
|
||||
zone: 'test-zone',
|
||||
company: 'Test Company',
|
||||
companyunit: 'Test Unit',
|
||||
containerName: 'test-container',
|
||||
},
|
||||
});
|
||||
|
||||
expect(testSmartlog).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('should create a destination receiver instance with valid options', async () => {
|
||||
testDestination = new SmartlogDestinationReceiver({
|
||||
passphrase: 'test-passphrase',
|
||||
receiverEndpoint: 'https://example.com/logs',
|
||||
});
|
||||
|
||||
expect(testDestination).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('should attempt to send logs to the receiver endpoint', async () => {
|
||||
// Create a mock version of the webrequest.postJson method to avoid actual HTTP calls
|
||||
const originalPostJson = testDestination['webrequest'].postJson;
|
||||
testDestination['webrequest'].postJson = async () => {
|
||||
return {
|
||||
body: { status: 'ok' },
|
||||
statusCode: 200
|
||||
};
|
||||
};
|
||||
|
||||
try {
|
||||
const logPackage = createMockLogPackage('info', 'Test receiver message');
|
||||
const result = await testDestination.handleLog(logPackage);
|
||||
expect(result).toEqual({ status: 'ok' });
|
||||
} finally {
|
||||
// Restore the original method
|
||||
testDestination['webrequest'].postJson = originalPostJson;
|
||||
}
|
||||
});
|
||||
|
||||
export default tap.start();
|
115
test/test.receiver.node.ts
Normal file
115
test/test.receiver.node.ts
Normal file
@ -0,0 +1,115 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogReceiver } from '../ts_receiver/index.js';
|
||||
import { Smartlog } from '../ts/index.js';
|
||||
import * as smartlogInterfaces from '../ts_interfaces/index.js';
|
||||
import * as smarthash from '@push.rocks/smarthash';
|
||||
|
||||
let testSmartlog: Smartlog;
|
||||
let testReceiver: SmartlogReceiver;
|
||||
const testPassphrase = 'test-secret-passphrase';
|
||||
|
||||
// Helper to create authenticated log package
|
||||
const createAuthenticatedLogPackage = (
|
||||
level: smartlogInterfaces.TLogLevel,
|
||||
message: string
|
||||
): smartlogInterfaces.ILogPackageAuthenticated => {
|
||||
const logPackage: smartlogInterfaces.ILogPackage = {
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level,
|
||||
message,
|
||||
context: {
|
||||
environment: 'test',
|
||||
runtime: 'node'
|
||||
},
|
||||
correlation: {
|
||||
id: '123',
|
||||
type: 'none'
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
auth: smarthash.sha256FromStringSync(testPassphrase),
|
||||
logPackage
|
||||
};
|
||||
};
|
||||
|
||||
// Tests
|
||||
tap.test('should create a Smartlog instance for receiver', async () => {
|
||||
testSmartlog = new Smartlog({
|
||||
logContext: {
|
||||
environment: 'test',
|
||||
runtime: 'node',
|
||||
zone: 'test-zone',
|
||||
company: 'Test Company',
|
||||
companyunit: 'Test Unit',
|
||||
containerName: 'test-container',
|
||||
},
|
||||
});
|
||||
|
||||
expect(testSmartlog).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('should create a SmartlogReceiver instance', async () => {
|
||||
// Create a validator function that always returns true
|
||||
const validatorFunction = async () => true;
|
||||
|
||||
testReceiver = new SmartlogReceiver({
|
||||
smartlogInstance: testSmartlog,
|
||||
passphrase: testPassphrase,
|
||||
validatorFunction
|
||||
});
|
||||
|
||||
expect(testReceiver).toBeTruthy();
|
||||
expect(testReceiver.passphrase).toEqual(testPassphrase);
|
||||
});
|
||||
|
||||
tap.test('should handle authenticated log with correct passphrase', async () => {
|
||||
const authLogPackage = createAuthenticatedLogPackage('info', 'Test authenticated message');
|
||||
|
||||
const result = await testReceiver.handleAuthenticatedLog(authLogPackage);
|
||||
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.status).toEqual('ok');
|
||||
});
|
||||
|
||||
tap.test('should reject authenticated log with incorrect passphrase', async () => {
|
||||
const logPackage: smartlogInterfaces.ILogPackage = {
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level: 'info',
|
||||
message: 'Test unauthorized message',
|
||||
context: {
|
||||
environment: 'test',
|
||||
runtime: 'node'
|
||||
},
|
||||
correlation: {
|
||||
id: '123',
|
||||
type: 'none'
|
||||
}
|
||||
};
|
||||
|
||||
const badAuthPackage = {
|
||||
auth: 'incorrect-hash',
|
||||
logPackage
|
||||
};
|
||||
|
||||
const result = await testReceiver.handleAuthenticatedLog(badAuthPackage);
|
||||
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.status).toEqual('error');
|
||||
});
|
||||
|
||||
tap.test('should handle many authenticated logs', async () => {
|
||||
const authLogPackage1 = createAuthenticatedLogPackage('info', 'Test batch message 1');
|
||||
const authLogPackage2 = createAuthenticatedLogPackage('warn', 'Test batch message 2');
|
||||
const authLogPackage3 = createAuthenticatedLogPackage('error', 'Test batch message 3');
|
||||
|
||||
const authLogPackages = [authLogPackage1, authLogPackage2, authLogPackage3];
|
||||
|
||||
await testReceiver.handleManyAuthenticatedLogs(authLogPackages);
|
||||
|
||||
// No assertions needed as we're just testing it doesn't throw errors
|
||||
});
|
||||
|
||||
export default tap.start();
|
75
test/test.source-ora.node.ts
Normal file
75
test/test.source-ora.node.ts
Normal file
@ -0,0 +1,75 @@
|
||||
import { expect, tap } from '@push.rocks/tapbundle';
|
||||
import { SmartlogSourceOra } from '../ts_source_ora/index.js';
|
||||
|
||||
let testSourceOra: SmartlogSourceOra;
|
||||
|
||||
tap.test('should create a SmartlogSourceOra instance', async () => {
|
||||
testSourceOra = new SmartlogSourceOra();
|
||||
expect(testSourceOra).toBeTruthy();
|
||||
expect(testSourceOra.started).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('should set text and start spinner', async () => {
|
||||
const testText = 'Testing ora spinner';
|
||||
testSourceOra.text(testText);
|
||||
|
||||
expect(testSourceOra.started).toBeTrue();
|
||||
expect(testSourceOra.oraInstance.text).toEqual(testText);
|
||||
});
|
||||
|
||||
tap.test('should update text', async () => {
|
||||
const newText = 'Updated text';
|
||||
testSourceOra.text(newText);
|
||||
|
||||
expect(testSourceOra.oraInstance.text).toEqual(newText);
|
||||
expect(testSourceOra.started).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('should stop spinner', async () => {
|
||||
testSourceOra.stop();
|
||||
// We can't easily test the visual state, but we can verify it doesn't throw errors
|
||||
});
|
||||
|
||||
tap.test('should finish with success', async () => {
|
||||
testSourceOra = new SmartlogSourceOra();
|
||||
testSourceOra.text('Starting again');
|
||||
|
||||
const successText = 'Operation successful';
|
||||
testSourceOra.finishSuccess(successText);
|
||||
|
||||
expect(testSourceOra.started).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('should finish with failure', async () => {
|
||||
testSourceOra = new SmartlogSourceOra();
|
||||
testSourceOra.text('Starting again');
|
||||
|
||||
const failText = 'Operation failed';
|
||||
testSourceOra.finishFail(failText);
|
||||
|
||||
expect(testSourceOra.started).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('should handle success and next', async () => {
|
||||
testSourceOra = new SmartlogSourceOra();
|
||||
testSourceOra.text('Starting again');
|
||||
|
||||
const nextText = 'Next operation';
|
||||
testSourceOra.successAndNext(nextText);
|
||||
|
||||
expect(testSourceOra.started).toBeTrue();
|
||||
expect(testSourceOra.oraInstance.text).toEqual(nextText);
|
||||
});
|
||||
|
||||
tap.test('should handle fail and next', async () => {
|
||||
testSourceOra = new SmartlogSourceOra();
|
||||
testSourceOra.text('Starting again');
|
||||
|
||||
const nextText = 'Next operation after failure';
|
||||
testSourceOra.failAndNext(nextText);
|
||||
|
||||
expect(testSourceOra.started).toBeTrue();
|
||||
expect(testSourceOra.oraInstance.text).toEqual(nextText);
|
||||
});
|
||||
|
||||
export default tap.start();
|
@ -1,8 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @pushrocks/commitinfo
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog',
|
||||
version: '3.0.7',
|
||||
version: '3.0.8',
|
||||
description: 'A minimalistic, distributed, and extensible logging tool supporting centralized log management.'
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ export class ConsoleLog {
|
||||
logLevelArg: plugins.smartlogInterfaces.TLogLevel,
|
||||
logMessageArg: string,
|
||||
dataArg?: any,
|
||||
correlationArg?: plugins.smartlogInterfaces.ILogCorrelation
|
||||
correlationArg?: plugins.smartlogInterfaces.ILogCorrelation,
|
||||
) {
|
||||
console.log(`__# ${logLevelArg}: ${logMessageArg}`);
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ export class LogGroup {
|
||||
public log(
|
||||
logLevelArg: plugins.smartlogInterfaces.TLogLevel,
|
||||
logMessageArg: string,
|
||||
logDataArg?: any
|
||||
logDataArg?: any,
|
||||
) {
|
||||
this.smartlogRef.log(logLevelArg, logMessageArg, logDataArg, {
|
||||
id: plugins.isounique.uni(),
|
||||
|
@ -10,10 +10,12 @@ export interface ISmartlogContructorOptions {
|
||||
|
||||
export class Smartlog implements plugins.smartlogInterfaces.ILogDestination {
|
||||
// STATIC
|
||||
public static createForCommitinfo(commitinfo: plugins.smartlogInterfaces.ILogContext['commitinfo']) {
|
||||
public static createForCommitinfo(
|
||||
commitinfo: plugins.smartlogInterfaces.ILogContext['commitinfo'],
|
||||
) {
|
||||
return new Smartlog({
|
||||
logContext: {
|
||||
commitinfo
|
||||
commitinfo,
|
||||
},
|
||||
});
|
||||
}
|
||||
@ -95,7 +97,7 @@ export class Smartlog implements plugins.smartlogInterfaces.ILogDestination {
|
||||
logLevelArg: plugins.smartlogInterfaces.TLogLevel,
|
||||
logMessageArg: string,
|
||||
logDataArg?: any,
|
||||
correlationArg?: plugins.smartlogInterfaces.ILogCorrelation
|
||||
correlationArg?: plugins.smartlogInterfaces.ILogCorrelation,
|
||||
) {
|
||||
correlationArg = {
|
||||
...{
|
||||
@ -131,7 +133,7 @@ export class Smartlog implements plugins.smartlogInterfaces.ILogDestination {
|
||||
correlationArg: plugins.smartlogInterfaces.ILogCorrelation = {
|
||||
id: plugins.isounique.uni(),
|
||||
type: 'none',
|
||||
}
|
||||
},
|
||||
) {
|
||||
if (this.consoleEnabled) {
|
||||
this.safeConsoleLog(`INCREMENT: ${logLevelArg}: ${logMessageArg}`);
|
||||
@ -152,7 +154,7 @@ export class Smartlog implements plugins.smartlogInterfaces.ILogDestination {
|
||||
|
||||
private safeConsoleLog(logLine: string) {
|
||||
console.log(
|
||||
`LOG => ${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()} => ${logLine}`
|
||||
`LOG => ${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()} => ${logLine}`,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import * as isounique from '@push.rocks/isounique';
|
||||
import * as smartlogInterfaces from '@push.rocks/smartlog-interfaces';
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
|
||||
export { isounique, smartlogInterfaces };
|
||||
|
3
ts_context/index.ts
Normal file
3
ts_context/index.ts
Normal file
@ -0,0 +1,3 @@
|
||||
import * as plugins from './smartlog-context.plugins.js';
|
||||
|
||||
export let standardExport = 'Hi there! :) This is an exported string';
|
6
ts_context/smartlog-context.plugins.ts
Normal file
6
ts_context/smartlog-context.plugins.ts
Normal file
@ -0,0 +1,6 @@
|
||||
// node native scope
|
||||
import * as path from 'path';
|
||||
|
||||
export {
|
||||
path
|
||||
}
|
8
ts_destination_clickhouse/00_commitinfo_data.ts
Normal file
8
ts_destination_clickhouse/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog-destination-clickhouse',
|
||||
version: '1.0.14',
|
||||
description: 'A library to integrate Smartlog logging with ClickHouse database for efficient log storage and querying.'
|
||||
}
|
30
ts_destination_clickhouse/index.ts
Normal file
30
ts_destination_clickhouse/index.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import * as plugins from './slclick.plugins.js';
|
||||
|
||||
export class SmartlogDestinationClickhouse implements plugins.smartlogInterfaces.ILogDestination {
|
||||
// STATIC
|
||||
public static async createAndStart(
|
||||
optionsArg: plugins.smartclickhouse.IClickhouseConstructorOptions
|
||||
) {
|
||||
const destinationClickhouse = new SmartlogDestinationClickhouse(optionsArg);
|
||||
await destinationClickhouse.start();
|
||||
return destinationClickhouse;
|
||||
}
|
||||
|
||||
// INSTANCE
|
||||
private smartclickhouseDb: plugins.smartclickhouse.SmartClickHouseDb;
|
||||
private logTable: plugins.smartclickhouse.TimeDataTable;
|
||||
constructor(options: plugins.smartclickhouse.IClickhouseConstructorOptions) {
|
||||
this.smartclickhouseDb = new plugins.smartclickhouse.SmartClickHouseDb(options);
|
||||
}
|
||||
|
||||
public async start() {
|
||||
await this.smartclickhouseDb.start();
|
||||
this.logTable = await this.smartclickhouseDb.getTable('logs');
|
||||
}
|
||||
|
||||
public async handleLog(
|
||||
logPackage: plugins.smartlogInterfaces.ILogPackage<unknown>
|
||||
): Promise<void> {
|
||||
await this.logTable.addData(logPackage);
|
||||
}
|
||||
}
|
5
ts_destination_clickhouse/slclick.plugins.ts
Normal file
5
ts_destination_clickhouse/slclick.plugins.ts
Normal file
@ -0,0 +1,5 @@
|
||||
// pushrocks scope
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
import * as smartclickhouse from '@push.rocks/smartclickhouse';
|
||||
|
||||
export { smartlogInterfaces, smartclickhouse };
|
8
ts_destination_devtools/00_commitinfo_data.ts
Normal file
8
ts_destination_devtools/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog-destination-devtools',
|
||||
version: '1.0.12',
|
||||
description: 'A library enabling enhanced logging in browser development tools.'
|
||||
}
|
58
ts_destination_devtools/index.ts
Normal file
58
ts_destination_devtools/index.ts
Normal file
@ -0,0 +1,58 @@
|
||||
import * as plugins from './plugins.js';
|
||||
import type { ILogDestination, ILogPackage } from '../dist_ts_interfaces/index.js';
|
||||
|
||||
export class SmartlogDestinationDevtools implements ILogDestination {
|
||||
public async handleLog(logPackageArg: ILogPackage) {
|
||||
await this.logInBrowser(logPackageArg);
|
||||
}
|
||||
|
||||
private async logInBrowser(logPackage: ILogPackage) {
|
||||
switch (logPackage.level) {
|
||||
case 'error':
|
||||
console.log(
|
||||
`%c Error: %c ${logPackage.message}`,
|
||||
'background:#000000;color:#800000;',
|
||||
'color:#000000;'
|
||||
);
|
||||
break;
|
||||
case 'info':
|
||||
console.log(
|
||||
`%c Info: %c ${logPackage.message}`,
|
||||
'background:#EC407A;color:#ffffff;',
|
||||
'color:#EC407A;'
|
||||
);
|
||||
break;
|
||||
case 'ok':
|
||||
console.log(
|
||||
`%c OK: %c ${logPackage.message}`,
|
||||
'background:#000000;color:#8BC34A;',
|
||||
'color:#000000;'
|
||||
);
|
||||
break;
|
||||
case 'success':
|
||||
console.log(
|
||||
`%c Success: %c ${logPackage.message}`,
|
||||
'background:#8BC34A;color:#ffffff;',
|
||||
'color:#8BC34A;'
|
||||
);
|
||||
break;
|
||||
case 'warn':
|
||||
console.log(
|
||||
`%c Warn: %c ${logPackage.message}`,
|
||||
'background:#000000;color:#FB8C00;',
|
||||
'color:#000000;'
|
||||
);
|
||||
break;
|
||||
case 'note':
|
||||
console.log(
|
||||
`%c Note: %c ${logPackage.message}`,
|
||||
'background:#42A5F5;color:#ffffff',
|
||||
'color:#42A5F5;'
|
||||
);
|
||||
break;
|
||||
default:
|
||||
console.log(`unknown logType for "${logPackage.message}"`);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
2
ts_destination_devtools/plugins.ts
Normal file
2
ts_destination_devtools/plugins.ts
Normal file
@ -0,0 +1,2 @@
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
export { smartlogInterfaces };
|
23
ts_destination_file/index.ts
Normal file
23
ts_destination_file/index.ts
Normal file
@ -0,0 +1,23 @@
|
||||
import * as plugins from './smartfile-destination-file.plugins.js';
|
||||
|
||||
export class SmartlogDestinationFile implements plugins.smartlogInterfaces.ILogDestination {
|
||||
public fileWriteStream: plugins.fs.WriteStream;
|
||||
|
||||
public async handleLog(logPackageArg: plugins.smartlogInterfaces.ILogPackage) {
|
||||
this.fileWriteStream.write(`${new plugins.smarttime.ExtendedDate(Date.now()).toISOString()}: ${logPackageArg.message} \n`);
|
||||
}
|
||||
|
||||
constructor(filePathArg: string) {
|
||||
const extendedDate = new plugins.smarttime.ExtendedDate(Date.now());
|
||||
if (!plugins.path.isAbsolute(filePathArg)) {
|
||||
throw new Error(`filePath needs to be absolute but is not: "${filePathArg}"`);
|
||||
}
|
||||
plugins.smartfile.fs.ensureFileSync(filePathArg, `# Smartlogfile. Created at ${extendedDate.toISOString()}\n`);
|
||||
this.fileWriteStream = plugins.fs.createWriteStream(
|
||||
filePathArg,
|
||||
{
|
||||
flags: 'a+',
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
19
ts_destination_file/smartfile-destination-file.plugins.ts
Normal file
19
ts_destination_file/smartfile-destination-file.plugins.ts
Normal file
@ -0,0 +1,19 @@
|
||||
// node native scope
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
export {
|
||||
fs,
|
||||
path
|
||||
};
|
||||
|
||||
// pushrocks scope
|
||||
import * as smartfile from '@push.rocks/smartfile';
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
import * as smarttime from '@push.rocks/smarttime';
|
||||
|
||||
export {
|
||||
smartfile,
|
||||
smartlogInterfaces,
|
||||
smarttime
|
||||
};
|
8
ts_destination_local/00_commitinfo_data.ts
Normal file
8
ts_destination_local/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog-destination-local',
|
||||
version: '9.0.2',
|
||||
description: 'a smartlog destination targeting the local console'
|
||||
}
|
135
ts_destination_local/classes.destinationlocal.ts
Normal file
135
ts_destination_local/classes.destinationlocal.ts
Normal file
@ -0,0 +1,135 @@
|
||||
import * as plugins from './plugins.js';
|
||||
import type { ILogDestination, ILogPackage, TLogLevel } from '../dist_ts_interfaces/index.js';
|
||||
|
||||
// other beautylog classes
|
||||
import { type TColorName } from '@push.rocks/consolecolor';
|
||||
|
||||
export class DestinationLocal implements ILogDestination {
|
||||
/**
|
||||
* handles a log according to the smartlog standard
|
||||
* @param logPackage
|
||||
*/
|
||||
public async handleLog(logPackage: ILogPackage) {
|
||||
this.logToConsole(logPackage);
|
||||
}
|
||||
|
||||
/**
|
||||
* creates a new empty line
|
||||
* @param linesArg
|
||||
* @returns void
|
||||
*/
|
||||
public newLine(linesArg: number = 1) {
|
||||
for (let i = 0; i < linesArg; i++) {
|
||||
console.log('\n');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* logs a reduced log that only logs changes of consequential log messages
|
||||
*/
|
||||
public logReduced(logTextArg: string, repeatEveryTimesArg: number = 0) {
|
||||
if (
|
||||
logTextArg === this.previousMessage &&
|
||||
(repeatEveryTimesArg === 0 || this.sameMessageCounter !== repeatEveryTimesArg)
|
||||
) {
|
||||
this.sameMessageCounter++;
|
||||
} else {
|
||||
this.sameMessageCounter = 0;
|
||||
this.previousMessage = logTextArg;
|
||||
this.logToConsole({
|
||||
timestamp: Date.now(),
|
||||
type: 'log',
|
||||
level: 'info',
|
||||
context: {
|
||||
company: 'undefined',
|
||||
companyunit: 'undefined',
|
||||
containerName: 'undefined',
|
||||
environment: 'test',
|
||||
runtime: 'node',
|
||||
zone: 'undefined',
|
||||
},
|
||||
message: logTextArg,
|
||||
correlation: {
|
||||
id: 'none',
|
||||
type: 'none',
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
private previousMessage: string = '';
|
||||
private sameMessageCounter: number = 0;
|
||||
|
||||
// default logging
|
||||
private logToConsole(logPackageArg: ILogPackage) {
|
||||
let logString: string;
|
||||
try {
|
||||
logString =
|
||||
this.localBl[logPackageArg.level].prefix +
|
||||
plugins.consolecolor.coloredString(
|
||||
logPackageArg.message,
|
||||
this.localBl[logPackageArg.level].textColor
|
||||
);
|
||||
console.log(logString);
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.log(
|
||||
this.localBl.errorPrefix + 'You seem to have tried logging something strange' + error
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private localBl: {
|
||||
[key: string]: {
|
||||
prefix: string;
|
||||
textColor: TColorName;
|
||||
};
|
||||
} = {
|
||||
silly: {
|
||||
prefix: plugins.consolecolor.coloredString(' silly ', 'white', 'blue') + ' ',
|
||||
textColor: 'blue',
|
||||
},
|
||||
error: {
|
||||
prefix:
|
||||
plugins.consolecolor.coloredString(' ', 'red', 'red') +
|
||||
plugins.consolecolor.coloredString(' ERROR! ', 'red', 'black') +
|
||||
' ',
|
||||
textColor: 'red',
|
||||
},
|
||||
info: {
|
||||
prefix:
|
||||
plugins.consolecolor.coloredString(' ', 'blue', 'blue') +
|
||||
plugins.consolecolor.coloredString(' info: ', 'blue', 'black') +
|
||||
' ',
|
||||
textColor: 'white',
|
||||
},
|
||||
note: {
|
||||
prefix:
|
||||
plugins.consolecolor.coloredString(' ', 'pink', 'pink') +
|
||||
plugins.consolecolor.coloredString(' note -> ', 'pink', 'black') +
|
||||
' ',
|
||||
textColor: 'pink',
|
||||
},
|
||||
ok: {
|
||||
prefix:
|
||||
plugins.consolecolor.coloredString(' ', 'green', 'green') +
|
||||
plugins.consolecolor.coloredString(' ok ', 'green', 'black') +
|
||||
' ',
|
||||
textColor: 'green',
|
||||
},
|
||||
success: {
|
||||
prefix:
|
||||
plugins.consolecolor.coloredString(' ', 'green', 'green') +
|
||||
plugins.consolecolor.coloredString(' SUCCESS! ', 'green', 'black') +
|
||||
' ',
|
||||
textColor: 'green',
|
||||
},
|
||||
warn: {
|
||||
prefix:
|
||||
plugins.consolecolor.coloredString(' ', 'orange', 'orange') +
|
||||
plugins.consolecolor.coloredString(' WARN -> ', 'orange', 'black') +
|
||||
' ',
|
||||
textColor: 'orange',
|
||||
},
|
||||
};
|
||||
}
|
2
ts_destination_local/index.ts
Normal file
2
ts_destination_local/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
// export classes
|
||||
export { DestinationLocal } from './classes.destinationlocal.js';
|
5
ts_destination_local/plugins.ts
Normal file
5
ts_destination_local/plugins.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import * as consolecolor from '@push.rocks/consolecolor';
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
import * as smartpromise from '@push.rocks/smartpromise';
|
||||
|
||||
export { consolecolor, smartlogInterfaces, smartpromise };
|
8
ts_destination_receiver/00_commitinfo_data.ts
Normal file
8
ts_destination_receiver/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog-destination-receiver',
|
||||
version: '2.0.6',
|
||||
description: 'A package providing a destination handler for smartlog logging packages'
|
||||
}
|
35
ts_destination_receiver/index.ts
Normal file
35
ts_destination_receiver/index.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import * as plugins from './smartlog-destination-receiver.plugins.js';
|
||||
import {
|
||||
type ILogDestination,
|
||||
type ILogPackageAuthenticated,
|
||||
type ILogPackage,
|
||||
} from '../dist_ts_interfaces/index.js';
|
||||
|
||||
export interface ISmartlogDestinationReceiverConstructorOptions {
|
||||
passphrase: string;
|
||||
receiverEndpoint: string;
|
||||
}
|
||||
|
||||
export class SmartlogDestinationReceiver implements ILogDestination {
|
||||
private options: ISmartlogDestinationReceiverConstructorOptions;
|
||||
private webrequest = new plugins.webrequest.WebRequest();
|
||||
|
||||
constructor(optionsArg: ISmartlogDestinationReceiverConstructorOptions) {
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
private errorCounter = 0;
|
||||
public async handleLog(logPackageArg: ILogPackage) {
|
||||
const response = await this.webrequest.postJson(this.options.receiverEndpoint, {
|
||||
auth: plugins.smarthash.sha256FromStringSync(this.options.passphrase),
|
||||
logPackage: logPackageArg,
|
||||
}).catch(err => {
|
||||
if (this.errorCounter % 100 === 0) {
|
||||
console.error(`There seems to be an error with logging.`);
|
||||
console.error(`Accumulated ${this.errorCounter} errors so far`)
|
||||
}
|
||||
this.errorCounter++;
|
||||
});
|
||||
return response.body;
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
import * as smarthash from '@push.rocks/smarthash';
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
import * as webrequest from '@push.rocks/webrequest';
|
||||
|
||||
export { smarthash, smartlogInterfaces, webrequest };
|
8
ts_interfaces/00_commitinfo_data.ts
Normal file
8
ts_interfaces/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog-interfaces',
|
||||
version: '3.0.2',
|
||||
description: 'Defines interfaces for the smartlog ecosystem.'
|
||||
}
|
126
ts_interfaces/index.ts
Normal file
126
ts_interfaces/index.ts
Normal file
@ -0,0 +1,126 @@
|
||||
import * as plugins from './smartlog-interfaces.plugins.js';
|
||||
|
||||
import * as requestInterfaces from './smartlog-interfaces.requests.js';
|
||||
|
||||
export { requestInterfaces as request };
|
||||
|
||||
/**
|
||||
* the different available log types
|
||||
*/
|
||||
export type TLogType =
|
||||
| 'log'
|
||||
| 'increment'
|
||||
| 'gauge'
|
||||
| 'error'
|
||||
| 'success'
|
||||
| 'value'
|
||||
| 'finance'
|
||||
| 'compliance';
|
||||
|
||||
/**
|
||||
* the available log levels
|
||||
*/
|
||||
export type TLogLevel =
|
||||
| 'silly'
|
||||
| 'info'
|
||||
| 'debug'
|
||||
| 'note'
|
||||
| 'ok'
|
||||
| 'success'
|
||||
| 'warn'
|
||||
| 'error'
|
||||
| 'lifecycle';
|
||||
|
||||
/**
|
||||
* the available environments
|
||||
*/
|
||||
export type TEnvironment = 'local' | 'test' | 'staging' | 'production';
|
||||
|
||||
/**
|
||||
* the available runtimes
|
||||
*/
|
||||
export type TRuntime = 'node' | 'chrome' | 'rust' | 'deno' | 'cloudflare_workers';
|
||||
|
||||
/**
|
||||
* the log context e.g. what app in what version on what server
|
||||
*/
|
||||
export interface ILogContext {
|
||||
commitinfo?: plugins.tsclass.code.ICommitInfo;
|
||||
company?: string;
|
||||
companyunit?: string;
|
||||
containerName?: string;
|
||||
environment?: TEnvironment;
|
||||
runtime?: TRuntime;
|
||||
zone?: string;
|
||||
}
|
||||
|
||||
export interface ILogCorrelation {
|
||||
/**
|
||||
* a unique id for this log
|
||||
*/
|
||||
id: string;
|
||||
/**
|
||||
* the type of this log
|
||||
*/
|
||||
type: 'none' | 'service' | 'build' | 'infrastructure' | 'cdn';
|
||||
/**
|
||||
* the instance on which the log is created
|
||||
* use it for pinning logs to a certain instance in a cluster
|
||||
*/
|
||||
instance?: string;
|
||||
/**
|
||||
* a series of logs
|
||||
*/
|
||||
group?: string;
|
||||
/**
|
||||
* a log that belongs to a transaction. E.g. a Payment or a request traveling through multiple backend instances
|
||||
*/
|
||||
transaction?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* the main logpackage
|
||||
*/
|
||||
export interface ILogPackage<T = unknown> {
|
||||
/**
|
||||
* a unix timestamp in milliseconds
|
||||
*/
|
||||
timestamp: number;
|
||||
type: TLogType;
|
||||
context: ILogContext;
|
||||
level: TLogLevel;
|
||||
/**
|
||||
* allows grouping of log messages
|
||||
*/
|
||||
correlation: ILogCorrelation;
|
||||
/**
|
||||
* the message to log
|
||||
*/
|
||||
message: string;
|
||||
data?: T;
|
||||
}
|
||||
|
||||
export interface ILogPackageDataRequest {
|
||||
requestCorrelationId: string;
|
||||
url: string;
|
||||
pathname: string;
|
||||
method: string;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface ILogPackageAuthenticated {
|
||||
auth: string;
|
||||
logPackage: ILogPackage;
|
||||
}
|
||||
|
||||
export interface ILogPackageArrayAuthenticated {
|
||||
auth: string;
|
||||
logPackages: ILogPackage[];
|
||||
}
|
||||
|
||||
/**
|
||||
* a destination interface for extending smartlog modules
|
||||
*/
|
||||
export interface ILogDestination {
|
||||
handleLog: (logPackage: ILogPackage) => Promise<void>;
|
||||
}
|
10
ts_interfaces/smartlog-interfaces.plugins.ts
Normal file
10
ts_interfaces/smartlog-interfaces.plugins.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces';
|
||||
|
||||
export { typedrequestInterfaces };
|
||||
|
||||
// tsclass scope
|
||||
import * as tsclass from '@tsclass/tsclass';
|
||||
|
||||
export {
|
||||
tsclass
|
||||
}
|
9
ts_interfaces/smartlog-interfaces.requests.ts
Normal file
9
ts_interfaces/smartlog-interfaces.requests.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import { type ILogPackageAuthenticated } from './index.js';
|
||||
|
||||
export interface IRequest_SmartlogDestinationReceiver_Any_PostLogPackages {
|
||||
method: 'postLogPackages';
|
||||
request: {
|
||||
logPackages: ILogPackageAuthenticated[];
|
||||
};
|
||||
response: {};
|
||||
}
|
8
ts_receiver/00_commitinfo_data.ts
Normal file
8
ts_receiver/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @push.rocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartlog-receiver',
|
||||
version: '2.0.0',
|
||||
description: 'a receiver for smartlog-destination-receiver'
|
||||
}
|
1
ts_receiver/index.ts
Normal file
1
ts_receiver/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './sl.classes.smartlogreceiver.js';
|
73
ts_receiver/sl.classes.smartlogreceiver.ts
Normal file
73
ts_receiver/sl.classes.smartlogreceiver.ts
Normal file
@ -0,0 +1,73 @@
|
||||
import * as plugins from './sl.receiver.plugins.js';
|
||||
|
||||
import type {
|
||||
ILogPackage,
|
||||
ILogPackageAuthenticated,
|
||||
ILogDestination,
|
||||
} from '../dist_ts_interfaces/index.js';
|
||||
|
||||
export type TValidatorFunction = (logPackage: ILogPackage) => Promise<boolean>;
|
||||
|
||||
export interface ISmartlogReceiverOptions {
|
||||
smartlogInstance: plugins.smartlog.Smartlog;
|
||||
passphrase: string;
|
||||
validatorFunction: TValidatorFunction;
|
||||
}
|
||||
|
||||
/**
|
||||
* a class that receives smartlog packages
|
||||
*/
|
||||
export class SmartlogReceiver {
|
||||
public passphrase: string;
|
||||
public validatorFunction: TValidatorFunction;
|
||||
public smartlogInstance: plugins.smartlog.Smartlog;
|
||||
|
||||
constructor(smartlogReceiverOptions: ISmartlogReceiverOptions) {
|
||||
this.passphrase = smartlogReceiverOptions.passphrase;
|
||||
this.validatorFunction =
|
||||
smartlogReceiverOptions.validatorFunction ||
|
||||
(async (logpackageArg) => {
|
||||
return true;
|
||||
});
|
||||
this.smartlogInstance = smartlogReceiverOptions.smartlogInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* handles a authenticated log
|
||||
*/
|
||||
public async handleAuthenticatedLog(authenticatedLogPackageArg: ILogPackageAuthenticated) {
|
||||
const authString = authenticatedLogPackageArg.auth;
|
||||
const logPackage = authenticatedLogPackageArg.logPackage;
|
||||
|
||||
if (
|
||||
authString === plugins.smarthash.sha256FromStringSync(this.passphrase) &&
|
||||
(await this.validatorFunction(logPackage))
|
||||
) {
|
||||
// Message authenticated lets clean up.
|
||||
logPackage.correlation ? null : (logPackage.correlation = { id: '123', type: 'none' });
|
||||
logPackage.correlation.id ? null : (logPackage.correlation.id = '123');
|
||||
logPackage.correlation.type ? null : (logPackage.correlation.type = 'none');
|
||||
|
||||
this.smartlogInstance.handleLog(logPackage);
|
||||
return { status: 'ok' };
|
||||
} else {
|
||||
this.smartlogInstance.log('error', 'Message rejected because of bad passphrase');
|
||||
return { status: 'error' };
|
||||
// console.log(plugins.smarthash.sha256FromStringSync(this.passphrase));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* handles an array of authenticated logs
|
||||
* @param authenticatedLogsPackageArrayArg
|
||||
*/
|
||||
public async handleManyAuthenticatedLogs(
|
||||
authenticatedLogsPackageArrayArg: ILogPackageAuthenticated[]
|
||||
) {
|
||||
const promiseArray: Array<Promise<any>> = [];
|
||||
for (const logPackage of authenticatedLogsPackageArrayArg) {
|
||||
promiseArray.push(this.handleAuthenticatedLog(logPackage));
|
||||
}
|
||||
await Promise.all(promiseArray);
|
||||
}
|
||||
}
|
4
ts_receiver/sl.receiver.plugins.ts
Normal file
4
ts_receiver/sl.receiver.plugins.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import * as smarthash from '@push.rocks/smarthash';
|
||||
import * as smartlog from '../dist_ts/index.js';
|
||||
|
||||
export { smartlog, smarthash };
|
40
ts_source_ora/index.ts
Normal file
40
ts_source_ora/index.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import * as plugins from './smartlog-source-ora.plugins.js';
|
||||
|
||||
export class SmartlogSourceOra {
|
||||
public oraInstance = plugins.ora('loading');
|
||||
public started = false;
|
||||
|
||||
constructor() {}
|
||||
|
||||
public text(textArg: string) {
|
||||
this.oraInstance.text = textArg;
|
||||
if (!this.started) {
|
||||
this.started = true;
|
||||
this.oraInstance.start();
|
||||
}
|
||||
}
|
||||
|
||||
public stop() {
|
||||
this.oraInstance.stop();
|
||||
}
|
||||
|
||||
public finishSuccess(textArg?: string) {
|
||||
this.oraInstance.succeed(textArg);
|
||||
this.started = false;
|
||||
}
|
||||
|
||||
public finishFail(textArg?: string) {
|
||||
this.oraInstance.fail(textArg);
|
||||
this.started = false;
|
||||
}
|
||||
|
||||
public successAndNext(textArg: string) {
|
||||
this.finishSuccess();
|
||||
this.text(textArg);
|
||||
}
|
||||
|
||||
public failAndNext(textArg: string) {
|
||||
this.finishFail();
|
||||
this.text(textArg);
|
||||
}
|
||||
}
|
9
ts_source_ora/smartlog-source-ora.plugins.ts
Normal file
9
ts_source_ora/smartlog-source-ora.plugins.ts
Normal file
@ -0,0 +1,9 @@
|
||||
// pushrocks scope
|
||||
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
||||
|
||||
export { smartlogInterfaces };
|
||||
|
||||
// third party scope
|
||||
import ora from 'ora';
|
||||
|
||||
export { ora };
|
@ -6,7 +6,9 @@
|
||||
"module": "NodeNext",
|
||||
"moduleResolution": "NodeNext",
|
||||
"esModuleInterop": true,
|
||||
"verbatimModuleSyntax": true
|
||||
"verbatimModuleSyntax": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {}
|
||||
},
|
||||
"exclude": [
|
||||
"dist_*/**/*.d.ts"
|
||||
|
Reference in New Issue
Block a user