214 changed files with 17540 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||
.env |
|||
|
|||
dist |
|||
data/minio |
|||
node_modules |
|||
ssl/*crt |
|||
ssl/*key |
@ -0,0 +1,38 @@ |
|||
{ |
|||
// Use IntelliSense to learn about possible attributes. |
|||
// Hover to view descriptions of existing attributes. |
|||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 |
|||
"version": "0.2.0", |
|||
"configurations": [ |
|||
{ |
|||
"type": "node", |
|||
"name": "Worker", |
|||
"program": "${workspaceFolder}/src/workers/newsroom.ts", |
|||
"request": "launch", |
|||
"skipFiles": [ |
|||
"<node_internals>/**" |
|||
], |
|||
"outFiles": [/* needs to be empty so VS Code will debug .ts sources */], |
|||
"console": "integratedTerminal", |
|||
"runtimeArgs": [ |
|||
"--import", "./register.js", |
|||
"--no-warnings" |
|||
] |
|||
}, |
|||
{ |
|||
"type": "node", |
|||
"request": "launch", |
|||
"name": "Web", |
|||
"skipFiles": [ |
|||
"<node_internals>/**" |
|||
], |
|||
"outFiles": [/* needs to be empty so VS Code will debug .ts sources */], |
|||
"program": "${workspaceFolder}/src/newsroom-web.ts", |
|||
"console": "integratedTerminal", |
|||
"runtimeArgs": [ |
|||
"--import", "./register.js", |
|||
"--no-warnings" |
|||
] |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,2 @@ |
|||
DTP Newsroom Copyright (C) 2025 DTP Technologies, LLC |
|||
All Rights Reserved |
@ -0,0 +1,139 @@ |
|||
# DTP Newsroom |
|||
A virtual newsroom powered by RSS and AI that produces its own watchable media and publishes it online. |
|||
|
|||
## Web Application |
|||
The DTP Newsroom website. |
|||
|
|||
## Newsroom Worker |
|||
A running process that fetches news stories, creates audiovisual media from those stories, and publishes them. |
|||
|
|||
# Getting Started |
|||
|
|||
You will repeat this host configuration process for each host system and running process added to the DTP infrastructure. |
|||
|
|||
## Host Configuration |
|||
|
|||
Ubuntu is the only tested and supported host operating system for DTP. [Ubuntu 24.04 LTS](https://ubuntu.com/download) is recommended for development, testing, and hosting. Ubuntu 24.10 can be used for workstation duties, but 24.04 LTS is recommended for hosting. |
|||
|
|||
Supervisor is used to manage Control and Agent Node process instances. |
|||
|
|||
### System Requirements |
|||
|
|||
Make sure you've got the latest/greatest for your Ubuntu. |
|||
|
|||
```sh |
|||
apt -y update && apt -y upgrade |
|||
apt -y install python3-pip build-essential ffmpeg supervisor |
|||
``` |
|||
|
|||
### Install Node Version Manager (NVM) and Node.js |
|||
|
|||
[Node Version Manager](https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating) is used to manage the Node.js installation on the host. |
|||
|
|||
First, install `nvm`: |
|||
|
|||
#### Using cURL |
|||
```sh |
|||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash |
|||
``` |
|||
#### Using wget |
|||
```sh |
|||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash |
|||
``` |
|||
Next, run `nvm` to install the current LTS version of Node.js: |
|||
|
|||
```sh |
|||
nvm install --lts |
|||
``` |
|||
|
|||
### pnpm (NPM alternative) |
|||
|
|||
DTP Newsroom uses the [pnpm](https://pnpm.io/) package manager to manage the `node_modules` directory and provide runtime services. |
|||
|
|||
[Corepack](https://nodejs.org/api/corepack.html), a Node.js utility, is used to install and enable `pnpm` for use. |
|||
|
|||
The latest pnpm instructions can always be found here: |
|||
[pnpm installation](https://pnpm.io/installation) |
|||
|
|||
These are just convenience copies from that page. |
|||
|
|||
```sh |
|||
corepack enable pnpm |
|||
corepack use pnpm@latest |
|||
``` |
|||
|
|||
And then run `pnpm` to install the DTP Newsroom application dependencies: |
|||
|
|||
```sh |
|||
pnpm install |
|||
``` |
|||
|
|||
## Preparing a Fresh Install |
|||
|
|||
This is the basic configuration of a Node in the DTP network. Once these steps are completed, the host is ready to start the Web application, Newsroom Worker, or both. |
|||
|
|||
```sh |
|||
cd ~/live |
|||
git clone [DTP_NEWSROOM_GIT_URL] |
|||
|
|||
cd ~/live/dtp-newsroom |
|||
pnpm install |
|||
``` |
|||
|
|||
Next, you have to generate an SSL certificate for your local builds: |
|||
|
|||
```sh |
|||
cd ~/live/dtp-newsroom/ssl |
|||
./mkcert |
|||
``` |
|||
|
|||
## Controlling The Processes |
|||
|
|||
### Development Environment |
|||
|
|||
A developer working in a local directory will use `pnpm` scripts to start the Web application and Newsroom Worker as needed. VS Code launchers are also provided with TypeScript debug configurations that debug the TypeScript sources directly. |
|||
|
|||
#### Start Web Application |
|||
```sh |
|||
pnpm start-web |
|||
pnpm web-dev |
|||
``` |
|||
|
|||
#### Start Newsroom Worker |
|||
```sh |
|||
pnpm start-newsroom |
|||
pnpm newsroom-dev |
|||
``` |
|||
|
|||
### Test and Production Environments |
|||
|
|||
#### supervisord |
|||
|
|||
The system administrator will use Supervisor to manage the Control and Agent Node processes. Sample configuration files are provided here in the repo for use with [supervisord]: |
|||
|
|||
- [newsroom-web.conf](./supervisord/newsroom-web.conf) |
|||
- [newsroom-worker.conf](./supervisord/newsroom-worker.conf) |
|||
|
|||
The system administrator may need to specialize those configurations for various differences in how they store logs, where they choose to install and manage the application, etc. |
|||
|
|||
#### Logs |
|||
|
|||
By default, DTP Newsroom will write logs to `/var/log/dtp`. The system administrator in test and production environments, or the developer in local environments, manages the logs directory using `DTP_LOG_FILE_PATH` in [.env](docs/env.md). |
|||
|
|||
Log files are written with ANSI color. to view them in a terminal over an SSH connection, use the following command: |
|||
|
|||
```sh |
|||
less -r logfile.log |
|||
``` |
|||
|
|||
In production environments, Supervisor can be used to tail process logs in real time. |
|||
|
|||
To get a list of running processes: |
|||
```sh |
|||
supervisorctl status |
|||
``` |
|||
|
|||
To tail the logs of a running process: |
|||
```sh |
|||
supervisorctl tail -f [process] |
|||
``` |
@ -0,0 +1,29 @@ |
|||
#!/bin/bash |
|||
set -e |
|||
|
|||
echo "Running eslint..." |
|||
pnpm eslint |
|||
|
|||
echo "Cleaning dist directory..." |
|||
rm -Rf dist/* |
|||
|
|||
./build-less |
|||
|
|||
echo "Running Typescript compiler for server..." |
|||
pnpm tsc |
|||
|
|||
echo "Running esbuild compiler for client..." |
|||
pnpm esbuild --bundle src/client/js/newsroom-app.ts --format=esm --sourcemap --minify --outdir=dist/client/js |
|||
|
|||
echo "Copying runtime assets to dist..." |
|||
|
|||
mkdir -p dist/app/templates |
|||
cp -R src/app/templates/* dist/app/templates/ |
|||
|
|||
mkdir -p dist/client/fonts |
|||
cp -R src/client/fonts/* dist/client/fonts/ |
|||
|
|||
mkdir -p dist/client/img |
|||
cp -R src/client/img/* dist/client/img/ |
|||
|
|||
echo "Build finished" |
@ -0,0 +1,8 @@ |
|||
#!/bin/bash |
|||
set -e |
|||
|
|||
echo "Running Less to compile site CSS (dark theme)" |
|||
pnpm lessc src/client/less/newsroom-dark.less dist/client/css/newsroom-dark.css |
|||
|
|||
echo "Running Less to compile site CSS (light theme)" |
|||
pnpm lessc src/client/less/newsroom-light.less dist/client/css/newsroom-light.css |
@ -0,0 +1,95 @@ |
|||
# Environment Variables |
|||
|
|||
The Newsroom Web application and Newsroom Worker processes use environment variables to control program execution options. |
|||
|
|||
A TypeScript interface is provided for accessing these values at runtime. |
|||
|
|||
```ts |
|||
import env from "config/env.ts"; |
|||
``` |
|||
|
|||
A file named `.env` in the project root directory is read at startup to set the values. |
|||
|
|||
## Site Configuration |
|||
The Control Node offers an ExpressJS-based Web application a test operator uses to control test execution. These variables control the identity of that server and some of its networking details. |
|||
|
|||
### DTP_SITE_NAME |
|||
The name of the site. |
|||
|
|||
### DTP_SITE_NAME_SHORT |
|||
The short name of the site. |
|||
|
|||
### DTP_SITE_DESCRIPTION |
|||
A description of the site. |
|||
|
|||
### DTP_SITE_DOMAIN_KEY |
|||
The production domain on which the DTP Newsroom Web application will be hosted. |
|||
|
|||
### DTP_SITE_HOST |
|||
The hostname:port at which the DTP Newsroom Web application is bound. |
|||
|
|||
## MongoDB Configuration |
|||
|
|||
### DTP_MONGODB_HOST |
|||
The hostname of the MongoDB database server (can be localhost). |
|||
|
|||
### DTP_MONGODB_DATABASE |
|||
The name of the database in which DTP Newsroom data is being managed. |
|||
|
|||
## Redis Configuration |
|||
|
|||
### DTP_REDIS_HOST |
|||
The hostname of the host providing Redis services. |
|||
|
|||
### DTP_REDIS_PORT |
|||
The TCP port number at which Redis is bound on `$DTP_REDIS_HOST`. |
|||
|
|||
### DTP_REDIS_PASSWORD |
|||
The authentication password to be presented to Redis when connecting. |
|||
|
|||
### DTP_REDIS_KEY_PREFIX |
|||
A string prefix to be prepended to all keys by the process being managed. |
|||
|
|||
### DTP_REDIS_LAZYCONNECT |
|||
When set to `enabled`, use Redis' lazy connection strategy. |
|||
|
|||
## Control Node HTTPS Server |
|||
These options control network options for the Control Node ExpressJS Web application. |
|||
|
|||
### DTP_HTTPS |
|||
When set to `enabled` the service will bind and provide the ExpressJS Web application. |
|||
|
|||
### DTP_HTTPS_ADDR |
|||
The hostname or IP address to which the Web application will bind for service. |
|||
|
|||
### DTP_HTTPS_PORT |
|||
The TCP port number to which the Web application will bind for service. |
|||
|
|||
### DTP_HTTPS_BACKLOG |
|||
The TCP connection backlog (0..256) to provide for the Web application. |
|||
|
|||
### DTP_HTTPS_KEY_FILE |
|||
The private key file to be used when initializing SSL/TLS. |
|||
|
|||
### DTP_HTTPS_CRT_FILE |
|||
The certificate file to be used when initializing SSL/TLS. |
|||
|
|||
## Log Configuration |
|||
|
|||
### DTP_LOG_CONSOLE |
|||
When set to `enabled`, TTY console output will be generated by the process. |
|||
|
|||
### DTP_LOG_FILE |
|||
When set to `enabled`, file output will be generated by the process. |
|||
|
|||
### DTP_LOG_FILE_PATH |
|||
A string specifying a directory path into which DTP Newsroom process log files will be written (when enabled). |
|||
|
|||
### DTP_LOG_DEBUG |
|||
When set to `enabled`, debug level messages will be written to the log. |
|||
|
|||
### DTP_LOG_INFO |
|||
When set to `enabled`, info-level messages will be written to the log. |
|||
|
|||
### DTP_LOG_WARN |
|||
When set to `enabled`, warn-level messages will be written to the log. |
@ -0,0 +1,50 @@ |
|||
# DTP Newsroom Web Application |
|||
|
|||
The Web application provides an ExpressJS-based HTTP interface made of application routes that process mostly GET and POST requests. |
|||
|
|||
## Managing The Server |
|||
|
|||
Follow the instructions in [README.md](../README.md) to configure a host for running DTP Newsroom including the configuration of [supervisord](https://supervisord.org/) to start and manage the execution of the `newsroom-web` process. |
|||
|
|||
Refer to the [.env](./env.md) documentation for information about environment variables used to control `newsroom-web` in your environment. |
|||
|
|||
You will need to decide on an IP address and TCP port number for `newsroom-web`. The default is 8000. |
|||
|
|||
### pnpm start-control |
|||
|
|||
The command `pnpm start-web` will run a full build and start the target, but it is not intended for use in production environments where process monitoring, automatic restarts, and more are needed. The command can be used to quickly test the configuration of a host's `.env` file, but servers shouldn't be left running as `pnpm start-web` for long-term production service. |
|||
|
|||
### Controlling The Server With Supervisor |
|||
If you are suing the provided Supervisor config files unaltered, the following commands can be used to start, stop, restart, and monitor the `newsroom-web` process. |
|||
|
|||
```sh |
|||
sudo supervisorctl start newsroom-web |
|||
sudo supervisorctl stop newsroom-web |
|||
sudo supervisorctl restart newsroom-web |
|||
sudo supervisorctl tail -f newsroom-web |
|||
``` |
|||
|
|||
## Accessing The Web Application |
|||
|
|||
`newsroom-web` provides an ExpressJS-based Web app for browsing generated news content. Only HTTPS is offered (it does not bind an HTTP server). |
|||
|
|||
### User Account |
|||
|
|||
The system does have its own user account management service, and supports OAuth2 through a variety of providers. The system will use the email address discovered during OAuth2 as the new user's email address. |
|||
|
|||
Whether created through OAuth2 or direct, Users can change their email address. They will have to re-verify their email address if changed, and their User account record loses email-verified status if changed until verified. |
|||
|
|||
Users can self-serve a re-send of the verification email in Settings. |
|||
|
|||
### Permissions |
|||
|
|||
The system administrator can grant and revoke permissions to User accounts in the System Administration menu. |
|||
|
|||
#### Manage Feeds |
|||
The User can add/remove RSS feeds using their URL. |
|||
|
|||
#### Un-Publish Media |
|||
The User can un-publish content generated by the AI engine, which can sometimes just be too stupid to waste storage space on. Yep. |
|||
|
|||
#### Comment |
|||
The User can comment on media and reply to other people's comments. |
@ -0,0 +1,36 @@ |
|||
# DTP Newsroom Worker |
|||
|
|||
The Newsroom Worker is a process that runs in the background and uses cron jobs to: |
|||
|
|||
1. Fetch news articles |
|||
1. Generate AI summaries of them |
|||
1. Generate AI images from article content |
|||
1. Generate AI voice narration for summary videos |
|||
1. Generate summary videos |
|||
1. Publish summary videos to DTP Newsroom Web |
|||
|
|||
## Managing The Worker |
|||
|
|||
Follow the instructions in [README.md](../README.md) to configure a host for running DTP Newsroom including the configuration of [supervisord](https://supervisord.org/) to start and manage the execution of the `newsroom-worker` process. |
|||
|
|||
Refer to the [.env](./env.md) documentation for information about environment variables used to control `newsroom-worker` in your environment. |
|||
|
|||
The worker does not bind a TCP port and provide a Web interface. It is mostly driven by cron, and processes Bull jobs. It will communicate directly with the database, Redis, and S3 storage. It writes a log file for auditing, diagnostics, and reporting. |
|||
|
|||
## Storage |
|||
The worker requires access to S3-compatible storage and configured buckets for use while processing the news articles. |
|||
|
|||
## MongoDB Database |
|||
The worker requires access to the MongoDB database for use while processing the news articles and analytics. |
|||
|
|||
## Redis |
|||
The worker requires access to Redis to implement Bull queue jobs that ingest new feeds and process other jobs. |
|||
|
|||
## Local Storage |
|||
The worker requires access to gigabytes of local temporary storage for use while rendering news story summaries and videos. The worker will allocate space on local storage while processing a job, then remove the temporary data and generated artifacts once uploaded to S3 for distribution. |
|||
|
|||
## Output Traffic |
|||
The worker requires the ability to make outbound HTTP requests and receive responses while calling various APIs used by the application to generate AI content. |
|||
|
|||
## Graphics Processing Unit (GPU) |
|||
The worker requires access to a compatible GPU for use while rendering content. The GPU will be used to run a text-to-speech AI model, and also to render h.264 videos using FFMPEG. |
@ -0,0 +1,8 @@ |
|||
{ |
|||
"folders": [ |
|||
{ |
|||
"path": "." |
|||
} |
|||
], |
|||
"settings": {} |
|||
} |
@ -0,0 +1,34 @@ |
|||
import globals from "globals"; |
|||
import pluginJs from "@eslint/js"; |
|||
import tseslint from "typescript-eslint"; |
|||
|
|||
export default [ |
|||
{ |
|||
"languageOptions": { |
|||
"globals": { |
|||
...globals.browser, |
|||
...globals.node, |
|||
}, |
|||
}, |
|||
"rules": { |
|||
"@typescript-eslint/no-unused-vars": [ |
|||
"error", |
|||
{ argsIgnorePattern: "^_" }, |
|||
], |
|||
"no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], |
|||
"no-process-env": "error", |
|||
"semi": "error", |
|||
}, |
|||
}, |
|||
{ |
|||
"ignores": [ |
|||
"dist", |
|||
"data/minio", |
|||
"docs", |
|||
"node_modules", |
|||
"src/app/services/lib/edit-with-vi.ts", |
|||
], |
|||
}, |
|||
pluginJs.configs.recommended, |
|||
...tseslint.configs.recommended, |
|||
]; |
@ -0,0 +1,444 @@ |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET / HTTP/1.1" 200 6779 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413109 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 404 195 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 200 18480 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 404 197 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 404 195 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-16x16.png?v=0.1.0 HTTP/1.1" 404 195 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-96x96.png?v=0.1.0 HTTP/1.1" 404 195 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-192x192.png?v=0.1.0 HTTP/1.1" 404 197 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-512x512.png?v=0.1.0 HTTP/1.1" 404 197 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-384x384.png?v=0.1.0 HTTP/1.1" 404 197 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /welcome HTTP/1.1" 200 7716 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 404 195 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-256x256.png HTTP/1.1" 404 197 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /fontawesome/webfonts/fa-brands-400.woff2 HTTP/1.1" 200 118684 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 404 197 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:14 +0000] "GET /auth/google HTTP/1.1" 500 6814 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:14 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/auth/google" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:14 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/auth/google" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:14 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 404 195 "https://localhost:3000/auth/google" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:14 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/auth/google" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:14 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 404 197 "https://localhost:3000/auth/google" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:17 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 404 197 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:21 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:52:21 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET / HTTP/1.1" 200 6779 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413109 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 200 18480 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:05 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:06 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:06 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:53:06 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET / HTTP/1.1" 200 6779 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:03 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET / HTTP/1.1" 200 6779 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413123 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:54:58 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET / HTTP/1.1" 200 6779 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413145 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:11 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET / HTTP/1.1" 200 6779 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413142 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:25 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET / HTTP/1.1" 200 6779 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413141 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:48 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET / HTTP/1.1" 200 6779 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413142 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:55:54 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET / HTTP/1.1" 200 6779 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:11 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:56:48 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:05 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:08:59:06 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:03:09 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:04:52 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:05:52 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:17 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:18 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:18 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:06:18 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:09:43:07 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:05 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:04:06 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:19:57 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:01 +0000] "GET /feed HTTP/1.1" 404 143 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:03 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:03 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /welcome HTTP/1.1" 200 7713 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-256x256.png HTTP/1.1" 200 108642 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /fontawesome/webfonts/fa-brands-400.woff2 HTTP/1.1" 200 118684 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:04 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /welcome/signup HTTP/1.1" 200 9521 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /welcome/signup/captcha HTTP/1.1" 200 - "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:07 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/welcome/signup" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [31/Jan/2025:10:20:09 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET / HTTP/1.1" 200 6776 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /pretty-checkbox/pretty-checkbox.min.css?v=0.1.0 HTTP/1.1" 200 19286 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /fontawesome/css/all.min.css?v=0.1.0 HTTP/1.1" 200 73890 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /uikit/js/uikit-icons.min.js?v=0.1.0 HTTP/1.1" 200 70080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 200 11470 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413138 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /uikit/js/uikit.min.js?v=0.1.0 HTTP/1.1" 200 149741 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 200 151521 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 200 134916 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /fontawesome/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /dayjs/dayjs.min.js?v=0.1.0 HTTP/1.1" 200 7160 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /socket.io/socket.io.js?v=0.1.0 HTTP/1.1" 200 154232 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /numeral/numeral.min.js?v=0.1.0 HTTP/1.1" 200 11444 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:22 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /welcome HTTP/1.1" 200 7713 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-256x256.png HTTP/1.1" 200 108642 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /fontawesome/webfonts/fa-brands-400.woff2 HTTP/1.1" 200 118684 "https://localhost:3000/fontawesome/css/all.min.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:44:36 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /welcome HTTP/1.1" 200 7488 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-256x256.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:48:43 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /welcome HTTP/1.1" 200 7440 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-256x256.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:49:48 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /welcome HTTP/1.1" 200 7425 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-256x256.png HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:17 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/welcome" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:29 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413114 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:50:50 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413080 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:51:08 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413084 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 200 18480 "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:52:40 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413108 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:00 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413148 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:28 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413165 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:53:48 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413188 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:02 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:26 +0000] "GET / HTTP/1.1" 200 6776 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:26 +0000] "GET /dist/js/newsroom-app.js?v=0.1.0 HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:26 +0000] "GET /img/newsroom-header.jpg HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:26 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png HTTP/1.1" 304 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:26 +0000] "GET /dist/css/newsroom-dark.css?v=0.1.0 HTTP/1.1" 200 413154 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:27 +0000] "GET /fonts/calderious.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:27 +0000] "GET /fonts/comfortaa-bold.ttf HTTP/1.1" 304 - "https://localhost:3000/dist/css/newsroom-dark.css?v=0.1.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:27 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-32x32.png?v=0.1.0 HTTP/1.1" 200 3013 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:27 +0000] "GET /manifest.json?v=0.1.0 HTTP/1.1" 200 - "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:27 +0000] "GET /img/icon/newsroom.digitaltelepresence.com/icon-144x144.png HTTP/1.1" 200 39065 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
|||
127.0.0.1 - - [01/Feb/2025:01:54:27 +0000] "GET /img/screenshots/manifest-wide.png HTTP/1.1" 200 516032 "https://localhost:3000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" |
@ -0,0 +1,99 @@ |
|||
{"timestamp":"2025-02-01T01:44:14.174Z","level":"info","message":"connecting to MongoDB","metadata":{"uri":"mongodb://localhost:27017/dtp-newsroom"}} |
|||
{"timestamp":"2025-02-01T01:44:14.198Z","level":"debug","message":"connected to MongoDB","metadata":{"id":0}} |
|||
{"timestamp":"2025-02-01T01:44:14.199Z","level":"info","message":"connecting to Redis","metadata":{"host":"localhost","port":6379,"keyPrefix":"dnews"}} |
|||
{"timestamp":"2025-02-01T01:44:14.200Z","level":"debug","message":"Redis connected"} |
|||
{"timestamp":"2025-02-01T01:44:14.203Z","level":"info","message":"loading models","metadata":{"basePath":"/home/rob/projects/dtp/dtp-newsbot/src/app/models"}} |
|||
{"timestamp":"2025-02-01T01:44:14.903Z","level":"info","message":"model loaded","metadata":{"name":"ConnectToken"}} |
|||
{"timestamp":"2025-02-01T01:44:14.927Z","level":"info","message":"model loaded","metadata":{"name":"CsrfToken"}} |
|||
{"timestamp":"2025-02-01T01:44:14.957Z","level":"info","message":"model loaded","metadata":{"name":"EmailBlacklist"}} |
|||
{"timestamp":"2025-02-01T01:44:14.988Z","level":"info","message":"model loaded","metadata":{"name":"EmailLog"}} |
|||
{"timestamp":"2025-02-01T01:44:15.029Z","level":"info","message":"model loaded","metadata":{"name":"EmailVerify"}} |
|||
{"timestamp":"2025-02-01T01:44:15.270Z","level":"info","message":"model loaded","metadata":{"name":"FeedItem"}} |
|||
{"timestamp":"2025-02-01T01:44:15.279Z","level":"info","message":"model loaded","metadata":{"name":"Feed"}} |
|||
{"timestamp":"2025-02-01T01:44:15.309Z","level":"info","message":"model loaded","metadata":{"name":"Image"}} |
|||
{"timestamp":"2025-02-01T01:44:15.650Z","level":"info","message":"model loaded","metadata":{"name":"DtpProcessStatsHistory"}} |
|||
{"timestamp":"2025-02-01T01:44:15.686Z","level":"info","message":"model loaded","metadata":{"name":"DtpProcess"}} |
|||
{"timestamp":"2025-02-01T01:44:15.716Z","level":"info","message":"model loaded","metadata":{"name":"User"}} |
|||
{"timestamp":"2025-02-01T01:44:15.716Z","level":"debug","message":"loading services","metadata":{"basePath":"/home/rob/projects/dtp/dtp-newsbot/src/app/services"}} |
|||
{"timestamp":"2025-02-01T01:44:15.732Z","level":"info","message":"loading service","metadata":{"script":"cache.ts","name":"CacheService","slug":"cache"}} |
|||
{"timestamp":"2025-02-01T01:44:15.786Z","level":"info","message":"loading service","metadata":{"script":"crypto.ts","name":"CryptoService","slug":"crypto"}} |
|||
{"timestamp":"2025-02-01T01:44:15.818Z","level":"info","message":"loading service","metadata":{"script":"csrf-token.ts","name":"CsrfTokenService","slug":"csrfToken"}} |
|||
{"timestamp":"2025-02-01T01:44:15.824Z","level":"info","message":"loading service","metadata":{"script":"display-engine.ts","name":"DisplayEngineService","slug":"displayEngine"}} |
|||
{"timestamp":"2025-02-01T01:44:15.896Z","level":"info","message":"loading service","metadata":{"script":"email.ts","name":"EmailService","slug":"email"}} |
|||
{"timestamp":"2025-02-01T01:44:15.945Z","level":"info","message":"loading service","metadata":{"script":"image.ts","name":"ImageService","slug":"image"}} |
|||
{"timestamp":"2025-02-01T01:44:15.992Z","level":"info","message":"loading service","metadata":{"script":"job-queue.ts","name":"JobQueueService","slug":"jobQueue"}} |
|||
{"timestamp":"2025-02-01T01:44:16.104Z","level":"info","message":"loading service","metadata":{"script":"minio.ts","name":"MinioService","slug":"minio"}} |
|||
{"timestamp":"2025-02-01T01:44:16.131Z","level":"info","message":"loading service","metadata":{"script":"process.ts","name":"ProcessService","slug":"process"}} |
|||
{"timestamp":"2025-02-01T01:44:16.164Z","level":"info","message":"loading service","metadata":{"script":"session.ts","name":"SessionService","slug":"session"}} |
|||
{"timestamp":"2025-02-01T01:44:16.269Z","level":"info","message":"loading service","metadata":{"script":"sidebar.ts","name":"SidebarService","slug":"sidebar"}} |
|||
{"timestamp":"2025-02-01T01:44:16.300Z","level":"info","message":"loading service","metadata":{"script":"text.ts","name":"TextService","slug":"text"}} |
|||
{"timestamp":"2025-02-01T01:44:16.406Z","level":"info","message":"loading service","metadata":{"script":"user.ts","name":"UserService","slug":"user"}} |
|||
{"timestamp":"2025-02-01T01:44:16.406Z","level":"info","message":"starting CacheService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.406Z","level":"info","message":"starting CryptoService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.406Z","level":"info","message":"starting CsrfTokenService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.406Z","level":"info","message":"starting DisplayEngineService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.407Z","level":"info","message":"starting EmailService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.418Z","level":"info","message":"creating SMTP transport","metadata":{"host":"delta.kc.epik.com","port":465}} |
|||
{"timestamp":"2025-02-01T01:44:16.419Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"welcome.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.480Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"password-reset.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.510Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"newsletter.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.524Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"user-email.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.538Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"welcome.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.544Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"password-reset.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.550Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"newsletter.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.555Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"user-email.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-02-01T01:44:16.562Z","level":"info","message":"starting ImageService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.563Z","level":"info","message":"starting JobQueueService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.563Z","level":"info","message":"starting MinioService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.563Z","level":"info","message":"starting ProcessService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.563Z","level":"info","message":"starting SessionService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.563Z","level":"info","message":"starting SidebarService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.564Z","level":"info","message":"starting TextService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.565Z","level":"info","message":"starting UserService service"} |
|||
{"timestamp":"2025-02-01T01:44:16.582Z","level":"info","message":"registering Web process with the platform","metadata":{"endpoint":{"hostname":"mysterymachine","ip":"127.0.0.1","port":3443}}} |
|||
{"timestamp":"2025-02-01T01:44:16.593Z","level":"info","message":"starting web application server"} |
|||
{"timestamp":"2025-02-01T01:44:16.596Z","level":"info","message":"Creating ExpressJS application"} |
|||
{"timestamp":"2025-02-01T01:44:16.597Z","level":"info","message":"creating HTTP access log","metadata":{"name":"newsroom-access.log","path":"./logs"}} |
|||
{"timestamp":"2025-02-01T01:44:16.600Z","level":"debug","message":"ExpressJS session configuration","metadata":{"name":"mtsess-newsroom.digitaltelepresence.com-development","secret":"5068c24c-b48d-41d0-a35f-6097141c6c61","resave":true,"saveUninitialized":true,"cookie":{"path":"/","httpOnly":true,"secure":true,"sameSite":"strict","maxAge":604800000},"store":{"_events":{},"_eventsCount":0,"client":{},"prefix":"dnews","scanCount":100,"serializer":{},"ttl":86400,"disableTTL":false,"disableTouch":false}}} |
|||
{"timestamp":"2025-02-01T01:44:16.601Z","level":"debug","message":"loading controllers","metadata":{"basePath":"/home/rob/projects/dtp/dtp-newsbot/src/app/controllers"}} |
|||
{"timestamp":"2025-02-01T01:44:17.288Z","level":"info","message":"loading controller","metadata":{"script":"auth.ts","name":"AuthController","slug":"auth"}} |
|||
{"timestamp":"2025-02-01T01:44:17.426Z","level":"info","message":"loading controller","metadata":{"script":"home.ts","name":"HomeController","slug":"home"}} |
|||
{"timestamp":"2025-02-01T01:44:17.563Z","level":"info","message":"loading controller","metadata":{"script":"manifest.ts","name":"ManifestController","slug":"manifest"}} |
|||
{"timestamp":"2025-02-01T01:44:17.760Z","level":"info","message":"loading controller","metadata":{"script":"user.ts","name":"UserController","slug":"user"}} |
|||
{"timestamp":"2025-02-01T01:44:17.901Z","level":"info","message":"loading controller","metadata":{"script":"welcome.ts","name":"WelcomeController","slug":"welcome"}} |
|||
{"timestamp":"2025-02-01T01:44:17.911Z","level":"info","message":"mounting controller","metadata":{"controller":"AuthController","route":"/auth"}} |
|||
{"timestamp":"2025-02-01T01:44:17.911Z","level":"info","message":"mounting controller","metadata":{"controller":"HomeController","route":"/"}} |
|||
{"timestamp":"2025-02-01T01:44:17.911Z","level":"info","message":"mounting controller","metadata":{"controller":"ManifestController","route":"/manifest.json"}} |
|||
{"timestamp":"2025-02-01T01:44:17.911Z","level":"info","message":"mounting controller","metadata":{"controller":"UserController","route":"/user"}} |
|||
{"timestamp":"2025-02-01T01:44:17.911Z","level":"info","message":"mounting controller","metadata":{"controller":"WelcomeController","route":"/welcome"}} |
|||
{"timestamp":"2025-02-01T01:44:17.912Z","level":"info","message":"starting HTTPS server","metadata":{"enabled":true,"address":"127.0.0.1","port":3443,"backlog":16,"keyFile":"./ssl/dtp-newsroom.key","crtFile":"./ssl/dtp-newsroom.crt","uploadPath":"/tmp/dtp-newsroom"}} |
|||
{"timestamp":"2025-02-01T01:44:17.936Z","level":"debug","message":"HTTPS server started","metadata":{"enabled":true,"address":"127.0.0.1","port":3443,"backlog":16,"keyFile":"./ssl/dtp-newsroom.key","crtFile":"./ssl/dtp-newsroom.crt","uploadPath":"/tmp/dtp-newsroom"}} |
|||
{"timestamp":"2025-02-01T01:44:17.936Z","level":"debug","message":"BrowserSync create","metadata":{"options":{"proxy":{"target":"https://localhost:3443/","ws":true},"host":"localhost","open":"local","https":{"key":"/home/rob/projects/dtp/dtp-newsbot/ssl/dtp-newsroom.key","cert":"/home/rob/projects/dtp/dtp-newsbot/ssl/dtp-newsroom.crt"},"port":3000,"cors":true,"ui":{"port":3620},"notify":false,"ghostMode":{"clicks":false,"forms":false,"scroll":true},"logLevel":"info"}}} |
|||
{"timestamp":"2025-02-01T01:44:17.959Z","level":"debug","message":"setting process status","metadata":{"endpoint":{"hostname":"mysterymachine","ip":"127.0.0.1","port":3443},"status":"online"}} |
|||
{"timestamp":"2025-02-01T01:44:17.964Z","level":"info","message":"DtpNewsroomWebProcess:newsroom-web online","metadata":{"bind":{"host":"127.0.0.1","port":3443}}} |
|||
{"timestamp":"2025-02-01T01:44:22.133Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:45:00.215Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:46:00.040Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:47:00.054Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:48:00.062Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:49:00.024Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:50:00.020Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:50:29.263Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:50:50.563Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:51:00.057Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:51:08.324Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:52:00.055Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:52:40.570Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:53:00.050Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:53:00.130Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:53:28.381Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:53:48.685Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:54:00.024Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:54:02.446Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:54:26.828Z","level":"info","message":"session debug","metadata":{"sessionId":"2p7WpqqCEbrnpoNXgiRN2CvZp3Avega-"}} |
|||
{"timestamp":"2025-02-01T01:55:00.025Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:56:00.016Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:57:00.044Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:58:00.074Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:59:00.017Z","level":"debug","message":"reporting web process stats","metadata":{"hostname":"mysterymachine","stats":{"webRequestCount":0,"webErrorCount":0}}} |
|||
{"timestamp":"2025-02-01T01:59:46.895Z","level":"info","message":"SIGINT received (requesting shutdown)"} |
@ -0,0 +1,798 @@ |
|||
{"timestamp":"2025-01-31T14:33:25.038Z","level":"info","message":"connecting to MongoDB","metadata":{"uri":"mongodb://localhost:27017/dtp-newsroom"}} |
|||
{"timestamp":"2025-01-31T14:33:25.059Z","level":"debug","message":"connected to MongoDB","metadata":{"id":0}} |
|||
{"timestamp":"2025-01-31T14:33:25.059Z","level":"info","message":"connecting to Redis","metadata":{"host":"localhost","port":6379,"keyPrefix":"dnews"}} |
|||
{"timestamp":"2025-01-31T14:33:25.061Z","level":"debug","message":"Redis connected"} |
|||
{"timestamp":"2025-01-31T14:33:25.061Z","level":"info","message":"loading models","metadata":{"basePath":"/home/rob/projects/dtp/dtp-newsbot/src/app/models"}} |
|||
{"timestamp":"2025-01-31T14:33:25.768Z","level":"info","message":"model loaded","metadata":{"name":"ConnectToken"}} |
|||
{"timestamp":"2025-01-31T14:33:25.796Z","level":"info","message":"model loaded","metadata":{"name":"CsrfToken"}} |
|||
{"timestamp":"2025-01-31T14:33:25.818Z","level":"info","message":"model loaded","metadata":{"name":"EmailBlacklist"}} |
|||
{"timestamp":"2025-01-31T14:33:25.832Z","level":"info","message":"model loaded","metadata":{"name":"EmailLog"}} |
|||
{"timestamp":"2025-01-31T14:33:25.867Z","level":"info","message":"model loaded","metadata":{"name":"EmailVerify"}} |
|||
{"timestamp":"2025-01-31T14:33:25.873Z","level":"info","message":"model loaded","metadata":{"name":"FeedItem"}} |
|||
{"timestamp":"2025-01-31T14:33:25.874Z","level":"info","message":"model loaded","metadata":{"name":"Feed"}} |
|||
{"timestamp":"2025-01-31T14:33:25.899Z","level":"info","message":"model loaded","metadata":{"name":"Image"}} |
|||
{"timestamp":"2025-01-31T14:33:25.941Z","level":"info","message":"model loaded","metadata":{"name":"DtpProcessStatsHistory"}} |
|||
{"timestamp":"2025-01-31T14:33:25.978Z","level":"info","message":"model loaded","metadata":{"name":"DtpProcess"}} |
|||
{"timestamp":"2025-01-31T14:33:26.024Z","level":"info","message":"model loaded","metadata":{"name":"User"}} |
|||
{"timestamp":"2025-01-31T14:33:26.025Z","level":"debug","message":"loading services","metadata":{"basePath":"/home/rob/projects/dtp/dtp-newsbot/src/app/services"}} |
|||
{"timestamp":"2025-01-31T14:33:26.039Z","level":"info","message":"loading service","metadata":{"script":"cache.ts","name":"CacheService","slug":"cache"}} |
|||
{"timestamp":"2025-01-31T14:33:26.091Z","level":"info","message":"loading service","metadata":{"script":"crypto.ts","name":"CryptoService","slug":"crypto"}} |
|||
{"timestamp":"2025-01-31T14:33:26.120Z","level":"info","message":"loading service","metadata":{"script":"csrf-token.ts","name":"CsrfTokenService","slug":"csrfToken"}} |
|||
{"timestamp":"2025-01-31T14:33:26.126Z","level":"info","message":"loading service","metadata":{"script":"display-engine.ts","name":"DisplayEngineService","slug":"displayEngine"}} |
|||
{"timestamp":"2025-01-31T14:33:26.185Z","level":"info","message":"loading service","metadata":{"script":"email.ts","name":"EmailService","slug":"email"}} |
|||
{"timestamp":"2025-01-31T14:33:26.227Z","level":"info","message":"loading service","metadata":{"script":"image.ts","name":"ImageService","slug":"image"}} |
|||
{"timestamp":"2025-01-31T14:33:26.275Z","level":"info","message":"loading service","metadata":{"script":"job-queue.ts","name":"JobQueueService","slug":"jobQueue"}} |
|||
{"timestamp":"2025-01-31T14:33:26.362Z","level":"info","message":"loading service","metadata":{"script":"minio.ts","name":"MinioService","slug":"minio"}} |
|||
{"timestamp":"2025-01-31T14:33:26.388Z","level":"info","message":"loading service","metadata":{"script":"process.ts","name":"ProcessService","slug":"process"}} |
|||
{"timestamp":"2025-01-31T14:33:26.423Z","level":"info","message":"loading service","metadata":{"script":"session.ts","name":"SessionService","slug":"session"}} |
|||
{"timestamp":"2025-01-31T14:33:26.539Z","level":"info","message":"loading service","metadata":{"script":"sidebar.ts","name":"SidebarService","slug":"sidebar"}} |
|||
{"timestamp":"2025-01-31T14:33:26.570Z","level":"info","message":"loading service","metadata":{"script":"text.ts","name":"TextService","slug":"text"}} |
|||
{"timestamp":"2025-01-31T14:33:26.667Z","level":"info","message":"loading service","metadata":{"script":"user.ts","name":"UserService","slug":"user"}} |
|||
{"timestamp":"2025-01-31T14:33:26.667Z","level":"info","message":"starting CacheService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.668Z","level":"info","message":"starting CryptoService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.668Z","level":"info","message":"starting CsrfTokenService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.668Z","level":"info","message":"starting DisplayEngineService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.668Z","level":"info","message":"starting EmailService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.678Z","level":"info","message":"creating SMTP transport","metadata":{"host":"delta.kc.epik.com","port":465}} |
|||
{"timestamp":"2025-01-31T14:33:26.679Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"welcome.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.734Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"password-reset.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.760Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"newsletter.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.773Z","level":"debug","message":"loading application template","metadata":{"type":"html","name":"user-email.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.786Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"welcome.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.792Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"password-reset.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.798Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"newsletter.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.803Z","level":"debug","message":"loading application template","metadata":{"type":"text","name":"user-email.pug","root":"/home/rob/projects/dtp/dtp-newsbot/src"}} |
|||
{"timestamp":"2025-01-31T14:33:26.811Z","level":"info","message":"starting ImageService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.811Z","level":"info","message":"starting JobQueueService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.811Z","level":"info","message":"starting MinioService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.811Z","level":"info","message":"starting ProcessService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.811Z","level":"info","message":"starting SessionService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.812Z","level":"info","message":"starting SidebarService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.812Z","level":"info","message":"starting TextService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.812Z","level":"info","message":"starting UserService service"} |
|||
{"timestamp":"2025-01-31T14:33:26.833Z","level":"info","message":"cleaning job queue","metadata":{"queue":"newsroom","count":0}} |
|||
{"timestamp":"2025-01-31T14:33:26.834Z","level":"info","message":"registering Web process with the platform","metadata":{"endpoint":{"hostname":"mysterymachine","ip":"127.0.0.1","port":3443}}} |
|||
{"timestamp":"2025-01-31T14:33:26.847Z","level":"info","message":"registering ingest-entry job processor"} |
|||
{"timestamp":"2025-01-31T14:33:26.847Z","level":"info","message":"registering cron","metadata":{"job":"job:fetch-news"}} |
|||
{"timestamp":"2025-01-31T14:33:26.856Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T14:33:26.856Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T14:33:26.950Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T14:33:26.950Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T14:33:26.955Z","level":"debug","message":"setting process status","metadata":{"endpoint":{"hostname":"mysterymachine","ip":"127.0.0.1","port":3443},"status":"online"}} |
|||
{"timestamp":"2025-01-31T14:33:26.959Z","level":"info","message":"ingesting news article","metadata":{"jobId":"219","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T14:33:26.961Z","level":"info","message":"NewsroomWorker:newsroom-worker online"} |
|||
{"timestamp":"2025-01-31T14:33:27.607Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T14:34:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:35:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:36:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:37:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:38:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:39:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:40:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:41:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:42:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:43:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:44:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:45:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:46:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:47:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:48:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:49:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:50:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:51:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:52:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:53:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:54:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:55:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:56:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:57:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:58:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T14:59:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:00:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:00:00.009Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T15:00:00.009Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T15:00:00.088Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T15:00:00.089Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T15:00:00.090Z","level":"info","message":"ingesting news article","metadata":{"jobId":"220","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T15:00:00.681Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T15:01:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:02:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:03:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:04:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:05:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:06:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:07:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:08:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:09:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:10:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:11:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:12:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:13:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:14:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:15:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:16:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:17:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:18:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:19:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:20:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:21:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:22:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:23:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:24:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:25:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:26:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:27:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:28:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:29:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:30:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:31:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:32:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:33:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:34:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:35:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:36:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:37:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:38:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:39:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:40:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:41:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:42:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:43:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:44:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:45:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:46:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:47:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:48:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:49:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:50:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:51:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:52:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:53:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:54:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:55:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:56:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:57:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:58:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T15:59:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:00:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:00:00.010Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T16:00:00.011Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T16:00:00.098Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T16:00:00.098Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T16:00:00.099Z","level":"info","message":"ingesting news article","metadata":{"jobId":"221","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T16:00:00.587Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T16:01:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:02:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:03:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:04:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:05:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:06:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:07:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:08:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:09:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:10:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:11:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:12:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:13:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:14:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:15:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:16:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:17:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:18:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:19:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:20:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:21:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:22:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:23:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:24:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:25:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:26:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:27:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:28:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:29:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:30:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:31:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:32:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:33:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:34:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:35:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:36:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:37:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:38:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:39:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:40:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:41:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:42:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:43:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:44:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:45:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:46:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:47:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:48:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:49:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:50:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:51:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:52:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:53:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:54:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:55:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:56:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:57:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:58:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T16:59:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:00:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:00:00.006Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T17:00:00.006Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T17:00:00.064Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T17:00:00.065Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T17:00:00.066Z","level":"info","message":"ingesting news article","metadata":{"jobId":"222","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T17:00:00.864Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T17:01:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:02:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:03:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:04:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:05:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:06:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:07:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:08:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:09:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:10:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:11:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:12:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:13:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:14:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:15:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:16:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:17:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:18:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:19:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:20:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:21:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:22:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:23:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:24:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:25:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:26:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:27:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:28:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:29:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:30:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:31:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:32:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:33:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:34:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:35:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:36:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:37:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:38:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:39:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:40:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:41:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:42:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:43:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:44:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:45:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:46:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:47:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:48:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:49:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:50:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:51:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:52:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:53:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:54:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:55:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:56:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:57:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:58:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T17:59:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:00:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:00:00.007Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T18:00:00.007Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T18:00:00.075Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T18:00:00.076Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T18:00:00.078Z","level":"info","message":"ingesting news article","metadata":{"jobId":"223","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T18:00:10.700Z","level":"info","message":"ingesting news article","metadata":{"jobId":"223","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T18:00:16.148Z","level":"info","message":"ingesting news article","metadata":{"jobId":"223","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T18:01:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:02:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:03:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:04:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:05:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:06:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:07:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:08:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:09:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:10:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:11:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:12:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:13:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:14:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:15:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:16:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:17:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:18:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:19:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:20:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:21:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:22:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:23:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:24:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:25:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:26:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:27:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:28:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:29:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:30:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:31:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:32:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:33:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:34:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:35:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:36:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:37:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:38:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:39:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:40:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:41:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:42:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:43:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:44:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:45:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:46:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:47:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:48:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:49:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:50:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:51:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:52:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:53:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:54:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:55:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:56:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:57:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:58:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T18:59:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:00:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:00:00.007Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T19:00:00.007Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T19:00:00.079Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T19:00:00.079Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T19:00:00.081Z","level":"info","message":"ingesting news article","metadata":{"jobId":"224","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T19:00:00.660Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T19:01:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:02:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:03:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:04:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:05:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:06:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:07:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:08:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:09:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:10:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:11:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:12:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:13:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:14:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:15:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:16:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:17:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:18:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:19:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:20:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:21:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:22:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:23:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:24:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:25:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:26:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:27:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:28:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:29:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:30:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:31:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:32:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:33:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:34:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:35:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:36:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:37:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:38:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:39:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:40:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:41:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:42:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:43:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:44:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:45:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:46:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:47:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:48:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:49:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:50:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:51:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:52:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:53:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:54:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:55:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:56:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:57:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:58:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T19:59:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:00:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:00:00.032Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T20:00:00.032Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T20:00:00.133Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T20:00:00.134Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T20:00:00.137Z","level":"info","message":"ingesting news article","metadata":{"jobId":"225","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T20:00:00.685Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T20:01:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:02:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:03:00.015Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:04:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:05:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:06:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:07:00.015Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:08:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:09:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:10:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:11:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:12:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:13:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:14:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:15:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:16:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:17:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:18:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:19:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:20:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:21:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:22:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:23:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:24:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:25:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:26:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:27:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:28:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:29:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:30:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:31:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:32:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:33:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:34:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:35:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:36:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:37:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:38:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:39:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:40:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:41:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:42:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:43:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:44:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:45:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:46:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:47:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:48:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:49:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:50:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:51:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:52:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:53:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:54:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:55:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:56:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:57:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:58:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T20:59:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:00:00.024Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:00:00.028Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T21:00:00.029Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T21:00:00.117Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T21:00:00.117Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T21:00:00.120Z","level":"info","message":"ingesting news article","metadata":{"jobId":"226","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T21:00:00.702Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T21:01:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:02:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:03:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:04:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:05:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:06:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:07:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:08:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:09:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:10:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:11:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:12:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:13:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:14:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:15:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:16:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:17:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:18:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:19:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:20:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:21:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:22:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:23:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:24:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:25:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:26:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:27:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:28:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:29:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:30:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:31:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:32:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:33:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:34:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:35:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:36:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:37:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:38:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:39:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:40:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:41:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:42:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:43:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:44:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:45:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:46:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:47:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:48:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:49:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:50:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:51:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:52:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:53:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:54:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:55:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:56:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:57:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:58:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T21:59:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:00:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:00:00.036Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T22:00:00.036Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T22:00:00.210Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T22:00:00.211Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"What Los Angeles Could Learn From Great Fires of the Past","link":"https://www.nytimes.com/2025/01/24/upshot/los-angeles-urban-fire-history.html"}} |
|||
{"timestamp":"2025-01-31T22:00:00.214Z","level":"info","message":"ingesting news article","metadata":{"jobId":"227","title":"What Los Angeles Could Learn From Great Fires of the Past"}} |
|||
{"timestamp":"2025-01-31T22:00:00.348Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T22:01:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:02:00.016Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:03:00.015Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:04:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:05:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:06:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:07:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:08:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:09:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:10:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:11:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:12:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:13:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:14:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:15:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:16:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:17:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:18:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:19:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:20:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:21:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:22:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:23:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:24:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:25:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:26:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:27:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:28:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:29:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:30:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:31:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:32:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:33:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:34:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:35:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:36:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:37:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:38:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:39:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:40:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:41:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:42:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:43:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:44:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:45:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:46:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:47:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:48:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:49:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:50:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:51:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:52:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:53:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:54:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:55:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:56:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:57:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:58:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T22:59:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:00:00.026Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:00:00.031Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-01-31T23:00:00.031Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-01-31T23:00:00.109Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-01-31T23:00:00.110Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"Trump Raises New Threat to Sanctuary Cities: Blocking Transportation Dollars","link":"https://www.nytimes.com/2025/01/31/upshot/sanctuary-cities-trump-transportation-funds.html"}} |
|||
{"timestamp":"2025-01-31T23:00:00.111Z","level":"info","message":"ingesting news article","metadata":{"jobId":"228","title":"Trump Raises New Threat to Sanctuary Cities: Blocking Transportation Dollars"}} |
|||
{"timestamp":"2025-01-31T23:00:00.293Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-01-31T23:01:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:02:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:03:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:04:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:05:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:06:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:07:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:08:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:09:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:10:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:11:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:12:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:13:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:14:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:15:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:16:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:17:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:18:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:19:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:20:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:21:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:22:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:23:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:24:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:25:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:26:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:27:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:28:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:29:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:30:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:31:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:32:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:33:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:34:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:35:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:36:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:37:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:38:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:39:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:40:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:41:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:42:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:43:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:44:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:45:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:46:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:47:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:48:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:49:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:50:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:51:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:52:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:53:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:54:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:55:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:56:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:57:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:58:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-01-31T23:59:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:00:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:00:00.034Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-02-01T00:00:00.034Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-02-01T00:00:00.094Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-02-01T00:00:00.094Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"Trump Raises New Threat to Sanctuary Cities: Blocking Transportation Dollars","link":"https://www.nytimes.com/2025/01/31/upshot/sanctuary-cities-trump-transportation-funds.html"}} |
|||
{"timestamp":"2025-02-01T00:00:00.095Z","level":"info","message":"ingesting news article","metadata":{"jobId":"229","title":"Trump Raises New Threat to Sanctuary Cities: Blocking Transportation Dollars"}} |
|||
{"timestamp":"2025-02-01T00:00:00.247Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-02-01T00:01:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:02:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:03:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:04:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:05:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:06:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:07:00.013Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:08:00.014Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:09:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:10:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:11:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:12:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:13:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:14:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:15:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:16:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:17:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:18:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:19:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:20:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:21:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:22:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:23:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:24:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:25:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:26:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:27:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:28:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:29:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:30:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:31:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:32:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:33:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:34:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:35:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:36:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:37:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:38:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:39:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:40:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:41:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:42:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:43:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:44:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:45:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:46:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:47:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:48:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:49:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:50:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:51:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:52:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:53:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:54:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:55:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:56:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:57:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:58:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T00:59:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:00:00.026Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:00:00.032Z","level":"info","message":"running news fetch job","metadata":{"title":"NY Times: The Upshot!"}} |
|||
{"timestamp":"2025-02-01T01:00:00.033Z","level":"debug","message":"fetching RSS feed content","metadata":{"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","Referrer":"https://rss.nytimes.com/services/xml/rss/nyt/Upshot.xml"}}} |
|||
{"timestamp":"2025-02-01T01:00:00.131Z","level":"debug","message":"feed loaded","metadata":{"feed":{"title":"NYT > The Upshot"}}} |
|||
{"timestamp":"2025-02-01T01:00:00.132Z","level":"info","message":"scheduling ingest for entry","metadata":{"title":"Trump Raises New Threat to Sanctuary Cities: Blocking Transportation Dollars","link":"https://www.nytimes.com/2025/01/31/upshot/sanctuary-cities-trump-transportation-funds.html"}} |
|||
{"timestamp":"2025-02-01T01:00:00.135Z","level":"info","message":"ingesting news article","metadata":{"jobId":"230","title":"Trump Raises New Threat to Sanctuary Cities: Blocking Transportation Dollars"}} |
|||
{"timestamp":"2025-02-01T01:00:00.306Z","level":"debug","message":"body plain text paragraphs"} |
|||
{"timestamp":"2025-02-01T01:01:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:02:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:03:00.017Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:04:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:05:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:06:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:07:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:08:00.010Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:09:00.004Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:10:00.005Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:11:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:12:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:13:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:14:00.012Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:15:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:16:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:17:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:18:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:19:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:20:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:21:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:22:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:23:00.001Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:24:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:25:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:26:00.007Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:27:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:28:00.011Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:29:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:30:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:31:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:32:00.003Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:33:00.008Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:34:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:35:00.009Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:36:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:37:00.002Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:38:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:39:00.006Z","level":"debug","message":"reporting worker process stats","metadata":{"hostname":"mysterymachine","workerStats":{"jobRunCount":0},"processStats":{"cpu":0,"memory":0,"storage":0,"netBytesTx":0,"netBytesRx":0}}} |
|||
{"timestamp":"2025-02-01T01:39:37.896Z","level":"info","message":"SIGINT received (requesting shutdown)"} |
@ -0,0 +1,15 @@ |
|||
{ |
|||
"signal": "SIGINT", |
|||
"verbose": true, |
|||
"execMap": { |
|||
"js": "node", |
|||
"ts": "node --import ./register.js --no-warnings" |
|||
}, |
|||
"ignore": [ |
|||
"dist", |
|||
"data", |
|||
"logs", |
|||
"src/client/**/*", |
|||
"node_modules/**/*" |
|||
] |
|||
} |
@ -0,0 +1,112 @@ |
|||
{ |
|||
"name": "dtp-newsroom", |
|||
"version": "0.1.0", |
|||
"description": "A news publishing engine powered by RSS and AI.", |
|||
"type": "module", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"start-web": "node --import ./register.js --no-warnings ./src/newsroom-web.ts", |
|||
"web-dev": "nodemon ./src/newsroom-web.ts", |
|||
"start-worker": "node --import ./register.js --no-warnings ./src/workers/newsroom.ts", |
|||
"worker-dev": "nodemon ./src/workers/newsroom.ts", |
|||
"test": "echo \"Error: no test specified\" && exit 1" |
|||
}, |
|||
"keywords": [ |
|||
"news", |
|||
"ai", |
|||
"video" |
|||
], |
|||
"author": { |
|||
"name": "Rob Colbert", |
|||
"email": "[email protected]", |
|||
"url": "https://digitaltelepresence.com/" |
|||
}, |
|||
"license": "UNLICENSED", |
|||
"dependencies": { |
|||
"@extractus/feed-extractor": "^7.1.3", |
|||
"@fortawesome/fontawesome-free": "^6.7.2", |
|||
"@socket.io/redis-adapter": "^8.3.0", |
|||
"ansicolor": "^2.0.3", |
|||
"body-parser": "^1.20.3", |
|||
"bull": "^4.16.5", |
|||
"compression": "^1.7.5", |
|||
"connect-redis": "^8.0.1", |
|||
"cookie-parser": "^1.4.7", |
|||
"cron": "^3.5.0", |
|||
"dayjs": "^1.11.13", |
|||
"diacritics": "^1.3.0", |
|||
"diskusage": "^1.2.0", |
|||
"disposable-email-provider-domains": "^1.0.9", |
|||
"dotenv": "^16.4.7", |
|||
"email-domain-check": "^1.1.4", |
|||
"email-validator": "^2.0.4", |
|||
"express": "^4.21.2", |
|||
"express-session": "^1.18.1", |
|||
"ioredis": "^5.4.2", |
|||
"jsdom": "^26.0.0", |
|||
"marked": "^15.0.6", |
|||
"method-override": "^3.0.0", |
|||
"mime": "^4.0.6", |
|||
"minio": "^8.0.4", |
|||
"mongoose": "^8.9.5", |
|||
"morgan": "^1.10.0", |
|||
"multer": "1.4.5-lts.1", |
|||
"nodemailer": "^6.10.0", |
|||
"numeral": "^2.0.6", |
|||
"openai": "^4.81.0", |
|||
"passport": "^0.7.0", |
|||
"passport-google-oauth20": "^2.0.0", |
|||
"passport-local": "^1.0.0", |
|||
"pretty-checkbox": "^3.0.3", |
|||
"pug": "^3.0.3", |
|||
"randomstring": "^1.3.1", |
|||
"rotating-file-stream": "^3.2.5", |
|||
"sharp": "^0.33.5", |
|||
"shoetest": "^1.2.2", |
|||
"socket.io": "^4.8.1", |
|||
"stats-lite": "^2.2.0", |
|||
"striptags": "^3.2.0", |
|||
"svg-captcha": "^1.4.0", |
|||
"systeminformation": "^5.25.11", |
|||
"uikit": "^3.22.4", |
|||
"user-agents": "^1.1.436", |
|||
"uuid": "^11.0.5" |
|||
}, |
|||
"devDependencies": { |
|||
"@eslint/js": "^9.18.0", |
|||
"@types/browser-sync": "^2.29.0", |
|||
"@types/compression": "^1.7.5", |
|||
"@types/cookie-parser": "^1.4.8", |
|||
"@types/diacritics": "^1.3.3", |
|||
"@types/express": "^5.0.0", |
|||
"@types/express-session": "^1.18.1", |
|||
"@types/jsdom": "^21.1.7", |
|||
"@types/less": "^3.0.7", |
|||
"@types/method-override": "^3.0.0", |
|||
"@types/morgan": "^1.9.9", |
|||
"@types/multer": "^1.4.12", |
|||
"@types/node": "^22.10.10", |
|||
"@types/nodemailer": "^6.4.17", |
|||
"@types/numeral": "^2.0.5", |
|||
"@types/passport": "^1.0.17", |
|||
"@types/passport-google-oauth20": "^2.0.16", |
|||
"@types/passport-local": "^1.0.38", |
|||
"@types/pug": "^2.0.10", |
|||
"@types/randomstring": "^1.3.0", |
|||
"@types/stats-lite": "^2.2.2", |
|||
"@types/user-agents": "^1.0.4", |
|||
"@types/uuid": "^10.0.0", |
|||
"browser-sync": "^3.0.3", |
|||
"esbuild": "^0.24.2", |
|||
"eslint": "^9.18.0", |
|||
"globals": "^15.14.0", |
|||
"less": "^4.2.2", |
|||
"nodemon": "^3.1.9", |
|||
"ts-node": "^10.9.2", |
|||
"tsc-watch": "^6.2.1", |
|||
"tslib": "^2.8.1", |
|||
"typescript": "^5.7.3", |
|||
"typescript-eslint": "^8.21.0" |
|||
}, |
|||
"packageManager": "[email protected]+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0" |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1,20 @@ |
|||
// register.js
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
/* |
|||
* Old: node --loader ts-node/esm script.ts |
|||
* New: node --import ./register.js script.ts |
|||
* |
|||
* The new approach is to run this script, which then registers the ESM loader |
|||
* with Node, then immediately uses it. You can do more in this script, but |
|||
* that's bad practice. |
|||
* |
|||
* Don't perform application setup and initialization in this module. Register |
|||
* any loaders you'll need, but that's all. |
|||
*/ |
|||
|
|||
import { register } from "node:module"; |
|||
import { pathToFileURL } from "node:url"; |
|||
|
|||
register("ts-node/esm", pathToFileURL("./")); |
@ -0,0 +1,224 @@ |
|||
// app/controllers/auth.ts
|
|||
// Copyright (C) 2024 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from "node:assert"; |
|||
import { v4 as uuidv4 } from "uuid"; |
|||
|
|||
import { Request, Response, NextFunction, RequestHandler } from "express"; |
|||
import passport from "passport"; |
|||
|
|||
import svgCaptcha from "svg-captcha"; |
|||
|
|||
import { |
|||
WebServer, |
|||
WebController, |
|||
WebError, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
import { UserService } from "../services/user.js"; |
|||
import CsrfTokenService from "../services/csrf-token.js"; |
|||
|
|||
import { ConnectToken } from "../models/connect-token.js"; |
|||
import { IUser } from "app/models/user.js"; |
|||
|
|||
export default class AuthController extends WebController { |
|||
static get name ( ) : string { return "AuthController"; } |
|||
static get slug ( ) : string { return "auth"; } |
|||
|
|||
constructor (server: WebServer) { |
|||
super(server, AuthController); |
|||
} |
|||
|
|||
get route ( ) : string { |
|||
return "/auth"; |
|||
} |
|||
|
|||
async start ( ) : Promise<void> { |
|||
const csrfTokenService = this.platform.components.getService<CsrfTokenService>("csrfToken"); |
|||
const signupToken: RequestHandler = csrfTokenService.middleware({ |
|||
name: "user-create", |
|||
allowReuse: false, |
|||
expiresMinutes: 5, |
|||
}); |
|||
const loginToken: RequestHandler = csrfTokenService.middleware({ |
|||
name: "user-login", |
|||
allowReuse: false, |
|||
expiresMinutes: 5, |
|||
}); |
|||
|
|||
this.router.post("/signup", signupToken, this.postSignup.bind(this)); |
|||
this.router.post("/login", loginToken, this.postLogin.bind(this)); |
|||
|
|||
this.router.get( |
|||
'/google', |
|||
(req, res, next) => { |
|||
passport.authenticate("google", { |
|||
session: true, |
|||
scope: ["email", "profile"], |
|||
})(req, res, next); |
|||
} |
|||
); |
|||
|
|||
this.router.get( |
|||
'/google/callback', |
|||
passport.authenticate("google"), |
|||
async (req: Request, res: Response, next: NextFunction) : Promise<void> => { |
|||
assert(req.user, "User is required"); |
|||
req.login(req.user, async (error: Error | null) => { |
|||
if (error) { |
|||
this.log.error("failed to start user session", { error }); |
|||
return next(error); |
|||
} |
|||
|
|||
delete req.session.loginReturnTo; |
|||
|
|||
res.locals.serviceName = "Google"; |
|||
res.locals.user = req.user; |
|||
res.render('welcome/connected'); |
|||
}); |
|||
} |
|||
); |
|||
|
|||
this.router.get("/socket-token", this.getSocketToken.bind(this)); |
|||
this.router.get("/signup", this.getSignupForm.bind(this)); |
|||
this.router.get("/login", this.getLoginForm.bind(this)); |
|||
this.router.get("/logout", this.getLogout.bind(this)); |
|||
} |
|||
|
|||
async postSignup (req: Request, res: Response, next: NextFunction) : Promise<void> { |
|||
const userService = this.platform.components.getService<UserService>("user"); |
|||
try { |
|||
assert(req.session, "Active HTTP session is required"); |
|||
|
|||
await userService.create({ |
|||
email: req.body.email as string, |
|||
displayName: req.body.displayName as string, |
|||
password: req.body.password as string, |
|||
passwordVerify: req.body.passwordVerify as string, |
|||
}); |
|||
|
|||
const user: IUser = await userService.login( |
|||
req.body.email as string, |
|||
req.body.password as string, |
|||
); |
|||
|
|||
req.logIn(user, (error: Error | null) => { |
|||
if (error) { |
|||
this.log.error('failed to regenerate user session', { error }); |
|||
return next(error); |
|||
} |
|||
return res.redirect(303, "/"); |
|||
}); |
|||
} catch (error) { |
|||
this.log.error("failed to create new member account", { error }); |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
async postLogin (req: Request, res: Response, next: NextFunction) : Promise<void> { |
|||
try { |
|||
assert(req.session, "An active session is required"); |
|||
const redirectUri = req.session.loginReturnTo || '/'; |
|||
|
|||
this.log.debug('starting passport authenticate', { redirectUri }); |
|||
passport.authenticate('mt-local', (error: Error, user: IUser) : void => { |
|||
if (error) { |
|||
req.session.loginResult = error.toString(); |
|||
return next(error); |
|||
} |
|||
if (!user) { |
|||
req.session.loginResult = "No user account"; |
|||
return res.redirect("/welcome/login"); |
|||
} |
|||
this.log.info("establishing authenticated user session", { user: { _id: user._id } }); |
|||
req.login(user, async (error: Error | null) => { |
|||
if (error) { |
|||
this.log.error("failed to start user session", { error }); |
|||
return next(error); |
|||
} |
|||
delete req.session.loginReturnTo; |
|||
return res.redirect(redirectUri); |
|||
}); |
|||
})(req, res, next); |
|||
} catch (error) { |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
async getSocketToken (req: Request, res: Response, next: NextFunction) : Promise<void> { |
|||
try { |
|||
if (!req.session || !req.user) { |
|||
res.status(403).json({ |
|||
success: false, |
|||
message: "Login required.", |
|||
}); |
|||
return; |
|||
} |
|||
const token = await ConnectToken.create({ |
|||
created: new Date(), |
|||
userType: 'User', |
|||
user: req.user._id, |
|||
token: uuidv4(), |
|||
}); |
|||
res.status(200).json({ |
|||
success: true, |
|||
token, |
|||
}); |
|||
} catch (error) { |
|||
this.log.error("failed to present a socket connect token", { error }); |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
async getSignupForm (req: Request, res: Response, next: NextFunction) : Promise<void> { |
|||
const csrfTokenService = this.platform.components.getService<CsrfTokenService>("csrfToken"); |
|||
try { |
|||
assert(req.session, "HTTP session is required"); |
|||
|
|||
const captcha: svgCaptcha.CaptchaObj = svgCaptcha.create({ |
|||
size: Math.round(Math.random() * 2) + 4, |
|||
width: 280, |
|||
height: 80, |
|||
noise: Math.floor(Math.random() * 2) + 1, |
|||
// background: '#d8d8d8',
|
|||
color: false, |
|||
}); |
|||
res.locals.captcha = captcha; |
|||
|
|||
res.locals.csrfToken = await csrfTokenService.create(req, { |
|||
allowReuse: false, |
|||
expiresMinutes: 3, |
|||
name: "user-create", |
|||
}); |
|||
|
|||
req.session.captcha = req.session.captcha || {}; |
|||
req.session.captcha.signup = captcha.text; |
|||
|
|||
return res.render("auth/signup"); |
|||
} catch (error) { |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
async getLoginForm (_req: Request, res: Response) : Promise<void> { |
|||
res.render("auth/login"); |
|||
} |
|||
|
|||
async getLogout (req: Request, res: Response, next: NextFunction) : Promise<void> { |
|||
try { |
|||
if (!req.session) { |
|||
return next(new WebError(400, "You are not currently logged in.")); |
|||
} |
|||
req.session.destroy((destroyError) => { |
|||
if (destroyError) { |
|||
return next(destroyError); |
|||
} |
|||
return res.redirect(301, "/"); |
|||
}); |
|||
} catch (error) { |
|||
this.log.error("failed to destroy login session", { error }); |
|||
return next(error); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
// app/controllers/home.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Request, Response } from "express"; |
|||
|
|||
import { SidebarService } from "../services/sidebar.js"; |
|||
|
|||
import { |
|||
WebServer, |
|||
WebController, |
|||
} from '../../lib/dtplib.js'; |
|||
|
|||
export class HomeController extends WebController { |
|||
|
|||
static get name ( ) : string { return 'HomeController'; } |
|||
static get slug ( ) : string { return 'home'; } |
|||
|
|||
constructor (server: WebServer) { |
|||
super(server, HomeController); |
|||
} |
|||
|
|||
get route ( ) : string { return '/'; } |
|||
|
|||
async start ( ) : Promise<void> { |
|||
const sidebarService = this.platform.components.getService<SidebarService>("sidebar"); |
|||
this.router.get('/', sidebarService.middleware(), this.getHome.bind(this)); |
|||
} |
|||
|
|||
async getHome (req: Request, res: Response) : Promise<void> { |
|||
this.log.info('session debug', { sessionId: req.session.id }); |
|||
if (req.user) { |
|||
return res.render('home-auth'); |
|||
} |
|||
return res.render('home'); |
|||
} |
|||
} |
|||
|
|||
export default HomeController; |
@ -0,0 +1,103 @@ |
|||
// app/controllers/lib/populators.js
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from "node:assert"; |
|||
|
|||
import { Types } from "mongoose"; |
|||
import { Request, Response, NextFunction, RequestHandler } from "express"; |
|||
|
|||
import { |
|||
WebController, |
|||
WebError, |
|||
} from "../../../lib/dtplib.js"; |
|||
|
|||
import { ImageService } from "../../services/image.js"; |
|||
import { UserService } from "../../services/user.js"; |
|||
|
|||
export function populateAccountByEmail (controller: WebController) : RequestHandler { |
|||
const userService = controller.platform.components.getService<UserService>("user"); |
|||
return async function (_req: Request, res: Response, next: NextFunction, emailAddress?: string) : Promise<void> { |
|||
assert(emailAddress, "Email address is required"); |
|||
try { |
|||
res.locals.userProfile = await userService.getAccountByEmailAddress(emailAddress); |
|||
if (!res.locals.userProfile) { |
|||
return next(new WebError(404, "User Account not found")); |
|||
} |
|||
return next(); |
|||
} catch (error) { |
|||
controller.log.error("failed to populate user account by email address", { emailAddress, error }); |
|||
return next(error); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
export function populateAccountById (controller: WebController) : RequestHandler { |
|||
const userService = controller.platform.components.getService<UserService>("user"); |
|||
return async function (_req: Request, res: Response, next: NextFunction, userId?: string) : Promise<void> { |
|||
assert(userId, "User ID is required"); |
|||
try { |
|||
res.locals.userProfile = await userService.getAccountById(Types.ObjectId.createFromHexString(userId)); |
|||
if (!res.locals.userProfile) { |
|||
return next(new WebError(404, "User profile not found")); |
|||
} |
|||
return next(); |
|||
} catch (error) { |
|||
controller.log.error("failed to populate userId", { userId, error }); |
|||
return next(error); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
export function populateImageId (controller: WebController) : RequestHandler { |
|||
const imageService = controller.platform.components.getService<ImageService>("image"); |
|||
return async function (_req: Request, res: Response, next: NextFunction, imageId?: string) : Promise<void> { |
|||
assert(imageId, "imageId parameter required"); |
|||
try { |
|||
res.locals.image = await imageService.getById( |
|||
Types.ObjectId.createFromHexString(imageId) |
|||
); |
|||
if (!res.locals.image) { |
|||
throw new WebError(404, "Image not found"); |
|||
} |
|||
return next(); |
|||
} catch (error) { |
|||
controller.log.error("failed to populate image", { imageId, error }); |
|||
return next(error); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
export function populateUserByEmail (controller: WebController) : RequestHandler { |
|||
const userService = controller.platform.components.getService<UserService>("user"); |
|||
return async function (_req: Request, res: Response, next: NextFunction, emailAddress?: string) : Promise<void> { |
|||
assert(emailAddress, "Email address is required"); |
|||
try { |
|||
res.locals.userProfile = await userService.getByEmailAddress(emailAddress); |
|||
if (!res.locals.userProfile) { |
|||
return next(new WebError(404, "User profile not found")); |
|||
} |
|||
return next(); |
|||
} catch (error) { |
|||
controller.log.error("failed to populate user by email address", { emailAddress, error }); |
|||
return next(error); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
export function populateUserById (controller: WebController) : RequestHandler { |
|||
const userService = controller.platform.components.getService<UserService>("user"); |
|||
return async function (_req: Request, res: Response, next: NextFunction, userId?: string) : Promise<void> { |
|||
assert(userId, "User ID is required"); |
|||
try { |
|||
res.locals.userProfile = await userService.getById(Types.ObjectId.createFromHexString(userId)); |
|||
if (!res.locals.userProfile) { |
|||
return next(new WebError(404, "User profile not found")); |
|||
} |
|||
return next(); |
|||
} catch (error) { |
|||
controller.log.error("failed to populate userId", { userId, error }); |
|||
return next(error); |
|||
} |
|||
}; |
|||
} |
@ -0,0 +1,127 @@ |
|||
// app/controllers/manifest.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from "../../config/env.js"; |
|||
|
|||
import { NextFunction, Request, Response } from "express"; |
|||
|
|||
import { |
|||
WebServer, |
|||
WebController, |
|||
} from '../../lib/dtplib.js'; |
|||
|
|||
type AppManifestIcon = { |
|||
src: string; |
|||
sizes: string; |
|||
type: string; |
|||
}; |
|||
|
|||
enum ScreenshotFormFactor { |
|||
Narrow = "narrow", |
|||
Wide = "wide", |
|||
} |
|||
|
|||
enum ScreenshotPlatform { |
|||
Android = "android", |
|||
ChromeOS = "chromeos", |
|||
iOS = "ios", |
|||
iPadOS = "ipados", |
|||
KaiOS = "kaios", |
|||
MacOS = "macos", |
|||
Windows = "windows", |
|||
XBox = "xbox", |
|||
ChromeWebStore = "chrome_web_store", |
|||
iTunes = "itunes", |
|||
MicrosoftInbox = "microsoft-inbox", |
|||
MicrosoftStore = "microsoft-store", |
|||
Play = "play", |
|||
} |
|||
|
|||
type AppManifestScreenshot = { |
|||
src: string; |
|||
type: string; |
|||
form_factor: ScreenshotFormFactor; |
|||
sizes: string; |
|||
label?: string; |
|||
platform?: ScreenshotPlatform; |
|||
}; |
|||
|
|||
type AppManifest = { |
|||
id: string; |
|||
theme_color: string; |
|||
background_color: string; |
|||
display: string; |
|||
scope: string; |
|||
start_url: string; |
|||
name: string; |
|||
short_name: string; |
|||
description: string; |
|||
icons: Array<AppManifestIcon>; |
|||
screenshots: Array<AppManifestScreenshot>; |
|||
}; |
|||
|
|||
export class ManifestController extends WebController { |
|||
|
|||
static get name ( ) : string { return 'ManifestController'; } |
|||
static get slug ( ) : string { return 'manifest'; } |
|||
|
|||
constructor (server: WebServer) { |
|||
super(server, ManifestController); |
|||
} |
|||
|
|||
get route ( ) : string { return '/manifest.json'; } |
|||
|
|||
async start ( ) : Promise<void> { |
|||
this.router.get('/', this.getManifest.bind(this)); |
|||
} |
|||
|
|||
async getManifest (_req: Request, res: Response, next: NextFunction) : Promise<void> { |
|||
const DEFAULT_THEME_COLOR = '#4a4a4a'; |
|||
const DEFAULT_BACKGROUND_COLOR = '#1a1a1a'; |
|||
try { |
|||
const manifest: AppManifest = { |
|||
id: '/', |
|||
theme_color: DEFAULT_THEME_COLOR, |
|||
background_color: DEFAULT_BACKGROUND_COLOR, |
|||
display: 'fullscreen', |
|||
scope: '/', |
|||
start_url: '/', |
|||
name: env.site.name, |
|||
short_name: env.site.shortName, |
|||
description: env.site.description, |
|||
icons: [ ], |
|||
screenshots: [ ], |
|||
}; |
|||
|
|||
[512, 384, 256, 192, 144, 96, 72, 48, 32, 16].forEach((size) => { |
|||
manifest.icons.push({ |
|||
src: `/img/icon/${env.site.domainKey}/icon-${size}x${size}.png`, |
|||
sizes: `${size}x${size}`, |
|||
type: 'image/png' |
|||
}); |
|||
}); |
|||
|
|||
manifest.screenshots.push({ |
|||
src: "/img/screenshots/manifest-wide.png", |
|||
form_factor: ScreenshotFormFactor.Wide, |
|||
label: "A screenshot of DTP Newsroom", |
|||
sizes: "1280x720", |
|||
type: "image/png", |
|||
}); |
|||
manifest.screenshots.push({ |
|||
src: "/img/screenshots/manifest-narrow.png", |
|||
form_factor: ScreenshotFormFactor.Narrow, |
|||
label: "A screenshot of DTP Newsroom", |
|||
sizes: "540x960", |
|||
type: "image/png", |
|||
}); |
|||
|
|||
res.status(200).json(manifest); |
|||
} catch (error) { |
|||
return next(error); |
|||
} |
|||
} |
|||
} |
|||
|
|||
export default ManifestController; |
@ -0,0 +1,230 @@ |
|||
// app/controllers/user.ts
|
|||
// Copyright (C) 2024 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from "node:assert"; |
|||
|
|||
import { Request, Response, NextFunction } from "express"; |
|||
|
|||
import { populateAccountById } from "./lib/populators.js"; |
|||
|
|||
import { UserService, UserUpdateParams } from "../services/user.js"; |
|||
import { DisplayEngineService } from "../services/display-engine.js"; |
|||
import { SidebarService } from "../services/sidebar.js"; |
|||
import { SessionService } from "../services/session.js"; |
|||
|
|||
import { |
|||
WebServer, |
|||
WebController, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
export default class UserController extends WebController { |
|||
|
|||
static get name ( ) : string { return "UserController"; } |
|||
static get slug ( ) : string { return "user"; } |
|||
|
|||
constructor(server: WebServer) { |
|||
super(server, UserController); |
|||
} |
|||
|
|||
get route(): string { |
|||
return "/user"; |
|||
} |
|||
|
|||
async start(): Promise<void> { |
|||
const displayEngineService = this.platform.components.getService<DisplayEngineService>("displayEngine"); |
|||
const sessionService = this.platform.components.getService<SessionService>("session"); |
|||
const userService = this.platform.components.getService<UserService>("user"); |
|||
const sidebarService = this.platform.components.getService<SidebarService>("sidebar"); |
|||
|
|||
displayEngineService.loadTemplate( |
|||
"profile-picture-form", |
|||
"user/components/profile-picture-form.pug" |
|||
); |
|||
displayEngineService.loadTemplate( |
|||
"password-change-form", |
|||
"user/components/password-change-form.pug" |
|||
); |
|||
|
|||
const sidebar = sidebarService.middleware(); |
|||
const imageUpload = this.createMulter(this.slug, { |
|||
limits: { |
|||
fileSize: 20 * 1024 * 1000, // 20MB
|
|||
}, |
|||
}); |
|||
|
|||
this.router.param("userId", populateAccountById(this)); |
|||
|
|||
const requireLogin = sessionService.authCheckMiddleware({ |
|||
loginUri: "/welcome", |
|||
useRedirect: true, |
|||
flags: { |
|||
requireAdmin: false, |
|||
requireEmailVerified: false, |
|||
}, |
|||
permissions: { |
|||
requireCanLogin: true, |
|||
requireCanComment: false, |
|||
requireCanManageFeeds: false, |
|||
requireCanManageContent: false, |
|||
}, |
|||
}); |
|||
|
|||
const requireAccountOwner = userService.requireAccountOwner("userProfile"); |
|||
|
|||
this.router.post( |
|||
"/:userId/password", |
|||
requireLogin, |
|||
requireAccountOwner, |
|||
this.postUserPasswordChange.bind(this), |
|||
); |
|||
|
|||
this.router.post( |
|||
"/:userId/picture", |
|||
requireLogin, |
|||
requireAccountOwner, |
|||
imageUpload.single("image"), |
|||
this.postUserProfilePicture.bind(this), |
|||
); |
|||
|
|||
this.router.post( |
|||
"/:userId", |
|||
requireLogin, |
|||
requireAccountOwner, |
|||
this.postUserUpdate.bind(this), |
|||
); |
|||
|
|||
this.router.get("/:userId/settings", sidebar, this.getSettingsView.bind(this)); |
|||
this.router.get("/:userId", sidebar, this.getProfileView.bind(this)); |
|||
|
|||
this.router.get("/", requireLogin, this.getHome.bind(this)); |
|||
|
|||
this.router.delete( |
|||
"/:userId/picture", |
|||
requireLogin, |
|||
requireAccountOwner, |
|||
this.deleteProfilePicture.bind(this), |
|||
); |
|||
} |
|||
|
|||
async postUserPasswordChange (req: Request, res: Response) : Promise<void> { |
|||
const userService = this.getService<UserService>("user"); |
|||
try { |
|||
assert(req.user, "Login required"); |
|||
req.user = await userService.changePassword(req.user, { |
|||
currentPassword: req.body.currentPassword as string, |
|||
newPassword: req.body.newPassword as string, |
|||
newPasswordVerify: req.body.newPasswordVerify as string, |
|||
}); |
|||
|
|||
const displayList = this.createDisplayList("password-change"); |
|||
displayList.setValue("#current-password", ""); |
|||
displayList.setValue("#new-password", ""); |
|||
displayList.setValue("#new-password-verify", ""); |
|||
|
|||
res.status(200).json({ success: true, displayList }); |
|||
} catch (error) { |
|||
this.log.error("failed to process user account update", { error }); |
|||
this.renderErrorJSON(res, error); |
|||
} |
|||
} |
|||
|
|||
async postUserProfilePicture(req: Request, res: Response) : Promise<void> { |
|||
const displayEngineService = this.platform.components.getService<DisplayEngineService>("displayEngine"); |
|||
const userService = this.platform.components.getService<UserService>("user"); |
|||
try { |
|||
assert(req.user, "Login required"); |
|||
assert(req.file, "Image file not uploaded"); |
|||
|
|||
res.locals.user = await userService.setProfilePicture(req.user, req.file); |
|||
res.locals.userProfile = res.locals.user; |
|||
|
|||
const displayList = this.createDisplayList("profile-picture"); |
|||
displayList.replaceElement( |
|||
`#picture-panel.control-panel`, |
|||
displayEngineService.renderTemplate("profile-picture-form", res.locals) |
|||
); |
|||
if (req.user && req.user.picture) { |
|||
displayList.setAttribute( |
|||
`img[data-user-id="${req.user._id}"].profile-icon`, |
|||
"src", |
|||
`/image/${req.user.picture._id}` |
|||
); |
|||
} |
|||
|
|||
res.status(200).json({ success: true, displayList }); |
|||
} catch (error) { |
|||
this.log.error("failed to process user account update", { error }); |
|||
this.renderErrorJSON( |
|||
res, |
|||
new Error("failed to process user account update", { cause: error }), |
|||
); |
|||
} |
|||
} |
|||
|
|||
async postUserUpdate (req: Request, res: Response) : Promise<void> { |
|||
const userService = this.getService<UserService>("user"); |
|||
try { |
|||
assert(req.user, "Login required"); |
|||
await userService.update(req.user, req.body as UserUpdateParams); |
|||
res.status(200).json({ success: true }); |
|||
} catch (error) { |
|||
this.log.error("failed to process user account update", { error }); |
|||
this.renderErrorJSON( |
|||
res, |
|||
new Error("failed to process user account update", { cause: error }), |
|||
); |
|||
} |
|||
} |
|||
|
|||
async getSettingsView(_req: Request, res: Response, next: NextFunction): Promise<void> { |
|||
try { |
|||
assert(res.locals.userProfile, "User profile is missing"); |
|||
res.render("user/settings"); |
|||
} catch (error) { |
|||
this.log.error("failed to present the user settings view", { error }); |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
async getProfileView(req: Request, res: Response, next: NextFunction): Promise<void> { |
|||
try { |
|||
assert(res.locals.userProfile, "User profile is missing"); |
|||
res.locals.pagination = this.getPaginationParameters(req, 20); |
|||
res.render("user/profile"); |
|||
} catch (error) { |
|||
this.log.error("failed to present the user profile view", { error }); |
|||
return next(error); |
|||
} |
|||
} |
|||
|
|||
async getHome(_req: Request, res: Response) : Promise<void> { |
|||
return res.render("user/home"); |
|||
} |
|||
|
|||
async deleteProfilePicture (req: Request, res: Response) : Promise<void> { |
|||
const displayEngineService = this.getService<DisplayEngineService>("displayEngine"); |
|||
const userService = this.getService<UserService>("user"); |
|||
try { |
|||
assert(req.user, "Login required"); |
|||
res.locals.user = await userService.removeProfilePicture(req.user); |
|||
res.locals.userProfile = res.locals.user; |
|||
|
|||
const displayList = this.createDisplayList("profile-picture"); |
|||
displayList.replaceElement( |
|||
`#picture-panel.control-panel`, |
|||
displayEngineService.renderTemplate("profile-picture-form", res.locals) |
|||
); |
|||
displayList.setAttribute( |
|||
`img[data-user-id="${req.user._id}"].profile-icon`, |
|||
"src", |
|||
"/client/img/default-user.png" |
|||
); |
|||
|
|||
res.status(200).json({ success: true, displayList }); |
|||
} catch (error) { |
|||
this.log.error("failed to process user account update", { error }); |
|||
this.renderErrorJSON(res, error); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,100 @@ |
|||
// app/controllers/welcome.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from "../../config/env.js"; |
|||
import assert from "node:assert"; |
|||
|
|||
import { Request, Response, NextFunction } from "express"; |
|||
|
|||
import svgCaptcha from "svg-captcha"; |
|||
|
|||
import { |
|||
WebServer, |
|||
WebController, |
|||
} from '../../lib/dtplib.js'; |
|||
import CsrfTokenService from "app/services/csrf-token.js"; |
|||
|
|||
export class WelcomeController extends WebController { |
|||
|
|||
static get name ( ) : string { return 'WelcomeController'; } |
|||
static get slug ( ) : string { return 'welcome'; } |
|||
|
|||
constructor (server: WebServer) { |
|||
super(server, WelcomeController); |
|||
} |
|||
|
|||
get route ( ) : string { return '/welcome'; } |
|||
|
|||
async start ( ) : Promise<void> { |
|||
function preventUserAccess(req: Request, res: Response, next: NextFunction) { |
|||
if (req.user) { |
|||
return res.redirect(301, "/"); |
|||
} |
|||
next(); |
|||
} |
|||
|
|||
if (env.user.signupEnabled) { |
|||
this.router.get("/signup/captcha", this.getSignupCaptcha.bind(this)); |
|||
this.router.get("/signup", preventUserAccess, this.getSignupView.bind(this)); |
|||
} |
|||
|
|||
this.router.get("/login", preventUserAccess, this.getLoginView.bind(this)); |
|||
this.router.get('/', preventUserAccess, this.getHome.bind(this)); |
|||
} |
|||
|
|||
async getSignupCaptcha(req: Request, res: Response): Promise<void> { |
|||
assert(req.session, "Request must provide a session"); |
|||
const signupCaptcha: svgCaptcha.CaptchaObj = svgCaptcha.create({ |
|||
size: 4 + Math.floor(Math.random() * 4), |
|||
color: false, |
|||
noise: 3, |
|||
width: 300, |
|||
height: 80, |
|||
}); |
|||
|
|||
req.session.captcha = req.session.captcha || { }; |
|||
req.session.captcha.signup = signupCaptcha.text; |
|||
|
|||
res.set("Content-Type", "image/svg+xml"); |
|||
res.set("Content-Length", signupCaptcha.data.length.toString()); |
|||
|
|||
res.status(200).send(signupCaptcha.data); |
|||
} |
|||
|
|||
async getSignupView (req: Request, res: Response) { |
|||
const csrfTokenService = this.platform.components.getService<CsrfTokenService>("csrfToken"); |
|||
assert(req.session, "The request must provide a session"); |
|||
|
|||
res.locals.csrfTokenSignup = await csrfTokenService.create(req, { |
|||
name: "user-create", |
|||
expiresMinutes: 20, |
|||
allowReuse: false, |
|||
}); |
|||
|
|||
res.render("welcome/signup"); |
|||
} |
|||
|
|||
async getLoginView(req: Request, res: Response) { |
|||
const csrfTokenService = this.platform.components.getService<CsrfTokenService>("csrfToken"); |
|||
assert(req.session, "The request must provide a session"); |
|||
|
|||
res.locals.csrfTokenLogin = await csrfTokenService.create(req, { |
|||
name: "user-login", |
|||
expiresMinutes: 20, |
|||
allowReuse: false, |
|||
}); |
|||
|
|||
if (req.session.loginResult) { |
|||
res.locals.loginResult = req.session.loginResult; |
|||
} |
|||
|
|||
res.render("welcome/login"); |
|||
} |
|||
|
|||
async getHome (_req: Request, res: Response) : Promise<void> { |
|||
res.render('welcome/home'); |
|||
} |
|||
} |
|||
|
|||
export default WelcomeController; |
@ -0,0 +1,25 @@ |
|||
// app/models/connect-token.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
'use strict'; |
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
export interface IConnectToken { |
|||
_id: Types.ObjectId; |
|||
created: Date; |
|||
user: Types.ObjectId; |
|||
token: string; |
|||
claimed?: Date; |
|||
} |
|||
|
|||
const ConnectTokenSchema = new Schema<IConnectToken>({ |
|||
created: { type: Date, default: Date.now, required: true, index: -1, expires: '1m' }, |
|||
user: { type: Schema.ObjectId, required: true, index: true, ref: 'User' }, |
|||
token: { type: String, required: true }, |
|||
claimed: { type: Date }, |
|||
}); |
|||
|
|||
export const ConnectToken = model('ConnectToken', ConnectTokenSchema); |
|||
export default ConnectToken; |
@ -0,0 +1,31 @@ |
|||
// app/models/csrf-token.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
import { IUser } from "./user.js"; |
|||
|
|||
export interface ICsrfToken { |
|||
_id: Types.ObjectId; |
|||
created: Date; |
|||
expires: Date; |
|||
claimed?: Date; |
|||
token: string; |
|||
user?: IUser | Types.ObjectId; |
|||
ip: string; |
|||
|
|||
name?: string; // not saved to db
|
|||
} |
|||
|
|||
const CsrfTokenSchema = new Schema<ICsrfToken>({ |
|||
created: { type: Date, required: true, default: Date.now, index: -1, expires: "24h" }, |
|||
expires: { type: Date, required: true, default: Date.now, index: -1 }, |
|||
claimed: { type: Date }, |
|||
token: { type: String, required: true, index: 1 }, |
|||
user: { type: Types.ObjectId, ref: "User" }, |
|||
ip: { type: String, required: true }, |
|||
}); |
|||
|
|||
export const CsrfToken = model<ICsrfToken>("CsrfToken", CsrfTokenSchema); |
|||
export default CsrfToken; |
@ -0,0 +1,32 @@ |
|||
// app/models/email-blacklist.js
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from 'mongoose'; |
|||
|
|||
import { IEmailBlacklistFlags, EmailBlacklistFlagsSchema } from './lib/email-blacklist-flags.js'; |
|||
|
|||
export interface IEmailBlacklist { |
|||
_id: Types.ObjectId; |
|||
created: Date; |
|||
email: string; |
|||
flags: IEmailBlacklistFlags; |
|||
} |
|||
|
|||
const EmailBlacklistSchema = new Schema<IEmailBlacklist>({ |
|||
created: { type: Date, required: true, default: Date.now, index: -1, expires: '30d' }, |
|||
email: { type: String, required: true, lowercase: true, maxLength: 255, unique: true }, |
|||
flags: { type: EmailBlacklistFlagsSchema, required: true }, |
|||
}); |
|||
|
|||
EmailBlacklistSchema.index({ |
|||
email: 1, |
|||
'flags.isVerified': 1, |
|||
}, { |
|||
partialFilterExpression: { |
|||
'flags.isVerified': true, |
|||
}, |
|||
}); |
|||
|
|||
export const EmailBlacklist = model<IEmailBlacklist>('EmailBlacklist', EmailBlacklistSchema); |
|||
export default EmailBlacklist; |
@ -0,0 +1,27 @@ |
|||
// app/models/email-log.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
export interface IEmailLog { |
|||
_id: Types.ObjectId; |
|||
created: Date; |
|||
from: string; |
|||
to: string; |
|||
to_lc: string; |
|||
subject: string; |
|||
messageId: string; |
|||
} |
|||
|
|||
const EmailLogSchema = new Schema<IEmailLog>({ |
|||
created: { type: Date, default: Date.now, required: true, index: -1 }, |
|||
from: { type: String, required: true, }, |
|||
to: { type: String, required: true }, |
|||
to_lc: { type: String, required: true, lowercase: true, index: 1 }, |
|||
subject: { type: String, required: true }, |
|||
messageId: { type: String }, |
|||
}); |
|||
|
|||
export const EmailLog = model<IEmailLog>('EmailLog', EmailLogSchema); |
|||
export default EmailLog; |
@ -0,0 +1,25 @@ |
|||
// app/models/email-verify.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
import { IUser } from './user.js'; |
|||
|
|||
export interface IEmailVerify { |
|||
_id: Types.ObjectId; |
|||
created: Date; |
|||
verified?: Date; |
|||
user: IUser | Types.ObjectId; |
|||
token: string; |
|||
} |
|||
|
|||
const EmailVerifySchema = new Schema({ |
|||
created: { type: Date, default: Date.now, required: true, index: -1, expires: '30d' }, |
|||
verified: { type: Date }, |
|||
user: { type: Types.ObjectId, required: true, index: 1, ref: 'User' }, |
|||
token: { type: String, required: true }, |
|||
}); |
|||
|
|||
export const EmailVerify = model<IEmailVerify>('EmailVerify', EmailVerifySchema); |
|||
export default EmailVerify; |
@ -0,0 +1,33 @@ |
|||
// app/models/feed.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
import { IFeed } from "./feed"; |
|||
|
|||
export interface IFeedItem { |
|||
_id: Types.ObjectId; |
|||
__v: number; |
|||
|
|||
created: Date; |
|||
feed: IFeed | Types.ObjectId; |
|||
title: string; |
|||
link: string; |
|||
|
|||
description?: string; |
|||
body?: string; |
|||
summary?: string; |
|||
} |
|||
|
|||
export const FeedItemSchema = new Schema<IFeedItem>({ |
|||
created: { type: Date, required: true, index: -1 }, |
|||
feed: { type: Schema.ObjectId, required: true, index: 1, ref: "Feed" }, |
|||
title: { type: String, required: true }, |
|||
link: { type: String, required: true }, |
|||
description: { type: String }, |
|||
body: { type: String }, |
|||
summary: { type: String }, |
|||
}); |
|||
|
|||
export const FeedItem = model<IFeedItem>("FeedItem", FeedItemSchema); |
|||
export default FeedItem; |
@ -0,0 +1,23 @@ |
|||
// app/models/feed.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
export interface IFeed { |
|||
_id: Types.ObjectId; |
|||
__v: number; |
|||
|
|||
title: string; |
|||
description: string; |
|||
url: string; |
|||
} |
|||
|
|||
const FeedSchema = new Schema<IFeed>({ |
|||
title: { type: String, required: true }, |
|||
description: { type: String }, |
|||
url: { type: String, required: true }, |
|||
}); |
|||
|
|||
export const Feed = model<IFeed>("Feed", FeedSchema); |
|||
export default Feed; |
@ -0,0 +1,43 @@ |
|||
// app/models/image.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from 'mongoose'; |
|||
|
|||
import { IImageFile, ImageFileSchema } from './lib/image-file.js'; |
|||
import { IImageMetadata, ImageMetadataSchema } from './lib/image-metadata.js'; |
|||
import { IUser } from './user.js'; |
|||
|
|||
export interface IImage { |
|||
_id: Types.ObjectId; |
|||
created: Date; |
|||
owner: IUser | Types.ObjectId; |
|||
caption?: string; |
|||
type: string; |
|||
size: number; |
|||
file: IImageFile; |
|||
metadata?: IImageMetadata; |
|||
} |
|||
|
|||
export const ImageSchema = new Schema<IImage>({ |
|||
created: { type: Date, default: Date.now, required: true, index: -1 }, |
|||
owner: { type: Types.ObjectId, required: true, index: 1, ref: 'User' }, |
|||
caption: { type: String, maxLength: 300 }, |
|||
type: { type: String, required: true }, |
|||
size: { type: Number, required: true }, |
|||
file: { type: ImageFileSchema, required: true }, |
|||
metadata: { type: ImageMetadataSchema }, |
|||
}); |
|||
|
|||
ImageSchema.index({ |
|||
'flags.isPendingAttachment': 1, |
|||
created: -1, |
|||
}, { |
|||
partialFilterExpression: { |
|||
'flags.isPendingAttachment': true, |
|||
}, |
|||
name: 'img_pendattach_idx', |
|||
}); |
|||
|
|||
export const Image = model<IImage>('Image', ImageSchema); |
|||
export default Image; |
@ -0,0 +1,15 @@ |
|||
// app/models/lib/email-blacklist-flags.js
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
'use strict'; |
|||
|
|||
import { Schema } from 'mongoose'; |
|||
|
|||
export interface IEmailBlacklistFlags { |
|||
isVerified: boolean; |
|||
} |
|||
|
|||
export const EmailBlacklistFlagsSchema = new Schema<IEmailBlacklistFlags>({ |
|||
isVerified: { type: Boolean, default: false, required: true }, |
|||
}, { _id: false }); |
@ -0,0 +1,15 @@ |
|||
// models/lib/image-file.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from 'mongoose'; |
|||
|
|||
export interface IImageFile { |
|||
bucket: string, |
|||
key: string, |
|||
} |
|||
|
|||
export const ImageFileSchema = new Schema<IImageFile>({ |
|||
bucket: { type: String, required: true }, |
|||
key: { type: String, required: true }, |
|||
}, { _id: false }); |
@ -0,0 +1,31 @@ |
|||
// models/lib/image-metadata.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from 'mongoose'; |
|||
|
|||
export interface IImageMetadata { |
|||
format: string | undefined; |
|||
size: number | undefined; |
|||
width: number | undefined; |
|||
height: number | undefined; |
|||
space: string | undefined; |
|||
channels: number | undefined; |
|||
depth: string | undefined; |
|||
density: number | undefined; |
|||
hasAlpha: boolean | undefined; |
|||
orientation: number | undefined; |
|||
} |
|||
|
|||
export const ImageMetadataSchema = new Schema<IImageMetadata>({ |
|||
format: { type: String }, |
|||
size: { type: Number }, |
|||
width: { type: Number }, |
|||
height: { type: Number }, |
|||
space: { type: String }, |
|||
channels: { type: Number }, |
|||
depth: { type: String }, |
|||
density: { type: Number }, |
|||
hasAlpha: { type: Boolean }, |
|||
orientation: { type: Number }, |
|||
}); |
@ -0,0 +1,17 @@ |
|||
// app/models/lib/process-endpoint.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from "mongoose"; |
|||
|
|||
export interface IDtpProcessEndpoint { |
|||
hostname: string; |
|||
ip: string; |
|||
port: number; |
|||
} |
|||
|
|||
export const DtpProcessEndpointSchema = new Schema<IDtpProcessEndpoint>({ |
|||
hostname: { type: String, required: true }, |
|||
ip: { type: String, required: true }, |
|||
port: { type: Number, required: true }, |
|||
}, { _id: false }); |
@ -0,0 +1,34 @@ |
|||
// app/models/lib/node-stats.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from "mongoose"; |
|||
|
|||
export interface IDtpProcessStats { |
|||
cpu: number; |
|||
memory: number; |
|||
storage: number; |
|||
netBytesTx: number; |
|||
netBytesRx: number; |
|||
} |
|||
export const DtpProcessStatsSchema = new Schema<IDtpProcessStats>({ |
|||
cpu: { type: Number, default: 0, required: true }, |
|||
memory: { type: Number, default: 0, required: true }, |
|||
storage: { type: Number, default: 0, required: true }, |
|||
}); |
|||
|
|||
export interface IDtpWebProcessStats { |
|||
webRequestCount: number; |
|||
webErrorCount: number; |
|||
} |
|||
export const DtpWebProcessStatsSchema = new Schema<IDtpWebProcessStats>({ |
|||
webRequestCount: { type: Number, default: 0, required: true }, |
|||
webErrorCount: { type: Number, default: 0, required: true }, |
|||
}, { _id: false }); |
|||
|
|||
export interface IDtpWorkerProcessStats { |
|||
jobRunCount: number; |
|||
} |
|||
export const DtpWorkerProcessStatsSchema = new Schema<IDtpWorkerProcessStats>({ |
|||
jobRunCount: { type: Number, default: 0, required: true }, |
|||
}, { _id: false }); |
@ -0,0 +1,10 @@ |
|||
// app/models/lib/process-status.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
export enum DtpProcessStatus { |
|||
Idle = "idle", |
|||
Starting = "starting", |
|||
Online = "online", |
|||
Shutdown = "shutdown", |
|||
} |
@ -0,0 +1,23 @@ |
|||
// app/models/lib/user-apis.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from "mongoose"; |
|||
|
|||
export interface IUserApiGoogle { |
|||
accessToken: string; |
|||
refreshToken: string; |
|||
} |
|||
|
|||
export const UserApiGoogleSchema = new Schema<IUserApiGoogle>({ |
|||
accessToken: { type: String, required: true }, |
|||
refreshToken: { type: String, required: true }, |
|||
}, { _id: false }); |
|||
|
|||
export interface IUserApis { |
|||
google: IUserApiGoogle; |
|||
} |
|||
|
|||
export const UserApisSchema = new Schema<IUserApis>({ |
|||
google: { type: UserApiGoogleSchema }, |
|||
}); |
@ -0,0 +1,15 @@ |
|||
// app/models/lib/user-flags.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from "mongoose"; |
|||
|
|||
export interface IUserFlags { |
|||
isAdmin: boolean; |
|||
isEmailVerified: boolean; |
|||
} |
|||
|
|||
export const UserFlagsSchema = new Schema<IUserFlags>({ |
|||
isAdmin: { type: Boolean, default: false, required: true }, |
|||
isEmailVerified: { type: Boolean, default: false, required: true }, |
|||
}, { _id: false }); |
@ -0,0 +1,19 @@ |
|||
// app/models/lib/user-permissions.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema } from 'mongoose'; |
|||
|
|||
export interface IUserPermissions { |
|||
canLogin: boolean; |
|||
canComment: boolean; |
|||
canManageFeeds: boolean; |
|||
canManageContent: boolean; |
|||
} |
|||
|
|||
export const UserPermissionsSchema = new Schema<IUserPermissions>({ |
|||
canLogin: { type: Boolean, default: true, required: true }, |
|||
canComment: { type: Boolean, default: true, required: true }, |
|||
canManageFeeds: { type: Boolean, default: true, required: true }, |
|||
canManageContent: { type: Boolean, default: true, required: true }, |
|||
}, { _id: false }); |
@ -0,0 +1,58 @@ |
|||
// app/models/process-stats.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Types, Schema, model } from "mongoose"; |
|||
|
|||
import { IDtpProcess } from "./process"; |
|||
import { DtpProcessStatsSchema, DtpWebProcessStatsSchema, DtpWorkerProcessStatsSchema, IDtpProcessStats, IDtpWebProcessStats, IDtpWorkerProcessStats } from "./lib/process-stats.js"; |
|||
|
|||
/* |
|||
* Process stats history |
|||
*/ |
|||
|
|||
export interface IDtpProcessStatsHistory { |
|||
created: Date; |
|||
process: IDtpProcess | Types.ObjectId; |
|||
processStats: IDtpProcessStats; |
|||
} |
|||
export const DtpProcessStatsHistorySchema = new Schema<IDtpProcessStatsHistory>({ |
|||
created: { type: Date, required: true, index: -1 }, |
|||
processStats: { type: DtpProcessStatsSchema, required: true }, |
|||
}); |
|||
|
|||
export const DtpProcessStatsHistory = model<IDtpProcessStatsHistory>( |
|||
"DtpProcessStatsHistory", |
|||
DtpProcessStatsHistorySchema, |
|||
); |
|||
export default DtpProcessStatsHistory; |
|||
|
|||
/* |
|||
* Web process stats history |
|||
*/ |
|||
|
|||
export interface IDtpWebProcessStatsHistory extends IDtpProcessStatsHistory { |
|||
webStats: IDtpWebProcessStats; |
|||
} |
|||
export const DtpWebProcessStatsHistorySchema = new Schema<IDtpWebProcessStatsHistory>({ |
|||
webStats: { type: DtpWebProcessStatsSchema, required: true }, |
|||
}); |
|||
export const DtpWebProcessStatsHistory = DtpProcessStatsHistory.discriminator( |
|||
"DtpWebProcessStatsHistory", |
|||
DtpWebProcessStatsHistorySchema |
|||
); |
|||
|
|||
/* |
|||
* Worker process stats history |
|||
*/ |
|||
|
|||
export interface IDtpWorkerProcessStatsHistory extends IDtpProcessStatsHistory { |
|||
workerStats: IDtpWorkerProcessStats; |
|||
} |
|||
export const DtpWorkerProcessStatsHistorySchema = new Schema<IDtpWorkerProcessStatsHistory>({ |
|||
workerStats: { type: DtpWorkerProcessStatsSchema, required: true }, |
|||
}); |
|||
export const DtpWorkerProcessStatsHistory = DtpProcessStatsHistory.discriminator( |
|||
"DtpWorkerProcessStatsHistory", |
|||
DtpWorkerProcessStatsHistorySchema |
|||
); |
@ -0,0 +1,71 @@ |
|||
// app/models/net-process.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
import { DtpProcessStatus } from "./lib/process-status.js"; |
|||
import { |
|||
IDtpProcessStats, |
|||
DtpProcessStatsSchema, |
|||
|
|||
IDtpWebProcessStats, |
|||
DtpWebProcessStatsSchema, |
|||
|
|||
IDtpWorkerProcessStats, |
|||
DtpWorkerProcessStatsSchema, |
|||
} from "./lib/process-stats.js"; |
|||
|
|||
import { |
|||
IDtpProcessEndpoint, |
|||
DtpProcessEndpointSchema, |
|||
} from "./lib/process-endpoint.js"; |
|||
|
|||
export enum DtpProcessType { |
|||
Web = "web", |
|||
Worker = "worker", |
|||
} |
|||
|
|||
export interface IDtpProcess { |
|||
_id: Types.ObjectId; // MongoDB concern
|
|||
__v: number; // MongoDB concern (optimistic consistency)
|
|||
|
|||
created: Date; |
|||
updated: Date; |
|||
type: DtpProcessType; |
|||
status: DtpProcessStatus; |
|||
endpoint: IDtpProcessEndpoint; |
|||
processStats: IDtpProcessStats; |
|||
} |
|||
|
|||
export const DtpProcessSchema = new Schema<IDtpProcess>({ |
|||
created: { type: Date, required: true, default: Date.now, index: -1, expires: "24h" }, |
|||
updated: { type: Date, required: true, default: Date.now, index: -1 }, |
|||
type: { type: String, enum: DtpProcessType, required: true, index: 1 }, |
|||
status: { type: String, enum: DtpProcessStatus, required: true, index: 1 }, |
|||
endpoint: { type: DtpProcessEndpointSchema, required: true }, |
|||
processStats: { type: DtpProcessStatsSchema, required: true }, |
|||
}); |
|||
|
|||
export const DtpProcess = model<IDtpProcess>("DtpProcess", DtpProcessSchema); |
|||
export default DtpProcess; |
|||
|
|||
export interface IDtpWebProcess extends IDtpProcess { |
|||
webStats: IDtpWebProcessStats; |
|||
} |
|||
export const DtpWebProcess = DtpProcess.discriminator( |
|||
'DtpWebProcess', |
|||
new Schema<IDtpWebProcess>({ |
|||
webStats: { type: DtpWebProcessStatsSchema, required: true }, |
|||
}), |
|||
); |
|||
|
|||
export interface IDtpWorkerProcess extends IDtpProcess { |
|||
workerStats: IDtpWorkerProcessStats; |
|||
} |
|||
export const DtpWorkerProcess = DtpProcess.discriminator( |
|||
"DtpWorkerProcess", |
|||
new Schema<IDtpWorkerProcess>({ |
|||
workerStats: { type: DtpWorkerProcessStatsSchema, required: true } |
|||
}) |
|||
); |
@ -0,0 +1,53 @@ |
|||
// app/models/user.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Schema, Types, model } from "mongoose"; |
|||
|
|||
import { IUserFlags, UserFlagsSchema } from "./lib/user-flags.js"; |
|||
import { IUserPermissions, UserPermissionsSchema } from "./lib/user-permissions.js"; |
|||
import { IUserApis, UserApisSchema } from "./lib/user-apis.js"; |
|||
import { IImage } from "./image.js"; |
|||
|
|||
export interface IUser { |
|||
_id: Types.ObjectId; // MongoDB concern (efficient record ID)
|
|||
__v: number; // MongoDB concern (optimistic consistency)
|
|||
|
|||
created: Date; |
|||
updated?: Date; |
|||
|
|||
email: string; |
|||
email_lc: string; |
|||
|
|||
displayName: string; |
|||
picture?: IImage; |
|||
|
|||
passwordSalt: string; |
|||
password: string; |
|||
|
|||
apis: IUserApis; |
|||
flags: IUserFlags; |
|||
permissions: IUserPermissions; |
|||
|
|||
theme: string; |
|||
notes?: string; |
|||
} |
|||
|
|||
const UserSchema = new Schema<IUser>({ |
|||
created: { type: Date, default: Date.now, required: true, index: -1 }, |
|||
updated: { type: Date, index: -1 }, |
|||
email: { type: String, required: true, lowercase: true, unique: true }, |
|||
email_lc: { type: String, required: true, lowercase: true, unique: true }, |
|||
displayName: { type: String, maxLength: 60 }, |
|||
picture: { type: Types.ObjectId, ref: 'Image' }, |
|||
passwordSalt: { type: String, required: true, select: false }, |
|||
password: { type: String, required: true, select: false }, |
|||
apis: { type: UserApisSchema, default: { }, select: false }, |
|||
flags: { type: UserFlagsSchema, default: { }, required: true, select: false }, |
|||
permissions: { type: UserPermissionsSchema, default: { }, required: true, select: false }, |
|||
theme: { type: String, default: 'dtp-light', required: true }, |
|||
notes: { type: String, select: false }, |
|||
}, { optimisticConcurrency: true }); |
|||
|
|||
export const User = model<IUser>('User', UserSchema); |
|||
export default User; |
@ -0,0 +1,73 @@ |
|||
// app/services/cache.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from 'node:assert'; |
|||
|
|||
import { Redis } from 'ioredis'; |
|||
|
|||
import { DtpService, DtpPlatform } from '../../lib/dtplib.js'; |
|||
|
|||
export class CacheService extends DtpService { |
|||
|
|||
static get name ( ) { return 'CacheService'; } |
|||
static get slug ( ) { return 'cache'; } |
|||
|
|||
redis: Redis; |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, CacheService); |
|||
|
|||
assert(platform.redis, 'Redis connection required'); |
|||
this.redis = platform.redis; |
|||
} |
|||
|
|||
async set (name: string, value: string) { |
|||
return this.redis.set(name, value); |
|||
} |
|||
|
|||
async setEx ( |
|||
name: string, |
|||
seconds: string | number, |
|||
value: string | number | Buffer, |
|||
) : Promise<"OK"> { |
|||
return this.redis.setex(name, seconds, value); |
|||
} |
|||
|
|||
async get (name: string) : Promise<string | null> { |
|||
return this.redis.get(name); |
|||
} |
|||
|
|||
async setObject ( |
|||
name: string, |
|||
value: object, |
|||
) : Promise<"OK"> { |
|||
return this.redis.set(name, JSON.stringify(value)); |
|||
} |
|||
|
|||
async setObjectEx ( |
|||
name: string, |
|||
seconds: number, |
|||
value: object, |
|||
) : Promise<"OK"> { |
|||
return this.redis.setex(name, seconds, JSON.stringify(value)); |
|||
} |
|||
|
|||
async getObject (name: string) : Promise<object | null> { |
|||
const value = await this.redis.get(name); |
|||
if (!value) { |
|||
return null; |
|||
} |
|||
return JSON.parse(value); |
|||
} |
|||
|
|||
async del (name: string) : Promise<number> { |
|||
return this.redis.del(name); |
|||
} |
|||
|
|||
getKeys (pattern: string) : Promise<Array<string> > { |
|||
return this.redis.keys(pattern); |
|||
} |
|||
} |
|||
|
|||
export default CacheService; |
@ -0,0 +1,108 @@ |
|||
// app/services/crypto.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from "node:assert"; |
|||
import crypto from 'node:crypto'; |
|||
|
|||
import env from '../../config/env.js'; |
|||
|
|||
import { DtpPlatform, DtpService } from '../../lib/dtplib.js'; |
|||
|
|||
export type EncryptedMessage = { |
|||
iv: string; |
|||
data: string; |
|||
}; |
|||
|
|||
export class CryptoService extends DtpService { |
|||
|
|||
static get name ( ) { return 'CryptoService'; } |
|||
static get slug ( ) { return 'crypto'; } |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, CryptoService); |
|||
} |
|||
|
|||
async start ( ) { |
|||
await super.start(); |
|||
assert(env.user.passwordSalt, "Password salt is required"); |
|||
} |
|||
|
|||
maskPassword (passwordSalt: string, password: string) : string { |
|||
assert(env.user.passwordSalt, "Password salt is required"); |
|||
const hash = crypto.createHash('sha256'); |
|||
|
|||
hash.update(env.user.passwordSalt); |
|||
hash.update(passwordSalt); |
|||
hash.update(password); |
|||
|
|||
return hash.digest('hex'); |
|||
} |
|||
|
|||
createHash (content: string | Buffer, algorithm: string = 'sha256') : string { |
|||
const hash = crypto.createHash(algorithm); |
|||
hash.update(content); |
|||
return hash.digest('hex'); |
|||
} |
|||
|
|||
hash32 (text: string) : string { |
|||
|
|||
function hashToHex (hash: number) : string { |
|||
let hashHex = hash.toString(16); |
|||
if (hashHex[0] === '-') { |
|||
hashHex = hashHex.slice(1); |
|||
} |
|||
return hashHex; |
|||
} |
|||
|
|||
let hash: number = 0; |
|||
if (text.length === 0) { |
|||
return hashToHex(hash); |
|||
} |
|||
|
|||
for (let i = text.length - 1; i >= 0; --i) { |
|||
const chr = text.charCodeAt(i); |
|||
hash = ((hash << 5) - hash) + chr; |
|||
hash |= 0; |
|||
} |
|||
|
|||
return hashToHex(hash); |
|||
} |
|||
|
|||
createProof (secret: string | Buffer, challenge: string | Buffer) : string { |
|||
const hash = crypto.createHash('sha256'); |
|||
hash.update(secret); |
|||
hash.update(challenge); |
|||
return hash.digest('hex'); |
|||
} |
|||
|
|||
encrypt (key: string, data: string | Buffer) : EncryptedMessage { |
|||
const iv = crypto.randomBytes(16); |
|||
const cipher = crypto.createCipheriv( |
|||
'aes-256-cbc', |
|||
Buffer.from(key, 'hex'), |
|||
iv, |
|||
); |
|||
|
|||
let encryptedData = cipher.update(data); |
|||
encryptedData = Buffer.concat([encryptedData, cipher.final()]); |
|||
|
|||
return { |
|||
iv: iv.toString('hex'), |
|||
data: encryptedData.toString('hex'), |
|||
}; |
|||
} |
|||
|
|||
decrypt (key: string, message: EncryptedMessage) : Buffer { |
|||
const decipher = crypto.createDecipheriv( |
|||
'aes-256-cbc', |
|||
Buffer.from(key, 'hex'), |
|||
Buffer.from(message.iv, 'hex'), |
|||
); |
|||
const encryptedData = Buffer.from(message.data, 'hex'); |
|||
const decryptedData = decipher.update(encryptedData); |
|||
return Buffer.concat([decryptedData, decipher.final()]); |
|||
} |
|||
} |
|||
|
|||
export default CryptoService; |
@ -0,0 +1,101 @@ |
|||
// app/services/csrf-token.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Request, Response, NextFunction, RequestHandler } from "express"; |
|||
import { v4 as uuidv4 } from "uuid"; |
|||
import dayjs from "dayjs"; |
|||
|
|||
import CsrfToken, { ICsrfToken } from "../models/csrf-token.js"; |
|||
|
|||
import { |
|||
DtpPlatform, |
|||
DtpService, |
|||
WebError, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
export interface CsrfTokenOptions { |
|||
name: string; |
|||
expiresMinutes: number; |
|||
allowReuse: boolean; |
|||
} |
|||
|
|||
export class CsrfTokenService extends DtpService { |
|||
static get name ( ) { return "CsrfTokenService"; } |
|||
static get slug ( ) { return "csrfToken"; } |
|||
|
|||
constructor(platform: DtpPlatform) { |
|||
super(platform, CsrfTokenService); |
|||
} |
|||
|
|||
middleware (options: CsrfTokenOptions) : RequestHandler { |
|||
return async (req: Request, _res: Response, next: NextFunction) : Promise<void> => { |
|||
const requestToken = req.body[`csrf-token-${options.name}`]; |
|||
if (!requestToken) { |
|||
this.log.error("missing CSRF token", { name: options.name }); |
|||
return next(new WebError(400, "Must include valid CSRF token")); |
|||
} |
|||
|
|||
const token = await CsrfToken.findOne({ token: requestToken }); |
|||
if (!token) { |
|||
return next(new WebError(400, "CSRF request token is invalid")); |
|||
} |
|||
if (token.ip !== req.ip) { |
|||
return next(new WebError(401, "CSRF request token client mismatch")); |
|||
} |
|||
if (token.claimed && !options.allowReuse) { |
|||
return next(new WebError(401, "Your request can't be accepted. Please refresh the page and try again.")); |
|||
} |
|||
|
|||
if (token.user) { |
|||
if (!req.user) { |
|||
return next(new WebError(403, "Must be logged in")); |
|||
} |
|||
if (!token.user._id.equals(req.user._id)) { |
|||
return next(new WebError(403, "CSRF request token user mismatch")); |
|||
} |
|||
} |
|||
|
|||
await CsrfToken.updateOne( |
|||
{ _id: token._id }, |
|||
{ $set: { claimed: new Date() } } |
|||
); |
|||
|
|||
return next(); |
|||
}; |
|||
} |
|||
|
|||
async create(req: Request, options: CsrfTokenOptions): Promise<ICsrfToken> { |
|||
const NOW = new Date(); |
|||
|
|||
options = Object.assign( |
|||
{ |
|||
expiresMinutes: 30, |
|||
}, |
|||
options |
|||
); |
|||
|
|||
if (options.expiresMinutes > 120) { |
|||
throw new WebError(400, "CSRF tokens have a max lifespan of 120 minutes"); |
|||
} |
|||
|
|||
const token = new CsrfToken(); |
|||
token.created = NOW; |
|||
token.expires = dayjs(NOW).add(options.expiresMinutes, "minute").toDate(); |
|||
if (req.user) { |
|||
token.user = req.user._id; |
|||
} |
|||
if (req.ip) { |
|||
token.ip = req.ip; |
|||
} |
|||
token.token = uuidv4(); |
|||
await token.save(); |
|||
|
|||
const tokenObj = token.toObject(); |
|||
tokenObj.name = `csrf-token-${options.name}`; |
|||
|
|||
return tokenObj; |
|||
} |
|||
} |
|||
|
|||
export default CsrfTokenService; |
@ -0,0 +1,53 @@ |
|||
// app/services/display-engine.js
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from "../../config/env.js"; |
|||
|
|||
import path from 'node:path'; |
|||
|
|||
import pug from 'pug'; |
|||
|
|||
import { |
|||
DtpPlatform, |
|||
DtpService, |
|||
WebError, |
|||
WebDisplayList, |
|||
WebViewModel, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
export class DisplayEngineService extends DtpService { |
|||
|
|||
static get name ( ) { return 'DisplayEngineService'; } |
|||
static get slug ( ) { return 'displayEngine'; } |
|||
|
|||
templates: Record<string, pug.compileTemplate>; |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, DisplayEngineService); |
|||
this.templates = { }; |
|||
} |
|||
|
|||
loadTemplate (name: string, pugScript: string) : void { |
|||
if (this.templates[name]) { |
|||
throw new Error(`Template already registered for name ${name}`); |
|||
} |
|||
const scriptFile = path.join(env.src, 'app', 'views', pugScript); |
|||
this.templates[name] = pug.compileFile(scriptFile); |
|||
} |
|||
|
|||
renderTemplate (name: string, viewModel: WebViewModel) : string { |
|||
const template = this.templates[name]; |
|||
if (!template) { |
|||
this.log.error('view engine template undefined', { name }); |
|||
throw new WebError(500, 'Unknown display engine template'); |
|||
} |
|||
return template(viewModel); |
|||
} |
|||
|
|||
createDisplayList (name?: string) : WebDisplayList { |
|||
return new WebDisplayList(name); |
|||
} |
|||
} |
|||
|
|||
export default DisplayEngineService; |
@ -0,0 +1,386 @@ |
|||
// app/services/email.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from "../../config/env.js"; |
|||
|
|||
import assert from "node:assert"; |
|||
import path from "node:path"; |
|||
import { v4 as uuidv4 } from "uuid"; |
|||
|
|||
import { createRequire } from "module"; |
|||
const require = createRequire(import.meta.url); // jshint ignore:line
|
|||
|
|||
import nodemailer from "nodemailer"; |
|||
import Mail from "nodemailer/lib/mailer"; |
|||
|
|||
import mongoose from 'mongoose'; |
|||
import Bull from 'bull'; |
|||
import pug from 'pug'; |
|||
|
|||
import dayjs from 'dayjs'; |
|||
import emailValidator from 'email-validator'; |
|||
const emailDomainCheck = require('email-domain-check'); |
|||
import numeral from 'numeral'; |
|||
|
|||
import { IEmailBlacklist } from '../../app/models/email-blacklist.js'; |
|||
const EmailBlacklist = mongoose.model<IEmailBlacklist>('EmailBlacklist'); |
|||
|
|||
import { IEmailVerify } from '../../app/models/email-verify.js'; |
|||
const EmailVerify = mongoose.model<IEmailVerify>('EmailVerify'); |
|||
|
|||
import { IEmailLog } from '../../app/models/email-log.js'; |
|||
const EmailLog = mongoose.model<IEmailLog>('EmailLog'); |
|||
|
|||
import { IUser } from '../../app/models/user.js'; |
|||
|
|||
import { |
|||
DtpTools, |
|||
DtpPlatform, |
|||
DtpService, |
|||
WebError, |
|||
WebViewModel, |
|||
} from '../../lib/dtplib.js'; |
|||
|
|||
import { UserService } from './user.js'; |
|||
import { JobQueueService } from './job-queue.js'; |
|||
import { CacheService } from './cache.js'; |
|||
|
|||
export type EmailAddress = string | Mail.Address; |
|||
|
|||
export type EmailMessage = { |
|||
from: EmailAddress; |
|||
to: EmailAddress; |
|||
subject: string; |
|||
text?: string; |
|||
html?: string; |
|||
attachments?: Array<Mail.Attachment>; |
|||
}; |
|||
|
|||
export class EmailService extends DtpService { |
|||
|
|||
static get name ( ) { return 'EmailService'; } |
|||
static get slug ( ) { return 'email'; } |
|||
|
|||
transport?: nodemailer.Transporter; |
|||
emailQueue?: Bull.Queue; |
|||
|
|||
disposableEmailDomains?: Array<string>; |
|||
templates: Record<string, Record<string, pug.compileTemplate> > = { }; |
|||
|
|||
populateEmailVerify: Array<mongoose.PopulateOptions> = [ ]; |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, EmailService); |
|||
} |
|||
|
|||
async start ( ) { |
|||
await super.start(); |
|||
|
|||
const domainFile = path.resolve( |
|||
env.root, |
|||
'node_modules', |
|||
'disposable-email-provider-domains', |
|||
'data', |
|||
'domains.json', |
|||
); |
|||
this.disposableEmailDomains = await DtpTools.readJsonFile(domainFile) as Array<string>; |
|||
|
|||
const userService = this.platform.components.getService<UserService>('user'); |
|||
this.populateEmailVerify = [ |
|||
{ |
|||
path: 'user', |
|||
select: userService.USER_SELECT, |
|||
}, |
|||
]; |
|||
|
|||
if (!env.email.enabled) { |
|||
this.log.info("MT_EMAIL_SERVICE is disabled, the system can't send email and will not try."); |
|||
return; |
|||
} |
|||
|
|||
this.log.info('creating SMTP transport', { |
|||
host: env.email.smtp.host, |
|||
port: env.email.smtp.port, |
|||
}); |
|||
const transportOptions = { |
|||
host: env.email.smtp.host, |
|||
port: env.email.smtp.port, |
|||
secure: env.email.smtp.secure, |
|||
auth: { |
|||
user: env.email.smtp.user, |
|||
pass: env.email.smtp.password, |
|||
}, |
|||
pool: env.email.smtp.pool.enabled, |
|||
maxConnections: env.email.smtp.pool.maxConnections, |
|||
maxMessages: env.email.smtp.pool.maxMessages, |
|||
}; |
|||
this.transport = nodemailer.createTransport(transportOptions); |
|||
|
|||
this.templates = { |
|||
html: { |
|||
welcome: this.loadAppTemplate('html', 'welcome.pug'), |
|||
passwordReset: this.loadAppTemplate('html', 'password-reset.pug'), |
|||
marketingBlast: this.loadAppTemplate('html', 'newsletter.pug'), |
|||
userEmail: this.loadAppTemplate('html', 'user-email.pug'), |
|||
}, |
|||
|
|||
text: { |
|||
welcome: this.loadAppTemplate('text', 'welcome.pug'), |
|||
passwordReset: this.loadAppTemplate('text', 'password-reset.pug'), |
|||
marketingBlast: this.loadAppTemplate('text', 'newsletter.pug'), |
|||
userEmail: this.loadAppTemplate('text', 'user-email.pug'), |
|||
}, |
|||
}; |
|||
|
|||
const jobQueueService = this.platform.components.getService<JobQueueService>('jobQueue'); |
|||
this.emailQueue = jobQueueService.getJobQueue('email', env.jobQueues.email); |
|||
} |
|||
|
|||
/** |
|||
* Renders a configured email template using the specified template view model |
|||
* to produce the requested output content type (HTML or text). |
|||
* |
|||
* @param templateId string The identifier of the template to use |
|||
* @param templateType string Either 'html' or 'text' to specify output format. |
|||
* @param templateModel WebViewModel The template's view model from which |
|||
* template data will be inserted into the template being rendered. |
|||
* @returns Promise<string> A promise that resolves the rendered HTML or text |
|||
* content. |
|||
*/ |
|||
async renderTemplate ( |
|||
templateId: string, |
|||
templateType: string, |
|||
templateModel: WebViewModel, |
|||
) : Promise<string> { |
|||
const templateMap = this.templates[templateType]; |
|||
if (!templateMap) { |
|||
throw new Error(`Unknown email template type: ${templateType}`); |
|||
} |
|||
|
|||
const template = templateMap[templateId]; |
|||
if (!template) { |
|||
throw new WebError(500, `Unknown email template: ${templateId}`); |
|||
} |
|||
|
|||
const cacheService = this.platform.components.getService<CacheService>('cache'); |
|||
|
|||
const settingsKey = `settings:${env.site.domainKey}:site`; |
|||
const adminSettings = await cacheService.getObject(settingsKey) as Record<string, unknown>; |
|||
|
|||
const siteSettings = Object.assign({ }, env.site); // defaults and .env
|
|||
templateModel.site = Object.assign(siteSettings, adminSettings); // admin overrides
|
|||
|
|||
return template(templateModel); |
|||
} |
|||
|
|||
/** |
|||
* Sends the email message using the configured NodeMailer transport. |
|||
* The message specifies to, from, subject, html, and text content. |
|||
* @param message NodeMailerMessage The message to be sent. |
|||
*/ |
|||
async send (message: EmailMessage) : Promise<IEmailLog> { |
|||
if (!this.transport) { |
|||
throw new WebError(500, 'Email transport required'); |
|||
} |
|||
const NOW = new Date(); |
|||
|
|||
this.log.info('sending email', { to: message.to }); |
|||
const response = await this.transport.sendMail(message); |
|||
this.log.debug('email sent', { to: message.to, response }); |
|||
|
|||
const from = (typeof message.from === 'object') ? message.from.address : message.from; |
|||
const to = (typeof message.to === 'object') ? message.to.address : message.to; |
|||
const log = await EmailLog.create({ |
|||
created: NOW, |
|||
from, to, |
|||
to_lc: to.toLowerCase(), |
|||
subject: message.subject, |
|||
messageId: response.messageId, |
|||
}); |
|||
|
|||
return log.toObject(); |
|||
} |
|||
|
|||
async sendWelcomeEmail (user: IUser) : Promise<void> { |
|||
await this.removeVerificationTokensForUser(user); |
|||
const verifyToken = await this.createVerificationToken(user); |
|||
const templateModel: WebViewModel = { |
|||
site: env.site, |
|||
recipient: user, |
|||
emailVerifyToken: verifyToken.token, |
|||
}; |
|||
|
|||
const emailName = user.email.split('@')[0]; |
|||
assert(emailName, "recipient email address is malformed"); |
|||
|
|||
const message: EmailMessage = { |
|||
from: env.email.smtp.from, |
|||
to: { |
|||
name: user.displayName || emailName, |
|||
address: user.email, |
|||
}, |
|||
subject: `Welcome to ${env.site.name}!`, |
|||
html: await this.renderTemplate('welcome', 'html', templateModel), |
|||
text: await this.renderTemplate('welcome', 'text', templateModel), |
|||
}; |
|||
await this.send(message); |
|||
} |
|||
|
|||
async sendNewsletter (message: EmailMessage) : Promise<void> { |
|||
if (!this.emailQueue) { |
|||
throw new WebError(500, 'Email job queue is required for newsletter services'); |
|||
} |
|||
this.log.info('mass mail definition', { message }); |
|||
await this.emailQueue.add('email-newsletter', { message }); |
|||
} |
|||
|
|||
/** |
|||
* Checks an email address for validity and to not be blocked or blacklisted |
|||
* by the service. Does not return a Boolean. Will instead throw an error if |
|||
* the address is rejected by the system. |
|||
* @param emailAddress string The email address to be checked. |
|||
*/ |
|||
async checkEmailAddress (emailAddress: string) : Promise<string> { |
|||
this.log.debug('validating email address', { emailAddress }); |
|||
|
|||
emailAddress = emailAddress.trim(); |
|||
if (!emailValidator.validate(emailAddress)) { |
|||
throw new Error('Email address is invalid'); |
|||
} |
|||
|
|||
const domainCheck = await emailDomainCheck(emailAddress); |
|||
this.log.debug('email domain check', { domainCheck }); |
|||
if (!domainCheck) { |
|||
throw new Error('Email address is invalid'); |
|||
} |
|||
|
|||
await this.isEmailBlacklisted(emailAddress); |
|||
|
|||
return emailAddress; |
|||
} |
|||
|
|||
/** |
|||
* Check if the provided email address is blacklisted either by our database |
|||
* of known-malicious/spammy emails or by this system itself. |
|||
* @param emailAddress string The email address to be checked |
|||
* @returns boolean true if the address is blacklisted; false otherwise. |
|||
*/ |
|||
async isEmailBlacklisted (emailAddress: string) : Promise<boolean> { |
|||
emailAddress = emailAddress.toLowerCase().trim(); |
|||
|
|||
const parts = emailAddress.split('@'); |
|||
if (!parts[0]) { |
|||
throw new WebError(400, 'Invalid email address'); |
|||
} |
|||
const domain = parts[1] ? parts[1] : parts[0]; |
|||
|
|||
if (this.disposableEmailDomains) { |
|||
if (this.disposableEmailDomains.includes(domain)) { |
|||
this.log.alert('blacklisted email domain blocked', { emailAddress, domain }); |
|||
throw new WebError(400, 'Invalid email address'); |
|||
} |
|||
} |
|||
|
|||
this.log.debug('checking email domain for blacklist', { domain }); |
|||
const blacklistRecord = await EmailBlacklist.findOne({ email: emailAddress }); |
|||
if (blacklistRecord) { |
|||
throw new WebError(401, 'Email address has requested to not receive emails'); |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* Creates an email verification token that can be used to verify the email |
|||
* address of a new site member. |
|||
* @param user IUser the user for which an email verification token should |
|||
* be created. |
|||
* @returns new email verification token (for use in creating a link to it) |
|||
*/ |
|||
async createVerificationToken (user: IUser) : Promise<IEmailVerify> { |
|||
const NOW = new Date(); |
|||
const verify = new EmailVerify(); |
|||
|
|||
verify.created = NOW; |
|||
verify.user = user._id; |
|||
verify.token = uuidv4(); |
|||
|
|||
await verify.save(); |
|||
|
|||
this.log.info('created email verification token for user', { |
|||
user: { |
|||
_id: user._id, |
|||
}, |
|||
}); |
|||
|
|||
return verify.toObject(); |
|||
} |
|||
|
|||
async getVerificationToken (token: string) : Promise<IEmailVerify | null> { |
|||
const emailVerify = await EmailVerify |
|||
.findOne({ token }) |
|||
.populate(this.populateEmailVerify) |
|||
.lean(); |
|||
return emailVerify; |
|||
} |
|||
|
|||
/** |
|||
* Checks an email verification token for validity, and updates the associated |
|||
* User's isEmailVerified flag on success. |
|||
* @param token string The token received from the email verification |
|||
* request. |
|||
*/ |
|||
async verifyToken (token: string) : Promise<void> { |
|||
const NOW = new Date(); |
|||
const userService = this.platform.components.getService<UserService>('user'); |
|||
|
|||
// fetch the token from the db
|
|||
const emailVerify = await EmailVerify |
|||
.findOne({ token: token }) |
|||
.populate(this.populateEmailVerify) |
|||
.lean(); |
|||
|
|||
// verify that the token is at least valid (it exists)
|
|||
if (!emailVerify) { |
|||
this.log.error('email verify token not found', { token }); |
|||
throw new WebError(403, 'Email verification token is invalid'); |
|||
} |
|||
|
|||
// verify that it hasn't already been verified (user clicked link more than once)
|
|||
if (emailVerify.verified) { |
|||
this.log.error('email verify token already claimed', { token }); |
|||
throw new WebError(403, 'Email verification token is invalid'); |
|||
} |
|||
|
|||
this.log.info('marking user email verified', { userId: emailVerify.user._id }); |
|||
await userService.setEmailVerification(emailVerify.user, true); |
|||
|
|||
await EmailVerify.updateOne({ _id: emailVerify._id }, { $set: { verified: NOW } }); |
|||
} |
|||
|
|||
/** |
|||
* Removes all pending EmailVerify tokens for the specified user. This will |
|||
* happen when the User changes their email address or if triggered |
|||
* administratively on the User account. |
|||
* |
|||
* @param user IUser the User for whom all pending verification tokens are |
|||
* to be removed. |
|||
*/ |
|||
async removeVerificationTokensForUser (user: IUser) : Promise<void> { |
|||
this.log.info('removing all pending email address verification tokens for user', { user: user._id }); |
|||
await EmailVerify.deleteMany({ user: user._id }); |
|||
} |
|||
|
|||
createMessageModel (viewModel: WebViewModel) : WebViewModel { |
|||
const messageModel: WebViewModel = { |
|||
config: env, |
|||
site: env.site, |
|||
dayjs, |
|||
numeral, |
|||
}; |
|||
return Object.assign(messageModel, viewModel); |
|||
} |
|||
} |
|||
|
|||
export default EmailService; |
@ -0,0 +1,242 @@ |
|||
// app/services/image.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from "../../config/env.js"; |
|||
|
|||
import mongoose from "mongoose"; |
|||
import sharp, { Sharp, Metadata as SharpMetadata } from "sharp"; |
|||
|
|||
import { IImage } from "../models/image.js"; |
|||
const WebImage = mongoose.model<IImage>("Image"); |
|||
|
|||
import { IUser } from "../models/user.js"; |
|||
import { IImageMetadata } from "../models/lib/image-metadata.js"; |
|||
|
|||
import { |
|||
DtpPlatform, |
|||
DtpService, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
import { MinioObjectMetadata, MinioService } from "./minio.js"; |
|||
import { UserService } from "./user.js"; |
|||
|
|||
export type ImageServiceStats = { |
|||
count: number; |
|||
bytes: number; |
|||
date?: string; |
|||
}; |
|||
|
|||
export type ImageServiceStatsReport = { |
|||
chart: Array<ImageServiceStats>; |
|||
stats: ImageServiceStats; |
|||
}; |
|||
|
|||
export class ImageService extends DtpService { |
|||
|
|||
static get name ( ) { return "ImageService"; } |
|||
static get slug ( ) { return "image"; } |
|||
|
|||
populateImage: Array<mongoose.PopulateOptions> = [ ]; |
|||
|
|||
constructor(platform: DtpPlatform) { |
|||
super(platform, ImageService); |
|||
} |
|||
|
|||
async start() { |
|||
await super.start(); |
|||
|
|||
const userService = this.platform.components.getService<UserService>("user"); |
|||
this.populateImage.push({ |
|||
path: "owner", |
|||
select: userService.USER_SELECT, |
|||
}); |
|||
} |
|||
|
|||
async create(owner: IUser, file: Express.Multer.File): Promise<IImage> { |
|||
const NOW = new Date(); |
|||
const minioService = this.platform.components.getService<MinioService>("minio"); |
|||
this.log.debug("processing uploaded image", { file }); |
|||
|
|||
const sharpImage: Sharp = sharp(file.path); |
|||
const metadata: SharpMetadata = await sharpImage.metadata(); |
|||
|
|||
const image = new WebImage(); |
|||
image.created = NOW; |
|||
image.owner = owner._id; |
|||
image.type = file.mimetype; |
|||
image.size = file.size; |
|||
|
|||
image.metadata = this.makeImageMetadata(metadata); |
|||
|
|||
const imageId = image._id.toString(); |
|||
const ownerId = owner._id.toString(); |
|||
|
|||
image.file = { |
|||
bucket: env.minio.buckets.images, |
|||
key: `/image/${ownerId.slice(0, 3)}/${ownerId}/${imageId.slice(0, 3)}/${imageId}`, |
|||
}; |
|||
|
|||
// upload the image file to MinIO
|
|||
await minioService.uploadFile({ |
|||
bucket: image.file.bucket, |
|||
key: image.file.key, |
|||
filePath: file.path, |
|||
metadata: { |
|||
"Content-Type": file.mimetype, |
|||
"Content-Length": file.size.toString(), |
|||
}, |
|||
}); |
|||
|
|||
// save the Image model to the db
|
|||
await image.save(); |
|||
|
|||
this.log.info("processed uploaded image", { |
|||
ownerId, |
|||
imageId, |
|||
key: image.file.key, |
|||
}); |
|||
return image.toObject(); |
|||
} |
|||
|
|||
async createFromBuffer( |
|||
owner: IUser, |
|||
buffer: Buffer, |
|||
contentType: string, |
|||
imageMetadata: SharpMetadata, |
|||
bufferMetadata?: MinioObjectMetadata |
|||
): Promise<IImage> { |
|||
const NOW = new Date(); |
|||
const minioService = this.platform.components.getService<MinioService>("minio"); |
|||
|
|||
const image = new WebImage(); |
|||
image.created = NOW; |
|||
image.owner = owner._id; |
|||
image.type = contentType; |
|||
image.size = buffer.length; |
|||
|
|||
if (bufferMetadata) { |
|||
image.metadata = this.makeImageMetadata(imageMetadata); |
|||
} |
|||
|
|||
const imageId = image._id.toString(); |
|||
const ownerId = owner._id.toString(); |
|||
image.file = { |
|||
bucket: env.minio.buckets.images, |
|||
key: `/image/${ownerId.slice(0, 3)}/${ownerId}/${imageId.slice( |
|||
0, |
|||
3 |
|||
)}/${imageId}`,
|
|||
}; |
|||
|
|||
// upload the image file to MinIO
|
|||
await minioService.uploadBuffer({ |
|||
bucket: image.file.bucket, |
|||
key: image.file.key, |
|||
buffer, |
|||
metadata: bufferMetadata, |
|||
}); |
|||
|
|||
// save the Image model to the db
|
|||
await image.save(); |
|||
|
|||
this.log.info("image uploaded to storage from buffer", { |
|||
ownerId, |
|||
imageId, |
|||
fileKey: image.file.key, |
|||
}); |
|||
|
|||
return image.toObject(); |
|||
} |
|||
|
|||
async getById(imageId: mongoose.Types.ObjectId): Promise<IImage | null> { |
|||
const image = await WebImage.findById(imageId).populate(this.populateImage); |
|||
return image; |
|||
} |
|||
|
|||
async getRecentImagesForOwner(owner: IUser): Promise<Array<IImage>> { |
|||
const images: Array<IImage> = await WebImage.find({ owner: owner._id }) |
|||
.sort({ created: -1 }) |
|||
.limit(10) |
|||
.populate(this.populateImage) |
|||
.lean(); |
|||
return images; |
|||
} |
|||
|
|||
async removeForUser(user: IUser): Promise<void> { |
|||
this.log.info("removing all images for user", { userId: user._id }); |
|||
const handler = this.remove.bind(this); |
|||
await WebImage.find({ owner: user._id }) |
|||
.populate(this.populateImage) |
|||
.cursor() |
|||
.eachAsync(handler, { parallel: 2 }); |
|||
} |
|||
|
|||
async remove(image: IImage): Promise<void> { |
|||
const minioService = this.platform.components.getService<MinioService>("minio"); |
|||
try { |
|||
if (image.file && image.file.bucket && image.file.key) { |
|||
// this.log.debug('removing image from storage', { file: image.file });
|
|||
await minioService.removeObject(image.file.bucket, image.file.key); |
|||
} |
|||
} catch (error) { |
|||
this.log.error("failed to remove image from storage", { error }); |
|||
// fall through
|
|||
} |
|||
await WebImage.deleteOne({ _id: image._id }); |
|||
} |
|||
|
|||
makeImageMetadata(metadata: SharpMetadata): IImageMetadata { |
|||
return { |
|||
format: metadata.format, |
|||
size: metadata.size, |
|||
width: metadata.width, |
|||
height: metadata.height, |
|||
space: metadata.space, |
|||
channels: metadata.channels, |
|||
depth: metadata.depth, |
|||
density: metadata.density, |
|||
hasAlpha: metadata.hasAlpha, |
|||
orientation: metadata.orientation, |
|||
}; |
|||
} |
|||
|
|||
async reportStats(): Promise<ImageServiceStatsReport> { |
|||
const chart = await WebImage.aggregate<ImageServiceStats>([ |
|||
{ |
|||
$match: {}, |
|||
}, |
|||
{ |
|||
$group: { |
|||
_id: { $dateToString: { format: "%Y-%m", date: "$created" } }, |
|||
count: { $sum: 1 }, |
|||
bytes: { $sum: "$size" }, |
|||
}, |
|||
}, |
|||
{ |
|||
$project: { |
|||
_id: false, |
|||
date: "$_id", |
|||
count: "$count", |
|||
bytes: "$bytes", |
|||
}, |
|||
}, |
|||
{ |
|||
$sort: { date: 1 }, |
|||
}, |
|||
]); |
|||
|
|||
const stats: ImageServiceStats = { |
|||
count: chart.reduce((prev, value) => { |
|||
return prev + value.count; |
|||
}, 0), |
|||
bytes: chart.reduce((prev, value) => { |
|||
return prev + value.bytes; |
|||
}, 0), |
|||
}; |
|||
|
|||
return { chart, stats }; |
|||
} |
|||
} |
|||
|
|||
export default ImageService; |
@ -0,0 +1,55 @@ |
|||
// app/services/job-queue.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from '../../config/env.js'; |
|||
import assert from 'node:assert'; |
|||
|
|||
import Bull from 'bull'; |
|||
|
|||
import { DtpPlatform, DtpService } from '../../lib/dtplib.js'; |
|||
|
|||
export class JobQueueService extends DtpService { |
|||
|
|||
static get slug () { return 'jobQueue'; } |
|||
static get name ( ) { return 'JobQueueService'; } |
|||
|
|||
queues: Record<string, Bull.Queue> = { }; |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, JobQueueService); |
|||
} |
|||
|
|||
getJobQueue (name: string, defaultJobOptions: Bull.JobOptions) : Bull.Queue { |
|||
let queue = this.queues[name]; |
|||
if (queue) { |
|||
return queue; |
|||
} |
|||
|
|||
queue = new Bull(name, { |
|||
prefix: env.redis.keyPrefix, |
|||
redis: { |
|||
host: env.redis.host, |
|||
port: env.redis.port, |
|||
password: env.redis.password, |
|||
keyPrefix: env.redis.keyPrefix, |
|||
}, |
|||
defaultJobOptions, |
|||
}); |
|||
queue.setMaxListeners(64); |
|||
|
|||
this.queues[name] = queue; |
|||
return queue; |
|||
} |
|||
|
|||
async discoverJobQueues (pattern: string) : Promise<Array<string> > { |
|||
assert(this.platform.redis, 'Redis connection required'); |
|||
const bullQueues: Array<string> = await this.platform.redis.keys(pattern); |
|||
return bullQueues |
|||
.map((queue) => queue.split(':')[1] || '---') |
|||
.sort() |
|||
; |
|||
} |
|||
} |
|||
|
|||
export default JobQueueService; |
@ -0,0 +1,3 @@ |
|||
# edit-with-vi.js |
|||
|
|||
This file must never be edited with VS Code. It will damage the file's contents. |
@ -0,0 +1,77 @@ |
|||
// edit-with-vi.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
// Based on:
|
|||
// https://github.com/voidful/text-filtering-js/blob/master/text_filtering.js
|
|||
// - Does not extend String because stop it.
|
|||
// - CommonJS module
|
|||
|
|||
'use strict'; |
|||
|
|||
/* |
|||
* This file must only be edited with vi/vim. If you so much as *open* this file |
|||
* in VSCode, you've probably damaged the file. Do not save it. Just close it, |
|||
* and go edit the file with vi or vim. |
|||
* |
|||
* VS Code, being web-based, contains logic to filter out the content used to |
|||
* implement the filter. You will erase that content, and then various attackers |
|||
* will own your chat. |
|||
* |
|||
* If attackers have owned your chat, you may want to revert or otherwise restore |
|||
* this file to it's original state. |
|||
*/ |
|||
|
|||
export function filterBBcode (text: string) : string { |
|||
return text.replace(/\[.*\]/g, ''); |
|||
} |
|||
|
|||
export function filterLineBreak (text: string) : string { |
|||
return text.replace(/(\r\n|\n|\r)/gm," "); |
|||
} |
|||
|
|||
export function filterSmileysCode (text: string) : string { |
|||
return text |
|||
.replace(/:\$?.*:\$?/g, '') |
|||
.replace(/:\w+:?/g, '') |
|||
.replace(/:\w+/g, '') |
|||
.replace(/&#.*;/g, '') |
|||
; |
|||
} |
|||
|
|||
export function filterGuff (text: string) : string { |
|||
return text.replace('*** 作者被禁止或刪除 內容自動屏蔽 ***', ''); |
|||
} |
|||
|
|||
export function filterHtml (text: string) : string { |
|||
return text.replace(/(<[^>]*>)/g,' '); |
|||
} |
|||
|
|||
export function filterNonsense (text: string) : string { |
|||
// edited to allow CR and LF
|
|||
// text = text.replace(/[\u0000-\u001F\u007f\u00AD\u200B-\u200D\u3000\uFEFF]/g,'');
|
|||
text = text.replace(/[\u0000-\u0009\u000b\u000c\u000e\u007f\u00AD\u200B-\u200D\u3000\uFEFF]/g,''); |
|||
|
|||
text = text.replace(/\u00AD/,' '); |
|||
text = text.replace(/\u2013/,'-'); |
|||
return text; |
|||
} |
|||
|
|||
export function filterAll (text: string) : string { |
|||
text = module.exports.filterSmileysCode(text); |
|||
text = module.exports.filterBBcode(text); |
|||
text = module.exports.filterGuff(text); |
|||
text = module.exports.filterHtml(text); |
|||
text = module.exports.filterLineBreak(text); |
|||
return text; |
|||
} |
|||
|
|||
export default { |
|||
filterBBcode, |
|||
filterLineBreak, |
|||
filterSmileysCode, |
|||
filterGuff, |
|||
filterHtml, |
|||
filterNonsense, |
|||
filterAll, |
|||
}; |
@ -0,0 +1,172 @@ |
|||
// app/services/minio.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import env from "../../config/env.js"; |
|||
|
|||
import { Stream as NodeStream } from "node:stream"; |
|||
|
|||
import { |
|||
Client as MinioClient, |
|||
CopyConditions as MinioCopyConditions, |
|||
BucketItemStat as MinioBucketItemStat, |
|||
} from "minio"; |
|||
|
|||
/* |
|||
* Not sure if this is really the right solution, but I need the type and it's |
|||
* not exposed any other way. |
|||
*/ |
|||
import { UploadedObjectInfo } from "../../../node_modules/minio/dist/esm/internal/type.mjs"; |
|||
|
|||
import { DtpPlatform, DtpService, WebError } from "../../lib/dtplib.js"; |
|||
|
|||
export type MinioObjectMetadata = Record<string, string>; |
|||
|
|||
export interface MinioFile { |
|||
bucket: string; |
|||
key: string; |
|||
filePath?: string; |
|||
metadata?: MinioObjectMetadata; |
|||
} |
|||
|
|||
export interface MinioStreamFileRange { |
|||
offset: number; |
|||
length: number; |
|||
} |
|||
|
|||
export interface MinioStreamFile extends MinioFile { |
|||
range?: MinioStreamFileRange; |
|||
} |
|||
|
|||
export interface MinioBuffer { |
|||
bucket: string; |
|||
key: string; |
|||
buffer: Buffer; |
|||
metadata?: MinioObjectMetadata; |
|||
} |
|||
|
|||
export class MinioService extends DtpService { |
|||
static get name ( ) { return "MinioService"; } |
|||
static get slug ( ) { return "minio"; } |
|||
|
|||
minio?: MinioClient; |
|||
|
|||
constructor(platform: DtpPlatform) { |
|||
super(platform, MinioService); |
|||
} |
|||
|
|||
async start ( ) : Promise<void> { |
|||
await super.start(); |
|||
|
|||
this.minio = new MinioClient({ |
|||
endPoint: env.minio.endpoint, |
|||
port: env.minio.port, |
|||
useSSL: env.minio.useSsl, |
|||
accessKey: env.minio.accessKey, |
|||
secretKey: env.minio.secretKey, |
|||
}); |
|||
} |
|||
|
|||
async uploadBuffer (buffer: MinioBuffer) : Promise<void> { |
|||
if (!this.minio) { |
|||
throw new WebError(500, "Not connected to storage"); |
|||
} |
|||
const response = await this.minio.putObject( |
|||
buffer.bucket, |
|||
buffer.key, |
|||
buffer.buffer, |
|||
buffer.buffer.length, |
|||
buffer.metadata |
|||
); |
|||
this.log.debug("uploaded buffer to storage", { response }); |
|||
} |
|||
|
|||
async uploadFile (fileInfo: MinioFile) : Promise<UploadedObjectInfo> { |
|||
if (!this.minio) { |
|||
throw new WebError(500, "Not connected to storage"); |
|||
} |
|||
if (!fileInfo.filePath) { |
|||
throw new WebError(400, "Must specify filePath of file to upload"); |
|||
} |
|||
return this.minio.fPutObject( |
|||
fileInfo.bucket, |
|||
fileInfo.key, |
|||
fileInfo.filePath, |
|||
fileInfo.metadata |
|||
); |
|||
} |
|||
|
|||
async statFile (file: MinioFile) : Promise<MinioBucketItemStat> { |
|||
return this.statObject(file.bucket, file.key); |
|||
} |
|||
|
|||
async statObject (bucket: string, key: string) : Promise<MinioBucketItemStat> { |
|||
if (!this.minio) { |
|||
throw new WebError(500, "Not connected to storage"); |
|||
} |
|||
this.log.debug("retrieving object status", { bucket, key }); |
|||
return this.minio.statObject(bucket, key); |
|||
} |
|||
|
|||
async downloadFile (fileInfo: MinioFile) : Promise<void> { |
|||
if (!this.minio) { |
|||
throw new WebError(500, "Not connected to storage"); |
|||
} |
|||
if (!fileInfo.filePath) { |
|||
throw new WebError(400, "Must specify target filePath for download"); |
|||
} |
|||
this.log.debug("downloading object to file", { |
|||
bucket: fileInfo.bucket, |
|||
key: fileInfo.key, |
|||
filePath: fileInfo.filePath, |
|||
}); |
|||
return this.minio.fGetObject( |
|||
fileInfo.bucket, |
|||
fileInfo.key, |
|||
fileInfo.filePath |
|||
); |
|||
} |
|||
|
|||
async openDownloadStream(fileInfo: MinioStreamFile): Promise<NodeStream> { |
|||
if (!this.minio) { |
|||
throw new WebError(500, "Not connected to storage"); |
|||
} |
|||
|
|||
if (fileInfo.range) { |
|||
this.log.debug("fetching partial object", { |
|||
bucket: fileInfo.bucket, |
|||
key: fileInfo.key, |
|||
range: fileInfo.range, |
|||
}); |
|||
const stream: NodeStream = await this.minio.getPartialObject( |
|||
fileInfo.bucket, |
|||
fileInfo.key, |
|||
fileInfo.range.offset, |
|||
fileInfo.range.length |
|||
); |
|||
return stream; |
|||
} |
|||
|
|||
this.log.debug("fetching object", { |
|||
bucket: fileInfo.bucket, |
|||
key: fileInfo.key, |
|||
}); |
|||
const stream: NodeStream = await this.minio.getObject( |
|||
fileInfo.bucket, |
|||
fileInfo.key |
|||
); |
|||
return stream; |
|||
} |
|||
|
|||
async removeObject(bucket: string, key: string): Promise<void> { |
|||
if (!this.minio) { |
|||
throw new WebError(500, "Not connected to storage"); |
|||
} |
|||
this.log.debug("removing object", { bucket, key }); |
|||
await this.minio.removeObject(bucket, key); |
|||
} |
|||
} |
|||
|
|||
export default MinioService; |
|||
|
|||
export { MinioCopyConditions, MinioBucketItemStat, NodeStream }; |
@ -0,0 +1,234 @@ |
|||
// app/services/process.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Types as MongooseTypes } from "mongoose"; |
|||
import dayjs from 'dayjs'; |
|||
|
|||
import { IDtpProcessEndpoint } from '../models/lib/process-endpoint.js'; |
|||
import { DtpProcessStatus } from '../models/lib/process-status.js'; |
|||
|
|||
import { |
|||
IDtpProcessStats, |
|||
IDtpWebProcessStats, |
|||
IDtpWorkerProcessStats, |
|||
} from 'app/models/lib/process-stats.js'; |
|||
|
|||
import { |
|||
DtpProcessType, |
|||
|
|||
IDtpProcess, |
|||
DtpProcess, |
|||
|
|||
IDtpWebProcess, |
|||
DtpWebProcess, |
|||
|
|||
IDtpWorkerProcess, |
|||
DtpWorkerProcess, |
|||
} from "../models/process.ts"; |
|||
|
|||
import { DtpService, DtpPlatform } from '../../lib/dtplib.js'; |
|||
import { WebPaginationParameters } from '../../lib/web/pagination-parameters.js'; |
|||
import { DtpWebProcessStatsHistory, DtpWorkerProcessStatsHistory } from "../models/process-stats.ts"; |
|||
|
|||
export class ProcessService extends DtpService { |
|||
|
|||
static get name ( ) { return 'ProcessService'; } |
|||
static get slug ( ) { return 'process'; } |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, ProcessService); |
|||
} |
|||
|
|||
async createWebProcess (endpoint: IDtpProcessEndpoint) : Promise<IDtpWebProcess> { |
|||
const NOW = new Date(); |
|||
const dtpProcess = new DtpWebProcess(); |
|||
dtpProcess.created = NOW; |
|||
dtpProcess.updated = NOW; |
|||
dtpProcess.type = DtpProcessType.Web; |
|||
dtpProcess.status = DtpProcessStatus.Starting; |
|||
dtpProcess.endpoint = endpoint; |
|||
dtpProcess.processStats = { |
|||
cpu: 0, |
|||
memory: 0, |
|||
storage: 0, |
|||
netBytesTx: 0, |
|||
netBytesRx: 0, |
|||
}; |
|||
dtpProcess.webStats = { |
|||
webRequestCount: 0, |
|||
webErrorCount: 0, |
|||
}; |
|||
await dtpProcess.save(); |
|||
return dtpProcess.toObject(); |
|||
} |
|||
|
|||
async createWorkerProcess (endpoint: IDtpProcessEndpoint) : Promise<IDtpWorkerProcess> { |
|||
const NOW = new Date(); |
|||
const dtpProcess = new DtpWorkerProcess(); |
|||
dtpProcess.created = NOW; |
|||
dtpProcess.updated = NOW; |
|||
dtpProcess.type = DtpProcessType.Worker; |
|||
dtpProcess.status = DtpProcessStatus.Starting; |
|||
dtpProcess.endpoint = endpoint; |
|||
dtpProcess.processStats = { |
|||
cpu: 0, |
|||
memory: 0, |
|||
storage: 0, |
|||
netBytesTx: 0, |
|||
netBytesRx: 0, |
|||
}; |
|||
dtpProcess.workerStats = { |
|||
jobRunCount: 0, |
|||
}; |
|||
await dtpProcess.save(); |
|||
return dtpProcess.toObject(); |
|||
} |
|||
|
|||
async setStatus ( |
|||
dtpProcess: IDtpProcess, |
|||
status: DtpProcessStatus, |
|||
) : Promise<void> { |
|||
const NOW = new Date(); |
|||
this.log.debug('setting process status', { |
|||
endpoint: dtpProcess.endpoint, |
|||
status, |
|||
}); |
|||
await DtpProcess.updateOne( |
|||
{ _id: dtpProcess._id }, |
|||
{ |
|||
$set: { |
|||
updated: NOW, |
|||
status, |
|||
}, |
|||
}, |
|||
); |
|||
} |
|||
|
|||
async reportWebProcessStats ( |
|||
webProcess: IDtpWebProcess, |
|||
webStats: IDtpWebProcessStats, |
|||
processStats: IDtpProcessStats, |
|||
) : Promise<void> { |
|||
const NOW = new Date(); |
|||
|
|||
this.log.debug('reporting web process stats', { |
|||
hostname: webProcess.endpoint.hostname, |
|||
stats: webStats, |
|||
}); |
|||
|
|||
await DtpWebProcess.updateOne( |
|||
{ _id: webProcess._id }, |
|||
{ |
|||
$set: { |
|||
updated: NOW, |
|||
processStats, |
|||
webStats, |
|||
}, |
|||
}, |
|||
); |
|||
await DtpWebProcessStatsHistory.create({ |
|||
created: NOW, |
|||
process: webProcess._id, |
|||
processStats, |
|||
webStats, |
|||
}); |
|||
} |
|||
|
|||
async reportWorkerProcessStats ( |
|||
workerProcess: IDtpWorkerProcess, |
|||
workerStats: IDtpWorkerProcessStats, |
|||
processStats: IDtpProcessStats, |
|||
) : Promise<void> { |
|||
const NOW = new Date(); |
|||
|
|||
this.log.debug('reporting worker process stats', { |
|||
hostname: workerProcess.endpoint.hostname, |
|||
workerStats, |
|||
processStats, |
|||
}); |
|||
|
|||
await DtpWorkerProcess.updateOne( |
|||
{ _id: workerProcess._id }, |
|||
{ |
|||
$set: { |
|||
updated: NOW, |
|||
processStats, |
|||
workerStats, |
|||
}, |
|||
}, |
|||
); |
|||
await DtpWorkerProcessStatsHistory.create({ |
|||
created: NOW, |
|||
process: workerProcess._id, |
|||
processStats, |
|||
workerStats, |
|||
}); |
|||
} |
|||
|
|||
async getWebProcessById (webProcessId: MongooseTypes.ObjectId): Promise<IDtpWebProcess | null> { |
|||
const dtpProcess = await DtpWebProcess.findOne({ _id: webProcessId }).lean(); |
|||
return dtpProcess; |
|||
} |
|||
|
|||
async getWorkerProcessById (workerProcessId: MongooseTypes.ObjectId): Promise<IDtpWorkerProcess | null> { |
|||
const dtpProcess = await DtpWorkerProcess.findOne({ _id: workerProcessId }).lean(); |
|||
return dtpProcess; |
|||
} |
|||
|
|||
async getProcessById (dtpProcessId: MongooseTypes.ObjectId) : Promise<IDtpProcess | null> { |
|||
const dtpProcess = await DtpProcess.findOne({ _id: dtpProcessId }).lean(); |
|||
return dtpProcess; |
|||
} |
|||
|
|||
async getProcessesByStatus (status: [string], pagination: WebPaginationParameters) : Promise<Array<IDtpProcess>> { |
|||
const dtpProcesses = await DtpProcess |
|||
.find({ status }) |
|||
.sort({ created: -1 }) |
|||
.skip(pagination.skip) |
|||
.limit(pagination.cpp) |
|||
.lean(); |
|||
return dtpProcesses; |
|||
} |
|||
|
|||
async getAllProcesses (pagination: WebPaginationParameters) : Promise<Array<IDtpProcess>> { |
|||
const dtpProcesses = await DtpProcess |
|||
.find() |
|||
.sort({ created: -1 }) |
|||
.skip(pagination.skip) |
|||
.limit(pagination.cpp) |
|||
.lean(); |
|||
return dtpProcesses; |
|||
} |
|||
|
|||
async expireProcesses ( ) : Promise<void> { |
|||
const NOW = new Date(); |
|||
const OLDEST_DATE = dayjs(NOW).subtract(3, 'minute').toDate(); |
|||
this.log.info("expiring processes", { oldest: OLDEST_DATE }); |
|||
await DtpProcess |
|||
.find({ |
|||
$and: [ |
|||
{ status: { $ne: DtpProcessStatus.Shutdown } }, |
|||
{ updated: { $lt: OLDEST_DATE } }, |
|||
] |
|||
}) |
|||
.cursor() |
|||
.eachAsync(async (dtpProcess) => { |
|||
this.log.info('expiring process', { |
|||
processId: dtpProcess._id, |
|||
hostname: dtpProcess.endpoint.hostname, |
|||
}); |
|||
await DtpProcess.updateOne( |
|||
{ _id: dtpProcess._id }, |
|||
{ $set: { status: DtpProcessStatus.Shutdown } }, |
|||
); |
|||
}); |
|||
} |
|||
|
|||
async remove (dtpProcess: IDtpProcess | MongooseTypes.ObjectId) : Promise<void> { |
|||
this.log.info('removing process', { processId: dtpProcess._id }); |
|||
await DtpProcess.deleteOne({ _id: dtpProcess._id }); |
|||
} |
|||
} |
|||
|
|||
export default ProcessService; |
@ -0,0 +1,307 @@ |
|||
// app/services/session.js
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
'use strict'; |
|||
|
|||
import env from "../../config/env.js"; |
|||
import assert from "node:assert"; |
|||
|
|||
import util from "node:util"; |
|||
|
|||
import { Types } from "mongoose"; |
|||
|
|||
import { Request, Response, NextFunction, RequestHandler } from "express"; |
|||
|
|||
import passport from "passport"; |
|||
import { |
|||
Strategy as PassportLocal, |
|||
IVerifyOptions, |
|||
IStrategyOptions, |
|||
} from "passport-local"; |
|||
|
|||
import { |
|||
Strategy as GoogleStrategy, |
|||
StrategyOptions as GoogleStrategyOptions, |
|||
VerifyCallback as GoogleVerifyCallback, |
|||
Profile as GoogleProfile, |
|||
} from "passport-google-oauth20"; |
|||
|
|||
import { |
|||
DtpPlatform, |
|||
DtpService, |
|||
WebError, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
import { IUser } from "../models/user.js"; |
|||
import { UserService } from "./user.js"; |
|||
|
|||
export type SessionAuthCheckFlags = { |
|||
requireAdmin: boolean; |
|||
requireEmailVerified: boolean; |
|||
}; |
|||
|
|||
export type SessionAuthCheckPermissions = { |
|||
requireCanLogin: boolean; |
|||
requireCanComment: boolean; |
|||
requireCanManageFeeds: boolean; |
|||
requireCanManageContent: boolean; |
|||
}; |
|||
|
|||
export type SessionAuthCheckOptions = { |
|||
useRedirect: boolean; |
|||
loginUri: string; |
|||
flags: SessionAuthCheckFlags; |
|||
permissions: SessionAuthCheckPermissions; |
|||
}; |
|||
|
|||
export class SessionService extends DtpService { |
|||
|
|||
static get name ( ) { return "SessionService"; } |
|||
static get slug ( ) { return "session"; } |
|||
|
|||
constructor (platform: DtpPlatform) { |
|||
super(platform, SessionService); |
|||
} |
|||
|
|||
async start ( ) { |
|||
await super.start(); |
|||
|
|||
passport.serializeUser(this.serializeUser.bind(this)); |
|||
passport.deserializeUser(this.deserializeUser.bind(this)); |
|||
|
|||
const strategyOptions: IStrategyOptions = { |
|||
usernameField: "email", |
|||
passwordField: "password", |
|||
}; |
|||
passport.use("mt-local", new PassportLocal(strategyOptions, this.processLocalLogin.bind(this))); |
|||
passport.use("mt-admin", new PassportLocal(strategyOptions, this.processAdminLogin.bind(this))); |
|||
|
|||
if (env.apis.google.enabled) { |
|||
assert(env.apis.google.clientId, "MT_GOOGLE_CLIENT_ID is required"); |
|||
assert(env.apis.google.secret, "MT_GOOGLE_SECRET is required"); |
|||
|
|||
const callbackURL = (env.NODE_ENV === "production") |
|||
? `https://${env.site.host}/auth/google/callback` |
|||
: "https://localhost:3000/auth/google/callback"; |
|||
|
|||
const googleOptions: GoogleStrategyOptions = { |
|||
clientID: env.apis.google.clientId, |
|||
clientSecret: env.apis.google.secret, |
|||
callbackURL, |
|||
scope: ["email", "profile"], |
|||
// state: true,
|
|||
// sessionKey: "goauth2",
|
|||
}; |
|||
passport.use(new GoogleStrategy(googleOptions, this.processGoogleLogin.bind(this))); |
|||
} |
|||
} |
|||
|
|||
async stop ( ) { |
|||
this.log.info(`stopping ${module.exports.name} service`); |
|||
await super.stop(); |
|||
} |
|||
|
|||
/** |
|||
* Generates a middleware function to process session data per request. |
|||
* @returns A middleware function to process per-request session data. |
|||
*/ |
|||
middleware ( ) : RequestHandler { |
|||
return async (req: Request, res: Response, next: NextFunction) : Promise<void> => { |
|||
res.locals.util = util; |
|||
|
|||
res.locals.user = req.user; |
|||
res.locals.query = req.query; |
|||
|
|||
if (req.session) { |
|||
res.locals.session = req.session; |
|||
} |
|||
|
|||
return next(); |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* Generates a middleware function any route can use to require User |
|||
* authentication with a variety of requirements. |
|||
* @param options SessionAuthCheckOptions Authentication options to be |
|||
* required and checked by the middleware function. |
|||
* @returns A middleware function that can protect a route with authentication |
|||
* and permission requirements. |
|||
*/ |
|||
authCheckMiddleware (options: SessionAuthCheckOptions) : RequestHandler { |
|||
options = Object.assign({ |
|||
useRedirect: true, |
|||
loginUri: '/welcome/login', |
|||
}, options); |
|||
return async (req: Request, res: Response, next: NextFunction) : Promise<void> => { |
|||
if (options.permissions.requireCanLogin && !req.user) { |
|||
if (options.useRedirect) { |
|||
req.session.loginReturnTo = req.url; |
|||
await this.saveSession(req); |
|||
this.log.info('redirecting to login', { returnTo: req.url }); |
|||
return res.redirect(options.loginUri); |
|||
} |
|||
return next(new WebError(403, 'Must sign in to continue')); |
|||
} |
|||
|
|||
/* |
|||
* Flags checks |
|||
*/ |
|||
|
|||
if (options.flags.requireAdmin && (!req.user || !req.user.flags.isAdmin)) { |
|||
return next(new WebError(403, 'Administrator privileges are required')); |
|||
} |
|||
if (options.flags.requireEmailVerified && (!req.user || !req.user.flags.isEmailVerified)) { |
|||
return next(new WebError(403, "Email verification is required")); |
|||
} |
|||
|
|||
/* |
|||
* Permission checks |
|||
*/ |
|||
|
|||
if (options.permissions.requireCanComment && (!req.user || !req.user.permissions.canComment)) { |
|||
return next(new WebError(403, 'Commenting privileges are required')); |
|||
} |
|||
if (options.permissions.requireCanManageFeeds && (!req.user || !req.user.permissions.canManageFeeds)) { |
|||
return next(new WebError(403, 'Feed management privileges are required')); |
|||
} |
|||
if (options.permissions.requireCanManageContent && (!req.user || !req.user.permissions.canManageContent)) { |
|||
return next(new WebError(403, 'Content management privileges are required')); |
|||
} |
|||
|
|||
return next(); |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* Serialize a User into the session record. We only write the User._id into |
|||
* the session, and fetch the User record from MongoDB when the session is |
|||
* being restored. |
|||
* @param user IUser The User to be serialized into the session. |
|||
* @param done function PassportJS callback for async completion. |
|||
* @returns A promise that resolves when the User is serialized to the |
|||
* session. |
|||
*/ |
|||
async serializeUser ( |
|||
user: IUser, |
|||
done: (error: Error | null, id?: string | undefined) => void, |
|||
) { |
|||
return done(null, user._id.toHexString()); |
|||
} |
|||
|
|||
/** |
|||
* Load a User from MongoDB and verify that the user is permitted to log in. |
|||
* @param userId string The ObjectId of the User to be fetched. |
|||
* @param done function PassportJS callback for async completion. |
|||
* @returns A promise that resolves when the user is fetched. |
|||
*/ |
|||
async deserializeUser ( |
|||
userId: string, |
|||
done: (err: Error | null, user?: Express.User | false | null) => void, |
|||
) : Promise<void> { |
|||
const userService = this.platform.components.getService<UserService>("user"); |
|||
try { |
|||
const user = await userService.getAccountById(Types.ObjectId.createFromHexString(userId)); |
|||
if (user && user.permissions && !user.permissions.canLogin) { |
|||
return done(null, null); // destroy the session
|
|||
} |
|||
return done(null, user); |
|||
} catch (error) { |
|||
this.log.error('failed to deserialize user from session', { error }); |
|||
return done(error as Error, null); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Force-save the current user session and ensure it's written before |
|||
* proceeding. |
|||
* @param req Express.Request The request being processed. |
|||
* @returns A promise that resolves when the session is saved. |
|||
*/ |
|||
async saveSession (req: Request) : Promise<void> { |
|||
return new Promise((resolve, reject) => { |
|||
req.session.save((err) => { |
|||
if (err) { |
|||
return reject(err); |
|||
} |
|||
resolve(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Processes user authentication for the `mt-local` strategy. |
|||
* @param username string The email address of the authenticating user. |
|||
* @param password string The password for the authenticating user. |
|||
* @param done function PassportJS callback for async completion. |
|||
*/ |
|||
async processLocalLogin ( |
|||
username: string, |
|||
password: string, |
|||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|||
done: (error: any, user?: Express.User | false, options?: IVerifyOptions) => void, |
|||
) : Promise<void> { |
|||
const userService = this.platform.components.getService<UserService>("user"); |
|||
try { |
|||
const user: IUser = await userService.login(username, password); |
|||
this.log.info("user login", { user: { _id: user._id } }); |
|||
done(null, user); |
|||
} catch (error) { |
|||
this.log.info("user login error", { username, error }); |
|||
done(error as Error, false); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Processes user authentication for the `mt-admin` strategy, and requires |
|||
* administrative permission to login. |
|||
* @param username string The email address of the authenticating user. |
|||
* @param password string The password for the authenticating user. |
|||
* @param done function PassportJS callback for async completion. |
|||
*/ |
|||
async processAdminLogin ( |
|||
username: string, |
|||
password: string, |
|||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|||
done: (error: any, user?: Express.User | false, options?: IVerifyOptions) => void, |
|||
) : Promise<void> { |
|||
const userService = this.getService<UserService>("user"); |
|||
try { |
|||
this.log.info("processing admin login", { username }); |
|||
const user: IUser = await userService.login(username, password); |
|||
if (!user) { |
|||
throw new Error("Credentials do not match user account"); |
|||
} |
|||
if (!user.flags.isAdmin) { |
|||
throw new Error("Administrative privileges are required"); |
|||
} |
|||
this.log.info("administrative login", { user: { _id: user._id } }); |
|||
done(null, user); |
|||
} catch (error) { |
|||
this.log.alert("administrative login error", { username, error }); |
|||
done(error as Error, false); |
|||
} |
|||
} |
|||
|
|||
async processGoogleLogin( |
|||
accessToken: string, |
|||
refreshToken: string, |
|||
profile: GoogleProfile, |
|||
done: GoogleVerifyCallback, |
|||
) : Promise<void> { |
|||
const userService = this.getService<UserService>("user"); |
|||
try { |
|||
const user = await userService.grantGoogle(profile, accessToken, refreshToken); |
|||
if (!user) { |
|||
return done(new Error("Failed to process User account"), false); |
|||
} |
|||
return done(null, user); |
|||
} catch (error) { |
|||
this.log.error('failed to process Google login', { profile, error }); |
|||
return done(error, false); |
|||
} |
|||
} |
|||
} |
|||
|
|||
export default SessionService; |
@ -0,0 +1,35 @@ |
|||
// app/services/sidebar.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import { Request, Response, NextFunction, RequestHandler } from "express"; |
|||
|
|||
import { |
|||
DtpPlatform, |
|||
DtpService, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
export class SidebarService extends DtpService { |
|||
static get name ( ) { return "SidebarService"; } |
|||
static get slug ( ) { return "sidebar"; } |
|||
|
|||
constructor(platform: DtpPlatform) { |
|||
super(platform, SidebarService); |
|||
} |
|||
|
|||
middleware ( ) : RequestHandler { |
|||
return async (_req: Request, _res: Response, next: NextFunction) : Promise<void> => { |
|||
try { |
|||
/* |
|||
* Populate sidebar content here |
|||
*/ |
|||
return next(); |
|||
} catch (error) { |
|||
this.log.error("Failed to populate sidebar content", { error }); |
|||
return next(error); |
|||
} |
|||
}; |
|||
} |
|||
} |
|||
|
|||
export default SidebarService; |
@ -0,0 +1,108 @@ |
|||
// app/services/text.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from "node:assert"; |
|||
|
|||
import { createRequire } from "module"; |
|||
const require = createRequire(import.meta.url); // jshint ignore:line
|
|||
|
|||
import striptags from "striptags"; |
|||
import diacritics from "diacritics"; |
|||
const shoetest = require("shoetest"); |
|||
|
|||
import { |
|||
Marked, |
|||
Tokens as MarkedTokens, |
|||
Renderer as MarkedRenderer, |
|||
} from "marked"; |
|||
|
|||
import WebTextFilter from "./lib/edit-with-vi.js"; |
|||
|
|||
import { DtpPlatform, DtpService, DtpUnzalgo } from "../../lib/dtplib.js"; |
|||
|
|||
export type ReplacerFunction = (mention: string) => string; |
|||
|
|||
export class TextService extends DtpService { |
|||
|
|||
static get name ( ) { return "TextService"; } |
|||
static get slug ( ) { return "text"; } |
|||
|
|||
markedRenderer?: MarkedRenderer; |
|||
marked?: Marked; |
|||
|
|||
constructor(platform: DtpPlatform) { |
|||
super(platform, TextService); |
|||
} |
|||
|
|||
async start ( ) : Promise<void> { |
|||
await super.start(); |
|||
|
|||
this.markedRenderer = new MarkedRenderer(); |
|||
this.markedRenderer.link = (link: MarkedTokens.Link) : string => { |
|||
if (link.title) { |
|||
return `<a href="${link.href}" title="${link.title}">${link.text}</a>`; |
|||
} |
|||
return `<a href="${link.href}">${link.text}</a>`; |
|||
}; |
|||
this.markedRenderer.image = (image: MarkedTokens.Image) => { |
|||
if (image.title) { |
|||
return `<p><img src="${image.href}" class="responsive" title="${image.title}"></img><div class="image-caption">${image.text}</div>`; |
|||
} |
|||
return `<p><img src="${image.href}" class="image centered"></img><div class="image-caption">${image.text}</div>`; |
|||
}; |
|||
|
|||
this.marked = new Marked({ |
|||
breaks: true, |
|||
gfm: true, |
|||
renderer: this.markedRenderer, |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Basic text cleaning function to remove Zalgo and tags. |
|||
* @param {String} text The text to be cleaned |
|||
* @returns The cleaned text |
|||
*/ |
|||
clean(text: string): string { |
|||
text = DtpUnzalgo.clean(text); |
|||
text = striptags(text.trim()); |
|||
return text; |
|||
} |
|||
|
|||
/** |
|||
* The heavy hammer of text filtering that removes all malicious and annoying |
|||
* things I know about as of this writing. Zalgo, tags, shoetest, diacritics, |
|||
* and our own custom nonsense UTF-8 and Unicode filters. |
|||
* |
|||
* This filter is very heavy-handed and merciless. |
|||
* |
|||
* @param text string The text to be filtered |
|||
* @returns The filtered text |
|||
*/ |
|||
filter(text: string): string { |
|||
if (!text || typeof text !== "string" || text.length < 1) { |
|||
return text; |
|||
} |
|||
|
|||
text = WebTextFilter.filterNonsense(text); |
|||
text = WebTextFilter.filterGuff(text); |
|||
text = WebTextFilter.filterHtml(text); |
|||
|
|||
text = shoetest.simplify(text); |
|||
text = diacritics.remove(text); |
|||
|
|||
/* |
|||
* Once all the stupidity has been stripped, strip the HTML |
|||
* tags that might remain. |
|||
*/ |
|||
return this.clean(text); |
|||
} |
|||
|
|||
async renderMarkdown (markdown: string) : Promise<string> { |
|||
assert(this.marked, "Marked instance is required"); |
|||
return this.marked.parse(markdown); |
|||
} |
|||
} |
|||
|
|||
export default TextService; |
@ -0,0 +1,410 @@ |
|||
// app/services/user.ts
|
|||
// Copyright (C) 2025 DTP Technologies, LLC
|
|||
// All Rights Reserved
|
|||
|
|||
import assert from "node:assert"; |
|||
import { v4 as uuidv4 } from "uuid"; |
|||
|
|||
import mongoose, { FilterQuery } from "mongoose"; |
|||
|
|||
import { Request, Response, NextFunction, RequestHandler } from "express"; |
|||
|
|||
import { IUser } from "../models/user.js"; |
|||
const User = mongoose.model<IUser>("User"); |
|||
|
|||
import { |
|||
DtpPlatform, |
|||
DtpService, |
|||
DtpServiceUpdate, |
|||
WebError, |
|||
} from "../../lib/dtplib.js"; |
|||
|
|||
import { CryptoService } from "./crypto.js"; |
|||
import { EmailService } from "./email.js"; |
|||
import { TextService } from "./text.js"; |
|||
import ImageService from "./image.js"; |
|||
|
|||
import { Profile as GoogleProfile } from "passport-google-oauth20"; |
|||
import Randomstring from "randomstring"; |
|||
|
|||
export interface UserCreateParams { |
|||
email: string; |
|||
displayName?: string; |
|||
password: string; |
|||
passwordVerify: string; |
|||
} |
|||
|
|||
export interface UserUpdateParams { |
|||
email?: string; |
|||
displayName?: string; |
|||
bio?: string; |
|||
theme?: string; |
|||
} |
|||
|
|||
export interface UserPasswordChangeParams { |
|||
currentPassword: string; |
|||
newPassword: string; |
|||
newPasswordVerify: string; |
|||
} |
|||
|
|||
export class UserService extends DtpService { |
|||
|
|||
static get name ( ) { return "UserService"; } |
|||
static get slug ( ) { return "user"; } |
|||
|
|||
USER_SELECT: string = "_id created email displayName bio image flags permissions"; |
|||
SESSION_SELECT: string = "_id created email displayName bio image theme flags permissions"; |
|||
ADMIN_SELECT: string = "_id created email displayName bio image flags permissions"; |
|||
|
|||
populateUser: Array<mongoose.PopulateOptions> = []; |
|||
|
|||
constructor(platform: DtpPlatform) { |
|||
super(platform, UserService); |
|||
} |
|||
|
|||
requireAccountOwner (field: string = "userProfile") : RequestHandler { |
|||
return async (req: Request, res: Response, next?: NextFunction) : Promise<void> => { |
|||
assert(next, "NextFunction is required"); |
|||
if (!req.user) { |
|||
throw new WebError(403, "Login required"); |
|||
} |
|||
const profile = res.locals[field] as IUser; |
|||
if (!req.user._id.equals(profile._id)) { |
|||
return next(new WebError(401, "This is not your member account")); |
|||
} |
|||
return next(); |
|||
}; |
|||
} |
|||
|
|||
async create(params: UserCreateParams): Promise<IUser> { |
|||
const cryptoService = this.platform.components.getService<CryptoService>("crypto"); |
|||
const emailService = this.platform.components.getService<EmailService>("email"); |
|||
const textService = this.platform.components.getService<TextService>("text"); |
|||
|
|||
const NOW = new Date(); |
|||
|
|||
const user = new User(); |
|||
user.created = NOW; |
|||
|
|||
user.email = await emailService.checkEmailAddress(params.email); |
|||
user.email_lc = user.email.toLowerCase(); |
|||
|
|||
if (params.displayName && params.displayName.length) { |
|||
user.displayName = textService.filter(params.displayName); |
|||
} |
|||
|
|||
if (!params.password || params.password.length < 6) { |
|||
throw new WebError( |
|||
400, |
|||
"Must include a password at least six characters long" |
|||
); |
|||
} |
|||
if (params.password !== params.passwordVerify) { |
|||
throw new WebError(400, "The passwords entered do not match"); |
|||
} |
|||
|
|||
user.passwordSalt = uuidv4(); |
|||
user.password = cryptoService.maskPassword( |
|||
user.passwordSalt, |
|||
params.password |
|||
); |
|||
|
|||
await user.save(); |
|||
|
|||
return user.toObject(); |
|||
} |
|||
|
|||
async grantGoogle ( |
|||
profile: GoogleProfile, |
|||
accessToken: string, |
|||
refreshToken: string, |
|||
) : Promise<IUser> { |
|||
assert(Array.isArray(profile.emails) && profile.emails.length > 0, "An email address is required"); |
|||
|
|||
const email = profile.emails.find((email) => email.verified); |
|||
assert(email, "A verified email address is required"); |
|||
|
|||
let dbUser: IUser | null = await this.getByEmailAddress(email.value.trim().toLowerCase()); |
|||
if (dbUser) { |
|||
await User.updateOne( |
|||
{ _id: dbUser._id }, |
|||
{ |
|||
$set: { |
|||
"apis.google": { accessToken, refreshToken }, |
|||
}, |
|||
}, |
|||
); |
|||
return dbUser; |
|||
} |
|||
|
|||
const randomPassword = Randomstring.generate({ length: 12 }); |
|||
this.log.info('creating new User account for Google authorization', { |
|||
profile: { |
|||
id: profile.id, |
|||
email: email.value, |
|||
name: profile.name, |
|||
displayName: profile.displayName, |
|||
}, |
|||
}); |
|||
dbUser = await this.create({ |
|||
email: email.value, |
|||
password: randomPassword, |
|||
passwordVerify: randomPassword, |
|||
displayName: profile.displayName, |
|||
}); |
|||
dbUser = await this.getById(dbUser._id); |
|||
if (!dbUser) { |
|||
throw new WebError(500, "Failed to create new account"); |
|||
} |
|||
|
|||
//TODO: Import profile.photos[0] as new user's profile photo
|
|||
|
|||
return dbUser; |
|||
} |
|||
|
|||
async update(user: IUser, params: UserUpdateParams): Promise<IUser> { |
|||
const textService = this.platform.components.getService<TextService>("text"); |
|||
|
|||
const NOW = new Date(); |
|||
const update: DtpServiceUpdate = { }; |
|||
update.$set = { updated: NOW }; |
|||
update.$unset = {}; |
|||
|
|||
if (params.displayName && params.displayName.length) { |
|||
update.$set.displayName = textService.filter(params.displayName); |
|||
} else { |
|||
update.$unset.displayName = 1; |
|||
} |
|||
|
|||
if (params.bio && params.bio.length) { |
|||
update.$set.bio = textService.filter(params.bio); |
|||
} else { |
|||
update.$unset.bio = 1; |
|||
} |
|||
|
|||
if (params.theme) { |
|||
update.$set.theme = params.theme; |
|||
} |
|||
|
|||
const newUser = await User.findOneAndUpdate({ _id: user._id }, update, { new: true }); |
|||
assert(newUser, "failed to update User record"); |
|||
|
|||
return newUser.toObject(); |
|||
} |
|||
|
|||
async changePassword( |
|||
user: IUser, |
|||
params: UserPasswordChangeParams |
|||
): Promise<IUser> { |
|||
const cryptoService = this.platform.components.getService<CryptoService>("crypto"); |
|||
|
|||
if (!params.currentPassword) { |
|||
throw new WebError(400, "Must provide current password"); |
|||
} |
|||
if (!params.newPassword) { |
|||
throw new WebError(400, "Must provide new password"); |
|||
} |
|||
if (!params.newPasswordVerify) { |
|||
throw new WebError(400, "Must provide new password verification"); |
|||
} |
|||
|
|||
if (params.newPassword !== params.newPasswordVerify) { |
|||
throw new WebError(400, "The new password and verification do not match"); |
|||
} |
|||
|
|||
const passwordUser = await User.findOne({ _id: user._id }) |
|||
.select("passwordSalt password") |
|||
.lean(); |
|||
if (!passwordUser) { |
|||
throw new WebError(500, "System error"); |
|||
} |
|||
|
|||
const oldPasswordVerify = cryptoService.maskPassword( |
|||
passwordUser.passwordSalt, |
|||
params.currentPassword |
|||
); |
|||
if (oldPasswordVerify !== passwordUser.password) { |
|||
throw new WebError(400, "Your current password does not match"); |
|||
} |
|||
|
|||
const newPasswordSalt = uuidv4(); |
|||
const newPasswordHash = cryptoService.maskPassword( |
|||
newPasswordSalt, |
|||
params.newPassword |
|||
); |
|||
|
|||
const newUser = await User.findOneAndUpdate( |
|||
{ _id: user._id }, |
|||
{ |
|||
$set: { |
|||
passwordSalt: newPasswordSalt, |
|||
password: newPasswordHash, |
|||
}, |
|||
}, |
|||
{ new: true } |
|||
); |
|||
|
|||
//TODO Send an email confirming the password change.
|
|||
|
|||
return User.populate(newUser, this.populateUser); |
|||
} |
|||
|
|||
async setProfilePicture (user: IUser, file: Express.Multer.File) : Promise<IUser> { |
|||
const imageService = this.getService<ImageService>("image"); |
|||
const NOW = new Date(); |
|||
|
|||
const update: DtpServiceUpdate = { }; |
|||
update.$set = { updated: NOW }; |
|||
|
|||
if (user.picture) { |
|||
this.log.debug("removing user picture", { |
|||
userId: user._id, |
|||
}); |
|||
await imageService.remove(user.picture); |
|||
} |
|||
|
|||
this.log.debug("storing new user picture", { file }); |
|||
const picture = await imageService.create(user, file); |
|||
|
|||
this.log.debug("updating user picture", { |
|||
userId: user._id, |
|||
pictureId: picture._id, |
|||
}); |
|||
update.$set["image.picture"] = picture._id; |
|||
|
|||
const newUser = await User.findOneAndUpdate({ _id: user._id }, update, { |
|||
new: true, |
|||
}); |
|||
|
|||
return User.populate(newUser, this.populateUser); |
|||
} |
|||
|
|||
async removeProfilePicture (user: IUser) : Promise<IUser> { |
|||
const imageService = this.getService<ImageService>("image"); |
|||
|
|||
if (!user.picture) { |
|||
return user; |
|||
} |
|||
|
|||
await imageService.remove(user.picture); |
|||
|
|||
const newUser = await User.findOneAndUpdate( |
|||
{ _id: user._id }, |
|||
{ $unset: { "image.picture": 1 } }, |
|||
{ new: true } |
|||
); |
|||
|
|||
return User.populate(newUser, this.populateUser); |
|||
|
|||
} |
|||
|
|||
async login(email: string, password: string) : Promise<IUser> { |
|||
const cryptoService = this.platform.components.getService<CryptoService>("crypto"); |
|||
|
|||
const user = await this.getAccountByEmailAddress(email); |
|||
if (!user) { |
|||
throw new WebError(400, "Credentials don't match user records"); |
|||
} |
|||
|
|||
if (!user.permissions.canLogin) { |
|||
throw new WebError(403, "Account disabled"); |
|||
} |
|||
|
|||
const maskedPassword = cryptoService.maskPassword(user.passwordSalt, password); |
|||
if (maskedPassword !== user.password) { |
|||
throw new WebError(400, "Credentials don't match user records"); |
|||
} |
|||
|
|||
return user; |
|||
} |
|||
|
|||
async getAccountById (userId: mongoose.Types.ObjectId) : Promise<IUser | null> { |
|||
const user = await User.findOne({ _id: userId }) |
|||
.select("+passwordSalt +password +flags +permissions") |
|||
.populate(this.populateUser) |
|||
.lean(); |
|||
return user; |
|||
} |
|||
|
|||
async getAccountByEmailAddress (email: string) : Promise<IUser | null> { |
|||
email = email.trim().toLowerCase(); |
|||
const user = await User.findOne({ email_lc: email }) |
|||
.select("+passwordSalt +password +flags +permissions") |
|||
.populate(this.populateUser) |
|||
.lean(); |
|||
return user; |
|||
} |
|||
|
|||
async getById (userId: mongoose.Types.ObjectId) : Promise<IUser | null> { |
|||
const user = await User.findOne({ _id: userId }) |
|||
.select('+flags +permissions') |
|||
.populate(this.populateUser) |
|||
.lean(); |
|||
return user; |
|||
} |
|||
|
|||
async getByEmailAddress (email: string): Promise<IUser | null> { |
|||
email = email.trim().toLowerCase(); |
|||
const user = await User.findOne({ email_lc: email }) |
|||
.select('+flags +permissions') |
|||
.populate(this.populateUser) |
|||
.lean(); |
|||
return user; |
|||
} |
|||
|
|||
async getRandom( |
|||
exclude: IUser | mongoose.Types.ObjectId | null | undefined, |
|||
count: number |
|||
) : Promise<Array<IUser>> { |
|||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|||
const search: FilterQuery<any> = {}; |
|||
search.$and = []; |
|||
|
|||
if (exclude) { |
|||
search.$and.push({ _id: { $ne: exclude._id } }); |
|||
} |
|||
search.$and.push({ "flags.isEmailVerified": true }); |
|||
search.$and.push({ "permissions.canLogin": true }); |
|||
|
|||
const users = await User.aggregate([ |
|||
{ |
|||
$match: search, |
|||
}, |
|||
{ |
|||
$sample: { size: count }, |
|||
}, |
|||
{ |
|||
$project: { |
|||
updated: false, |
|||
email: false, |
|||
passwordSalt: false, |
|||
password: false, |
|||
optIn: false, |
|||
following: false, |
|||
blockedUsers: false, |
|||
notes: false, |
|||
theme: false, |
|||
__v: false, |
|||
}, |
|||
}, |
|||
]); |
|||
|
|||
return User.populate(users, this.populateUser); |
|||
} |
|||
|
|||
async setEmailVerification( |
|||
user: IUser | mongoose.Types.ObjectId, |
|||
isVerified: boolean |
|||
): Promise<void> { |
|||
await User.updateOne( |
|||
{ _id: user._id }, |
|||
{ |
|||
$set: { |
|||
"flags.isEmailVerified": isVerified, |
|||
}, |
|||
} |
|||
); |
|||
} |
|||
} |
|||
|
|||
export default UserService; |
@ -0,0 +1,15 @@ |
|||
.common-footer |
|||
p |
|||
| This email was sent to #{recipient.email} because you selected to receive emails from #{site.name}. |
|||
if messageType !== 'system' |
|||
| You can #[a(href=`https://${site.domain}/email/opt-out?u=${recipient._id}&c=${messageType || 'marketing'}`) opt out] at any time to stop receiving these emails. |
|||
|
|||
if site.address1 && site.city && site.state && site.postalCode && site.country |
|||
p You can request to stop receiving these emails in writing at: |
|||
address |
|||
div= site.company |
|||
div= site.address1 |
|||
if site.address2 && (site.address2.length > 0) |
|||
div= site.address2 |
|||
div #{site.city}, #{site.state} #{site.postalCode} |
|||
div= site.country |
@ -0,0 +1,2 @@ |
|||
.common-title= emailTitle || `Greetings from ${site.name}!` |
|||
.common-slogan= site.description |
@ -0,0 +1,19 @@ |
|||
| |
|||
| --- |
|||
| This email was sent to #{recipient.email} because you selected to receive emails from #{site.name}. |
|||
if messageType !== 'system' |
|||
| |
|||
| Visit #{`https://${site.domain}/email/opt-out?u=${recipient._id}&c=${messageType || 'marketing'}`} to opt out and stop receiving these emails. |
|||
|
|||
if site.address1 && site.city && site.state && site.postalCode && site.country |
|||
| |
|||
| |
|||
| You can request to stop receiving these emails in writing at: |
|||
| |
|||
| #{site.company} |
|||
| #{site.address1}#{'\n'} |
|||
if site.address2 && (site.address2.length > 0) |
|||
| #{site.address2}#{'\n'} |
|||
| #{site.city}, #{site.state} #{site.postalCode} |
|||
| #{site.country} |
|||
| |
@ -0,0 +1,2 @@ |
|||
| Dear #{recipient.displayName || recipient.email}, |
|||
| |
@ -0,0 +1,3 @@ |
|||
extends ../layouts/html/system-message |
|||
block message-body |
|||
.content-message!= htmlMessage |
@ -0,0 +1,13 @@ |
|||
extends ../layouts/html/system-message |
|||
block content |
|||
|
|||
address |
|||
div Action: Password reset request |
|||
div Account: #{recipient.email} |
|||
|
|||
p Someone has requested a password reset for your account on #{site.name}. If you did not make this request, please ignore this email and no further action will be taken. Your account information was not accessed by the person who made the request, and your password has not been changed. |
|||
|
|||
p If you did request a password reset due to a lost or stolen password, you can enter a new password here: |
|||
|
|||
.action-panel |
|||
a(href=`https://${site.domain}/auth/password-reset?t=${passwordResetToken.token}`).action-button Reset Password |
@ -0,0 +1,3 @@ |
|||
extends ../layouts/html/system-message |
|||
block message-body |
|||
.content-message!= htmlMessage |
@ -0,0 +1,4 @@ |
|||
extends ../layouts/html/system-message |
|||
block content |
|||
p Welcome to #{site.name}! Please visit #[a(href=`https://${site.domain}/email/verify?t=${emailVerifyToken}`)= `https://${site.domain}/email/verify?t=${emailVerifyToken}`] to verify your email address and enable all features on your new account. |
|||
p If you did not sign up for a new account at #{site.name}, please disregard this message. |
@ -0,0 +1,121 @@ |
|||
doctype html |
|||
html(lang='en') |
|||
head |
|||
meta(charset='UTF-8') |
|||
meta(name='viewport', content='width=device-width, initial-scale=1.0') |
|||
meta(name='description', content= pageDescription || siteDescription) |
|||
|
|||
title= pageTitle ? `${pageTitle} | ${site.name}` : site.name |
|||
|
|||
style(type="text/css"). |
|||
html, body { |
|||
padding: 0; |
|||
margin: 0; |
|||
background-color: #ffffff; |
|||
color: #1a1a1a; |
|||
} |
|||
|
|||
section { |
|||
padding: 20px 0; |
|||
background-color: #ffffff; |
|||
color: #1a1a1a; |
|||
} |
|||
|
|||
section.section-muted { |
|||
background-color: #f8f8f8; |
|||
color: #2a2a2a; |
|||
} |
|||
|
|||
.common-title { |
|||
max-width: 640px; |
|||
margin: 0 auto 8px auto; |
|||
font-size: 1.5em; |
|||
} |
|||
|
|||
.common-greeting { |
|||
max-width: 640px; |
|||
margin: 0 auto 20px auto; |
|||
font-size: 1.1em; |
|||
} |
|||
|
|||
.common-slogan { |
|||
max-width: 640px; |
|||
margin: 0 auto; |
|||
font-size: 1.1em; |
|||
font-style: italic; |
|||
} |
|||
|
|||
.content-message { |
|||
max-width: 640px; |
|||
margin: 0 auto; |
|||
background: white; |
|||
color: black; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.content-signature { |
|||
max-width: 640px; |
|||
margin: 0 auto; |
|||
background: white; |
|||
color: black; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.common-footer { |
|||
max-width: 640px; |
|||
margin: 0 auto; |
|||
font-size: 10px; |
|||
} |
|||
|
|||
.action-panel { |
|||
display: block; |
|||
box-sizing: border-box; |
|||
margin: 24px 0; |
|||
} |
|||
|
|||
.action-panel .action-button { |
|||
padding: 6px 20px; |
|||
margin: 0 24px; |
|||
|
|||
border: none; |
|||
border-radius: 20px; |
|||
outline: none; |
|||
|
|||
background-color: #1093de; |
|||
color: #ffffff; |
|||
|
|||
font-size: 16px; |
|||
font-weight: bold; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
.action-panel .action-button:hover { |
|||
text-decoration: underline; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.action-panel .action-button:first-child { |
|||
margin-left: 0; |
|||
} |
|||
|
|||
body |
|||
|
|||
include ../library |
|||
|
|||
section.section-muted |
|||
include ../../common/html/header |
|||
|
|||
section |
|||
.common-greeting |
|||
div Dear #{recipient.displayName || recipient.email}, |
|||
|
|||
block message-body |
|||
.content-message |
|||
block content |
|||
|
|||
.content-signature |
|||
p Thank you for your continued support! |
|||
p The #{site.name} team. |
|||
|
|||
section.section-muted |
|||
include ../../common/html/footer |
@ -0,0 +1,4 @@ |
|||
- |
|||
function formatCount (count) { |
|||
return numeral(count).format((count > 1000) ? '0,0.0a' : '0,0'); |
|||
} |
@ -0,0 +1,10 @@ |
|||
include ../library |
|||
include ../../common/text/header |
|||
| |
|||
block content |
|||
| |
|||
| Thank you for your continued support! |
|||
| |
|||
| The #{site.name} team. |
|||
| |
|||
include ../../common/text/footer |
@ -0,0 +1,5 @@ |
|||
extends ../layouts/text/system-message |
|||
block content |
|||
| |
|||
| #{textMessage} |
|||
| |
@ -0,0 +1,10 @@ |
|||
extends ../layouts/text/system-message |
|||
block content |
|||
| |
|||
| Action: Password reset request |
|||
| Account: #{recipient.email} |
|||
| |
|||
| Someone has requested a password reset for your account on #{site.name}. If you did not make this request, please ignore this email and no further action will be taken. Your account information was not accessed by the person who made the request, and your password has not been changed. |
|||
| |
|||
| If you did request a password reset due to a lost or stolen password, you can enter a new password here: #{`https://${site.domain}/auth/password-reset?t=${passwordResetToken.token}`}. |
|||
| |
@ -0,0 +1,5 @@ |
|||
extends ../layouts/text/system-message |
|||
block content |
|||
| |
|||
| #{textMessage} |
|||
| |
@ -0,0 +1,7 @@ |
|||
extends ../layouts/text/system-message |
|||
block content |
|||
| |
|||
| Welcome to #{site.name}! Please visit #{`https://${site.domain}/email/verify?t=${emailVerifyToken}`} to verify your email address and enable all features on your new account. |
|||
| |
|||
| If you did not sign up for a new account at #{site.name}, please disregard this message. |
|||
| |
@ -0,0 +1,18 @@ |
|||
mixin renderAnnouncement (announcement) |
|||
.uk-card.uk-card-default.uk-card-small |
|||
.uk-card-header |
|||
h1.uk-card-title |
|||
span |
|||
i(class=`fas ${announcement.title.icon.class}`, style=`color: ${announcement.title.icon.color}`) |
|||
span.uk-margin-small-left= announcement.title.content |
|||
.uk-card-body!= marked.parse(announcement.content, { renderer: marked.Renderer() }) |
|||
.uk-card-footer.uk-text-small.uk-text-muted |
|||
div(uk-grid).uk-grid-small.uk-grid-divider |
|||
.uk-width-auto |
|||
a(href=`/announcement/${announcement._id}`)= moment(announcement.created).format('MMM DD, YYYY [at] hh:mm a') |
|||
if currentView !== 'announcement' |
|||
.uk-width-auto |
|||
a(href=`/announcement/${announcement._id}`) |
|||
span |
|||
i.fas.fa-link |
|||
span.uk-margin-small-left Open Announcement |
@ -0,0 +1,16 @@ |
|||
extends ../layouts/main |
|||
block content |
|||
|
|||
include components/announcement |
|||
|
|||
section.uk-section.uk-section-default.uk-section-small |
|||
.uk-container |
|||
h1 #{site.name} Announcements |
|||
|
|||
if Array.isArray(announcements) && (announcements.length > 0) |
|||
ul.uk-list.uk-list-divider |
|||
each announcement in announcements |
|||
li |
|||
+renderAnnouncement(announcement) |
|||
else |
|||
div There are no announcements. |
@ -0,0 +1,11 @@ |
|||
extends ../layouts/main |
|||
block content |
|||
|
|||
include ../comment/components/section |
|||
include components/announcement |
|||
|
|||
section.uk-section.uk-section-default.uk-section-small |
|||
.uk-container |
|||
+renderAnnouncement(announcement) |
|||
|
|||
+renderCommentSection({ name: `announcement-${announcement._id}`, rootUrl: `/announcement/${announcement._id}/comment` }) |
@ -0,0 +1,4 @@ |
|||
button(type="button", onclick= "return mt.app.goBack();").uk-button.mt-button-primary |
|||
span |
|||
i.fas.fa-chevron-left |
|||
span.uk-margin-small-left Back |
@ -0,0 +1,10 @@ |
|||
mixin renderButtonIcon (buttonClass, buttonLabel) |
|||
span |
|||
i(class=`fas ${buttonClass}`) |
|||
if buttonLabel |
|||
span(class="uk-visible@m").uk-margin-small-left= buttonLabel |
|||
|
|||
mixin renderButtonImage (imageUrl, buttonLabel) |
|||
img(src= imageUrl, alt= `Image icon for button ${buttonLabel || 'unnamed'}`) |
|||
if buttonLabel |
|||
span(class="uk-visible@m").uk-margin-small-left= buttonLabel |
@ -0,0 +1,2 @@ |
|||
mixin renderCsrfTokenInput (csrfToken) |
|||
input(type="hidden", name= csrfToken.name, value= csrfToken.token) |
@ -0,0 +1,57 @@ |
|||
mixin renderFileUploadImage (actionUrl, containerId, imageId, imageClass, defaultImage, currentImage, cropperOptions) |
|||
div(id= containerId).mt-file-upload |
|||
form(method="POST", action= actionUrl, enctype="multipart/form-data", onsubmit= "return mt.app.submitImageForm(event);").uk-form |
|||
.uk-margin |
|||
.uk-tile.uk-tile-default.uk-padding-small |
|||
div(uk-grid).uk-flex-middle.uk-flex-center |
|||
div(class="uk-width-1-1 uk-width-auto@m") |
|||
.upload-image-container.size-512 |
|||
if !!currentImage |
|||
img(id= imageId, src= `/image/${currentImage._id}`, class= imageClass).sb-large |
|||
else |
|||
img(id= imageId, src= defaultImage, class= imageClass) |
|||
|
|||
div(class="uk-width-1-1 uk-width-auto@m") |
|||
.uk-text-small.uk-margin(hidden= !!currentImage) |
|||
if !currentImage |
|||
#file-select |
|||
.uk-margin(class="uk-text-center uk-text-left@m") |
|||
span.uk-text-middle Select an image |
|||
div(uk-form-custom).uk-margin-small-left |
|||
input( |
|||
type="file", |
|||
formenctype="multipart/form-data", |
|||
accept=".jpg,.png,image/jpeg,image/png", |
|||
data-file-select-container= containerId, |
|||
data-file-select="test-image-upload", |
|||
data-file-size-element= "file-size", |
|||
data-file-max-size= 15 * 1024000, |
|||
data-image-id= imageId, |
|||
data-cropper-options= cropperOptions, |
|||
onchange="return mt.app.selectImageFile(event);", |
|||
) |
|||
button(type="button", tabindex="-1").uk-button.uk-button-default Select |
|||
|
|||
#file-info(class="uk-text-center uk-text-left@m", hidden) |
|||
#file-name.uk-text-bold |
|||
if currentImage |
|||
div resolution: #[span#image-resolution-w= numeral(currentImage.metadata.width).format('0,0')]x#[span#image-resolution-h= numeral(currentImage.metadata.height).format('0,0')] |
|||
div size: #[span#file-size= numeral(currentImage.metadata.size).format('0,0.00b')] |
|||
div last modified: #[span#file-modified= moment(currentImage.created).format('MMM DD, YYYY')] |
|||
else |
|||
div resolution: #[span#image-resolution-w 512]x#[span#image-resolution-h 512] |
|||
div size: #[span#file-size N/A] |
|||
div last modified: #[span#file-modified N/A] |
|||
|
|||
div(class="uk-flex-center", uk-grid) |
|||
#remove-btn(hidden= !currentImage).uk-width-auto |
|||
button( |
|||
type= "button", |
|||
data-image-type= imageId, |
|||
onclick= "return mt.app.removeImageFile(event);", |
|||
).uk-button.uk-button-danger Remove |
|||
|
|||
#file-save-btn(hidden).uk-width-auto |
|||
button( |
|||
type="submit", |
|||
).uk-button.uk-button-primary Save |
@ -0,0 +1,6 @@ |
|||
mixin renderHomeMenuButton (buttonClass, className, label, url) |
|||
a(href= url).uk-button.uk-button-text.uk-display-block |
|||
.home-menu-button(class= buttonClass) |
|||
.button-icon |
|||
i(class= className) |
|||
.button-label!= label |
@ -0,0 +1,4 @@ |
|||
mixin renderLabeledIcon (iconClass, iconLabel) |
|||
span |
|||
i(class=`fa-solid ${iconClass}`) |
|||
span.uk-margin-small-left.mt-item-value= iconLabel |
@ -0,0 +1,59 @@ |
|||
//- common routines for all views everywhere |
|||
|
|||
include button-icon |
|||
include labeled-icon |
|||
include section-title |
|||
|
|||
- |
|||
function formatCount(value) { |
|||
value = value || 0; |
|||
return (value < 1000) ? numeral(value).format('0,0') : numeral(value).format('0,0.0a'); |
|||
} |
|||
|
|||
function formatBitRate (value) { |
|||
if ((value !== 0) && !value) { return '---'; } |
|||
return numeral(value).format('0,0.0ib').slice(0, -2) + 'bps'; |
|||
} |
|||
|
|||
function formatDataSize (value) { |
|||
if ((value !== 0) && !value) { return '---'; } |
|||
return numeral(value).format('0,0.0b'); |
|||
} |
|||
|
|||
function formatTimestamp (value, withFractional = false) { |
|||
if (value !== 0 && !value) { |
|||
return withFractional ? '-:--:--.---' : '-:--:--'; |
|||
} |
|||
return numeral(value).format(withFractional ? 'h:mm:ss.sss' : 'h:mm:ss'); |
|||
} |
|||
|
|||
function formatDuration (value) { |
|||
let duration = formatTimestamp(value); |
|||
if (duration.startsWith('0:')) { duration = duration.slice(2); } |
|||
if (duration.startsWith('0')) { duration = duration.slice(1); } |
|||
return duration; |
|||
} |
|||
|
|||
function displayIntegerValue (value) { |
|||
return numeral(value).format(value > 1000 ? '0,0.0a' : '0,0'); |
|||
} |
|||
|
|||
function getUserProfileUrl (user) { |
|||
return `/user/${user._id}`; |
|||
} |
|||
|
|||
mixin renderCell (label, value, className) |
|||
div(title=`${label}: ${numeral(value).format('0,0')}`).no-select |
|||
div(class=className)!= value |
|||
.uk-text-muted.uk-text-small= label |
|||
|
|||
mixin renderBackButton (options) |
|||
- options = Object.assign({ includeLabel: true, label: 'Back', small: false }, options) |
|||
button(type="button", class={ 'uk-button-small': options.small }, onclick="window.history.back();").uk-button.uk-button-default.uk-border-rounded |
|||
span |
|||
i.fas.fa-chevron-left |
|||
if options.includeLabel |
|||
span(class="uk-visible@s").uk-margin-small-left= options.label |
|||
|
|||
mixin renderUserLink (user) |
|||
a(href=`/user/${user._id}`)= user.displayName || user.email |
@ -0,0 +1,13 @@ |
|||
svg( |
|||
version="1.1", xmlns="http://www.w3.org/2000/svg", xmlns:xlink="http://www.w3.org/1999/xlink", |
|||
width="32", height="32", |
|||
viewBox="0 0 600 600", |
|||
).profile-navbar |
|||
defs |
|||
clipPath(id="circular-border") |
|||
circle(cx="300", cy="300", r="280") |
|||
clipPath(id="avoid-antialiasing-bugs") |
|||
rect(width="100%", height="498") |
|||
circle(cx="300", cy="300", r="280", fill="black", clip-path="url(#avoid-antialiasing-bugs)") |
|||
circle(cx="300", cy="230", r="115") |
|||
circle(cx="300", cy="550", r="205", clip-path="url(#circular-border)") |
@ -0,0 +1,96 @@ |
|||
include ../user/components/profile-icon |
|||
|
|||
nav(uk-navbar).uk-navbar-container.uk-container.uk-position-fixed.uk-position-top |
|||
.uk-navbar-left |
|||
a(href="", uk-toggle="target: #mt-offcanvas").uk-link-reset.uk-navbar-item |
|||
i.fas.fa-bars |
|||
|
|||
ul.uk-navbar-nav |
|||
li(class={ 'uk-active': currentView === 'home' }) |
|||
a(href="/", title=`${site.name} Home`).uk-navbar-item |
|||
img(src=`/img/icon/${env.site.domainKey}/icon-32x32.png`) |
|||
|
|||
li(class={ 'uk-active': currentView === 'home' }) |
|||
a(href="/", title=`${site.name} Home`).uk-navbar-item HOME |
|||
|
|||
li(class={ 'uk-active': currentView === 'feed' }) |
|||
a(href="/feed", title="Browse newsfeed").uk-navbar-item FEED |
|||
|
|||
div(class="uk-visible@m").uk-navbar-left |
|||
//- Site name |
|||
ul.uk-navbar-nav |
|||
if Array.isArray(mainMenu) |
|||
each menuItem in mainMenu |
|||
li(class={ 'uk-active': (pageSlug === menuItem.slug) }) |
|||
a(href= menuItem.url, title= menuItem.label) |
|||
+renderButtonIcon(menuItem.icon || 'fa-file', menuItem.label) |
|||
if Array.isArray(menuItem.children) && (menuItem.children.length > 0) |
|||
.uk-navbar-dropdown |
|||
ul.uk-nav.uk-navbar-dropdown-nav |
|||
each child in menuItem.children |
|||
li(class={ 'uk-active': (pageSlug === child.slug) }) |
|||
a(href= child.url, title= child.label) |
|||
+renderButtonIcon(child.icon || 'fa-file', child.label) |
|||
|
|||
if Array.isArray(links) && (links.length > 0) |
|||
li |
|||
a(href="") |
|||
+renderButtonIcon('fa-link', 'Links') |
|||
.uk-navbar-dropdown |
|||
ul.uk-nav.uk-navbar-dropdown-nav |
|||
each link in links |
|||
li |
|||
+renderSiteLink(link) |
|||
|
|||
.uk-navbar-right |
|||
if user |
|||
ul.uk-navbar-nav |
|||
li(class={ 'uk-active': currentView === 'notification' }) |
|||
a(href="/notification", title="Notifications") |
|||
.uk-position-relative |
|||
i.fas.fa-bell.uk-text-large |
|||
if middleware && middleware.notifications && (middleware.newCount > 0) |
|||
span(style="top: -11px; right: -15px; padding: 0 3px; border-radius: 4px; background-color: #ff0013; color: #e8e8e8;").uk-position-absolute= formatCount(middleware.notifications.newCount) |
|||
|
|||
.uk-navbar-item |
|||
if user |
|||
div.no-select |
|||
+renderProfileIcon(user, `${user.displayName || user.email}'s Menu`, 'navbar') |
|||
|
|||
div(uk-dropdown={ mode: 'click' }).uk-navbar-dropdown |
|||
ul.uk-nav.uk-navbar-dropdown-nav |
|||
li.uk-nav-heading.uk-text-center= user.displayName || user.email |
|||
li.uk-nav-divider |
|||
li |
|||
a(href= `/user/${user._id}`) |
|||
span.nav-item-icon |
|||
i.fas.fa-user |
|||
span Profile |
|||
li |
|||
a(href= `/user/${user._id}/settings`) |
|||
span.nav-item-icon |
|||
i.fas.fa-cog |
|||
span Settings |
|||
|
|||
if user.flags && user.flags.isAdmin |
|||
li.uk-nav-divider |
|||
li |
|||
a(href='/admin') |
|||
span.nav-item-icon |
|||
i.fas.fa-user-lock |
|||
span Admin |
|||
|
|||
li.uk-nav-divider |
|||
|
|||
li |
|||
a(href='/auth/logout') |
|||
span.nav-item-icon |
|||
i.fas.fa-sign-out-alt |
|||
span Logout |
|||
else |
|||
ul.uk-navbar-nav |
|||
li |
|||
a(href='/welcome').uk-button.uk-button-link |
|||
span.nav-item-icon |
|||
i.fas.fa-sign-in-alt |
|||
span(class="uk-visible@m").uk-margin-small-left GET STARTED! |
@ -0,0 +1,93 @@ |
|||
mixin renderMenuItem (iconClass, label) |
|||
div(uk-grid).uk-grid-collapse |
|||
.uk-width-auto |
|||
.app-menu-icon |
|||
i(class=`fas ${iconClass}`) |
|||
.uk-width-expand= label |
|||
|
|||
#mt-offcanvas(uk-offcanvas="mode: slide; overlay: true; bg-close: true;") |
|||
.uk-offcanvas-bar |
|||
.uk-margin |
|||
div(uk-grid).uk-grid-small.uk-flex-middle |
|||
.uk-width-expand |
|||
a(href="/").uk-display-block |
|||
.uk-text-large= site.name |
|||
.uk-width-auto |
|||
.uk-text-small.uk-text-muted= `v${pkg.version}` |
|||
.uk-text-small.uk-text-muted= site.description |
|||
|
|||
ul.uk-nav.uk-nav-default.mt-app-menu |
|||
|
|||
li.uk-nav-header Site Menu |
|||
|
|||
li(class={ "uk-active": (currentView === 'home') }) |
|||
a(href='/').uk-display-block |
|||
+renderMenuItem('fa-home', 'Home') |
|||
|
|||
li(class={ "uk-active": (currentView === 'announcement') }) |
|||
a(href='/announcement').uk-display-block |
|||
+renderMenuItem('fa-bullhorn', 'Announcements') |
|||
|
|||
if Array.isArray(mainMenu) |
|||
li.uk-nav-header Pages |
|||
each menuItem in mainMenu |
|||
li(class={ 'uk-active': (pageSlug === menuItem.slug) }) |
|||
a(href= menuItem.url, title= menuItem.label) |
|||
+renderMenuItem(menuItem.icon || 'fa-file', menuItem.label) |
|||
if Array.isArray(menuItem.children) && (menuItem.children.length > 0) |
|||
each child in menuItem.children |
|||
li(class={ 'uk-active': (pageSlug === child.slug) }) |
|||
a(href= child.url, title= child.label) |
|||
+renderButtonIcon(child.icon || 'fa-file', child.label) |
|||
|
|||
if user |
|||
li.uk-nav-header Member Menu |
|||
|
|||
if user.hasAuthorDashboard |
|||
li(class={ "uk-active": (currentView === 'author') }) |
|||
a(href='/author').uk-display-block |
|||
div(uk-grid).uk-grid-collapse |
|||
.uk-width-auto |
|||
.app-menu-icon |
|||
i.fa-solid.fa-user |
|||
.uk-width-expand Author Dashboard |
|||
|
|||
li(class={ "uk-active": (currentView === 'user-settings') }) |
|||
a(href=`/user/${user._id}`).uk-display-block |
|||
div(uk-grid).uk-grid-collapse |
|||
.uk-width-auto |
|||
.app-menu-icon |
|||
i.fa-solid.fa-user |
|||
.uk-width-expand Profile |
|||
|
|||
li(class={ "uk-active": (currentView === 'user-settings') }) |
|||
a(href=`/user/${user._id}/settings`).uk-display-block |
|||
div(uk-grid).uk-grid-collapse |
|||
.uk-width-auto |
|||
.app-menu-icon |
|||
i.fa-solid.fa-cog |
|||
.uk-width-expand Settings |
|||
|
|||
if user.permissions.isAdmin |
|||
a(href="/admin").uk-display-block |
|||
li(class={ "uk-active": currentView === 'admin' }) |
|||
div(uk-grid).uk-grid-collapse |
|||
.uk-width-auto |
|||
.app-menu-icon |
|||
i.fa-solid.fa-user-shield |
|||
.uk-width-expand Admin |
|||
|
|||
li |
|||
a(href="/auth/logout").uk-display-block |
|||
div(uk-grid).uk-grid-collapse |
|||
.uk-width-auto |
|||
.app-menu-icon |
|||
i.fa-solid.fa-sign-out-alt |
|||
.uk-width-expand Logout |
|||
|
|||
if Array.isArray(links) && (links.length > 0) |
|||
li.uk-nav-header Site Links |
|||
each link in links |
|||
li |
|||
+renderSiteLink(link) |
|||
//- a(href= link.url)= link.label |
@ -0,0 +1,4 @@ |
|||
section.uk-section.uk-section-muted.uk-section-xsmall.mt-site-footer |
|||
.uk-container.uk-text-small.uk-text-center |
|||
div Copyright © #{dayjs().format('YYYY')} #{site.company} |
|||
div All Rights Reserved |
@ -0,0 +1,5 @@ |
|||
section.uk-section.uk-section-header.uk-section-xsmall.header-section |
|||
.uk-container |
|||
.uk-text-center |
|||
h1= site.name |
|||
p= site.description |
@ -0,0 +1,48 @@ |
|||
include ../announcement/components/announcement |
|||
|
|||
- var isLive = !!streamrayChannelStatus && streamrayChannelStatus.isLive && !!streamrayChannelStatus.liveEpisode; |
|||
|
|||
mixin renderPageSidebar ( ) |
|||
.uk-margin |
|||
img(src="/img/newsroom-header.jpg", alt=`${site.name}: ${site.description}`).responsive.uk-border-rounded |
|||
|
|||
//- |
|||
//- Announcements |
|||
//- |
|||
if Array.isArray(announcements) && (announcements.length > 0) |
|||
ul.uk-list.uk-margin-medium |
|||
each announcement in announcements |
|||
li |
|||
+renderAnnouncement(announcement) |
|||
|
|||
//- |
|||
//- Search |
|||
//- |
|||
.uk-margin-medium |
|||
+renderSectionTitle('Search') |
|||
form(method="GET", action="/search").uk-search.uk-search-default.uk-width-1-1 |
|||
a(href="", uk-search-icon).uk-search-icon-flip |
|||
input( |
|||
id="search", |
|||
name="q", |
|||
type="search", |
|||
placeholder="What are you looking for?", |
|||
value= query.q ? query.q : undefined, |
|||
aria-label="Search", |
|||
).uk-search-input.uk-border-rounded |
|||
|
|||
.uk-margin-medium |
|||
+renderSectionTitle('Running Tests', { label: "See All", title: "View all tests", url: "/load-test" }) |
|||
.sidebar-widget |
|||
if Array.isArray(tests.running) && (tests.running.length > 0) |
|||
pre= JSON.stringify(tests.running, null, 2) |
|||
else |
|||
div There are no live tests |
|||
|
|||
.uk-margin-medium |
|||
+renderSectionTitle('Finished Tests', { label: "See All", title: "View all finished tests", url: "/load-test/finished" }) |
|||
.sidebar-widget |
|||
if Array.isArray(tests.finished) && (tests.finished.length > 0) |
|||
pre= JSON.stringify(tests.finished, null, 2) |
|||
else |
|||
div There are no live tests |
@ -0,0 +1,29 @@ |
|||
mixin renderPaginationBar (baseUrl, totalItemCount, urlParameters = '') |
|||
- |
|||
var startPage = pagination.p - 2; |
|||
if (startPage < 1) { |
|||
startPage = 1; |
|||
} |
|||
var endPage = startPage + 4; |
|||
var lastPage = Math.floor(totalItemCount / pagination.cpp); |
|||
if ((totalItemCount % pagination.cpp) !== 0) { |
|||
++lastPage; |
|||
} |
|||
if (endPage > lastPage) { |
|||
endPage = lastPage; |
|||
} |
|||
|
|||
ul(aria-label="Page navigation").uk-pagination.uk-flex-center |
|||
li(class= (pagination.p === 1) ? 'uk-disabled' : undefined) |
|||
a(href=`${baseUrl}?p=${pagination.p - 1}${urlParameters}`) |
|||
span(uk-pagination-previous).uk-margin-small-right |
|||
span prev |
|||
|
|||
while startPage <= endPage |
|||
li(class= (startPage === pagination.p) ? 'active' : undefined) |
|||
a(href=`${baseUrl}?p=${startPage}${urlParameters}`)= startPage++ |
|||
|
|||
li(data-last-page= lastPage, class= (pagination.p === lastPage) ? 'uk-disabled' : undefined) |
|||
a(href=`${baseUrl}?p=${pagination.p + 1}${urlParameters}`) |
|||
span next |
|||
span(uk-pagination-next).uk-margin-small-left |
@ -0,0 +1,20 @@ |
|||
link(rel="apple-touch-icon" sizes="57x57" href=`/img/icon/${site.domainKey}/icon-57x57.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="60x60" href=`/img/icon/${site.domainKey}/icon-60x60.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="72x72" href=`/img/icon/${site.domainKey}/icon-72x72.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="76x76" href=`/img/icon/${site.domainKey}/icon-76x76.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="114x114" href=`/img/icon/${site.domainKey}/icon-114x114.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="120x120" href=`/img/icon/${site.domainKey}/icon-120x120.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="144x144" href=`/img/icon/${site.domainKey}/icon-144x144.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="152x152" href=`/img/icon/${site.domainKey}/icon-152x152.png?v=${pkg.version}`) |
|||
link(rel="apple-touch-icon" sizes="180x180" href=`/img/icon/${site.domainKey}/icon-180x180.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="32x32" href=`/img/icon/${site.domainKey}/icon-32x32.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="96x96" href=`/img/icon/${site.domainKey}/icon-96x96.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="16x16" href=`/img/icon/${site.domainKey}/icon-16x16.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="512x512" href=`/img/icon/${site.domainKey}/icon-512x512.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="384x384" href=`/img/icon/${site.domainKey}/icon-384x384.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="256x256" href=`/img/icon/${site.domainKey}/icon-512x512.png?v=${pkg.version}`) |
|||
link(rel="icon" type="image/png" sizes="192x192" href=`/img/icon/${site.domainKey}/icon-192x192.png?v=${pkg.version}`) |
|||
link(rel="manifest" href=`/manifest.json?v=${pkg.version}`) |
|||
meta(name="msapplication-TileColor" content="#f1c52f") |
|||
meta(name="msapplication-TileImage" content=`/img/icon/${site.domainKey}/ms-icon-144x144.png?v=${pkg.version}`) |
|||
meta(name="theme-color" content="#f1c52f") |
@ -0,0 +1,9 @@ |
|||
mixin renderSectionTitle (title, barButton, options) |
|||
- options = Object.assign({ withBorder: true }, options); |
|||
div(class= options.withBorder ? 'mt-border-bottom' : 'uk-margin-small') |
|||
div(uk-grid).uk-grid-small.uk-flex-middle |
|||
.uk-width-expand |
|||
h4.uk-margin-small= title |
|||
if barButton |
|||
.uk-width-auto |
|||
a(href= barButton.url, title= barButton.title).uk-button.uk-button-link.uk-button-small= barButton.label |
@ -0,0 +1,14 @@ |
|||
mixin renderSiteLink (link) |
|||
if link |
|||
a(href= link.url, target= link.target) |
|||
div(uk-grid).uk-grid-collapse.uk-flex-middle |
|||
.app-menu-icon |
|||
img( |
|||
src= link.iconUrl, |
|||
style="width: 16px; height: auto;", |
|||
onerror=`this.src="/img/icon/${site.domainKey}/icon-16x16.png";`, |
|||
) |
|||
.uk-width-expand= link.label |
|||
else |
|||
a(href="/").uk-link-reset |
|||
span.brand-emphasis #{site.name} |
@ -0,0 +1,3 @@ |
|||
#upload-progress-dialog(hidden).uk-width-large.uk-margin-auto.uk-margin.uk-text-center |
|||
progress#upload-progress(min=0, max=100, value=0).uk-progress.uk-margin-remove |
|||
label#upload-progress-prompt.uk-form-label Upload progress |
@ -0,0 +1,17 @@ |
|||
extends layouts/main |
|||
block content |
|||
|
|||
section.uk-section.uk-section-default.uk-section-xsmall |
|||
.uk-container |
|||
h1 Well, That's Not Right! |
|||
.uk-text-large= message |
|||
|
|||
if error && error.status |
|||
div.uk-text-small.uk-text-muted status:#{error.status} |
|||
|
|||
section.uk-section.uk-section-primary.uk-section-xsmall |
|||
.uk-container |
|||
a(href="/").uk-button.uk-button-default.uk-border-rounded |
|||
span.uk-margin-small-right |
|||
i.fas.fa-home |
|||
span Back to #{site.name} |
@ -0,0 +1,5 @@ |
|||
extends layouts/main-sidebar-wide |
|||
block content |
|||
|
|||
h1 Test Dashboard |
|||
p This view will soon have recent top-level test reports and other analytics. |
@ -0,0 +1,10 @@ |
|||
extends layouts/main |
|||
block content |
|||
|
|||
section.uk-section.uk-section-default.uk-section-small |
|||
.uk-container |
|||
.app-title-container.no-select |
|||
img(src="/img/newsroom-header.jpg", alt=`${site.name}: ${site.description}`).responsive |
|||
.app-title-card |
|||
.app-title= site.name |
|||
.app-description= site.description |
@ -0,0 +1,7 @@ |
|||
extends main |
|||
block content-container |
|||
block content |
|||
|
|||
block page-footer |
|||
block mt-navbar |
|||
block mt-off-canvas |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue