mirror of
https://github.com/standardnotes/server
synced 2026-05-10 09:57:17 -04:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| af76878dad | |||
| 28cce39fe7 | |||
| a8b806af08 | |||
| fa0b0294b4 | |||
| 58ab410b0a | |||
| 51c8b20506 | |||
| 1e62a3760e | |||
| 2f569d4104 | |||
| f23e444ed0 | |||
| e6e9a32f03 | |||
| 8237df33a7 | |||
| 624b574013 | |||
| d762bc89d1 | |||
| f0cbec07b8 |
@@ -4802,6 +4802,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/event-store", "workspace:packages/event-store"],\
|
["@standardnotes/event-store", "workspace:packages/event-store"],\
|
||||||
["@aws-sdk/client-sqs", "npm:3.342.0"],\
|
["@aws-sdk/client-sqs", "npm:3.342.0"],\
|
||||||
|
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||||
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
||||||
["@standardnotes/time", "workspace:packages/time"],\
|
["@standardnotes/time", "workspace:packages/time"],\
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [2.24.1](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.24.0...@standardnotes/analytics@2.24.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
# [2.24.0](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.23.7...@standardnotes/analytics@2.24.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [2.23.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.23.6...@standardnotes/analytics@2.23.7) (2023-06-01)
|
## [2.23.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.23.6...@standardnotes/analytics@2.23.7) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/analytics
|
**Note:** Version bump only for package @standardnotes/analytics
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/analytics",
|
"name": "@standardnotes/analytics",
|
||||||
"version": "2.23.7",
|
"version": "2.24.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -88,9 +88,9 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,24 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.63.2](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.63.1...@standardnotes/api-gateway@1.63.2) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/api-gateway/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
## [1.63.1](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.63.0...@standardnotes/api-gateway@1.63.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** add default for VERSION environment variable ([2f569d4](https://github.com/standardnotes/api-gateway/commit/2f569d41047a802eb72ef1a3618ffe4df28a709c))
|
||||||
|
|
||||||
|
# [1.63.0](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.62.4...@standardnotes/api-gateway@1.63.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/api-gateway/issues/621)) ([f0cbec0](https://github.com/standardnotes/api-gateway/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.62.4](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.62.3...@standardnotes/api-gateway@1.62.4) (2023-06-01)
|
## [1.62.4](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.62.3...@standardnotes/api-gateway@1.62.4) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/api-gateway",
|
"name": "@standardnotes/api-gateway",
|
||||||
"version": "1.62.4",
|
"version": "1.63.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -24,8 +24,12 @@ import { OptionalCrossServiceTokenMiddleware } from '../Controller/OptionalCross
|
|||||||
import { Transform } from 'stream'
|
import { Transform } from 'stream'
|
||||||
|
|
||||||
export class ContainerConfigLoader {
|
export class ContainerConfigLoader {
|
||||||
async load(configuration?: { serviceContainer?: ServiceContainerInterface; logger?: Transform }): Promise<Container> {
|
async load(configuration?: {
|
||||||
const env: Env = new Env()
|
serviceContainer?: ServiceContainerInterface
|
||||||
|
logger?: Transform
|
||||||
|
environmentOverrides?: { [name: string]: string }
|
||||||
|
}): Promise<Container> {
|
||||||
|
const env: Env = new Env(configuration?.environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
const container = new Container()
|
const container = new Container()
|
||||||
@@ -45,9 +49,9 @@ export class ContainerConfigLoader {
|
|||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(configuration.logger as winston.Logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(configuration.logger as winston.Logger)
|
||||||
} else {
|
} else {
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
defaultMeta: { service: 'api-gateway' },
|
defaultMeta: { service: 'api-gateway' },
|
||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
@@ -79,7 +83,7 @@ export class ContainerConfigLoader {
|
|||||||
container
|
container
|
||||||
.bind(TYPES.HTTP_CALL_TIMEOUT)
|
.bind(TYPES.HTTP_CALL_TIMEOUT)
|
||||||
.toConstantValue(env.get('HTTP_CALL_TIMEOUT', true) ? +env.get('HTTP_CALL_TIMEOUT', true) : 60_000)
|
.toConstantValue(env.get('HTTP_CALL_TIMEOUT', true) ? +env.get('HTTP_CALL_TIMEOUT', true) : 60_000)
|
||||||
container.bind(TYPES.VERSION).toConstantValue(env.get('VERSION'))
|
container.bind(TYPES.VERSION).toConstantValue(env.get('VERSION', true) ?? 'development')
|
||||||
container.bind(TYPES.CROSS_SERVICE_TOKEN_CACHE_TTL).toConstantValue(+env.get('CROSS_SERVICE_TOKEN_CACHE_TTL', true))
|
container.bind(TYPES.CROSS_SERVICE_TOKEN_CACHE_TTL).toConstantValue(+env.get('CROSS_SERVICE_TOKEN_CACHE_TTL', true))
|
||||||
|
|
||||||
// Middleware
|
// Middleware
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,28 @@
|
|||||||
import { ServiceContainerInterface, ServiceIdentifier, ServiceInterface } from '@standardnotes/domain-core'
|
import {
|
||||||
|
ServiceConfiguration,
|
||||||
|
ServiceContainerInterface,
|
||||||
|
ServiceIdentifier,
|
||||||
|
ServiceInterface,
|
||||||
|
} from '@standardnotes/domain-core'
|
||||||
|
|
||||||
import { ContainerConfigLoader } from './Container'
|
import { ContainerConfigLoader } from './Container'
|
||||||
import { Transform } from 'stream'
|
|
||||||
|
|
||||||
export class Service implements ServiceInterface {
|
export class Service implements ServiceInterface {
|
||||||
private logger: Transform | undefined
|
|
||||||
|
|
||||||
constructor(private serviceContainer: ServiceContainerInterface) {
|
constructor(private serviceContainer: ServiceContainerInterface) {
|
||||||
this.serviceContainer.register(this.getId(), this)
|
this.serviceContainer.register(this.getId(), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
setLogger(logger: Transform): void {
|
|
||||||
this.logger = logger
|
|
||||||
}
|
|
||||||
|
|
||||||
async handleRequest(_request: never, _response: never, _endpointOrMethodIdentifier: string): Promise<unknown> {
|
async handleRequest(_request: never, _response: never, _endpointOrMethodIdentifier: string): Promise<unknown> {
|
||||||
throw new Error('Requests are handled via inversify-express at ApiGateway level')
|
throw new Error('Requests are handled via inversify-express at ApiGateway level')
|
||||||
}
|
}
|
||||||
|
|
||||||
async getContainer(): Promise<unknown> {
|
async getContainer(configuration?: ServiceConfiguration): Promise<unknown> {
|
||||||
const config = new ContainerConfigLoader()
|
const config = new ContainerConfigLoader()
|
||||||
|
|
||||||
return config.load({
|
return config.load({
|
||||||
serviceContainer: this.serviceContainer,
|
serviceContainer: this.serviceContainer,
|
||||||
logger: this.logger,
|
logger: configuration?.logger,
|
||||||
|
environmentOverrides: configuration?.environmentOverrides,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,24 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.116.2](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.116.1...@standardnotes/auth-server@1.116.2) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
## [1.116.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.116.0...@standardnotes/auth-server@1.116.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* initializing data source with already configured environment ([624b574](https://github.com/standardnotes/server/commit/624b574013157e9e044d4a8ed53cadb7fcc567ae))
|
||||||
|
|
||||||
|
# [1.116.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.115.5...@standardnotes/auth-server@1.116.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.115.5](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.115.4...@standardnotes/auth-server@1.115.5) (2023-06-01)
|
## [1.115.5](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.115.4...@standardnotes/auth-server@1.115.5) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/auth-server
|
**Note:** Version bump only for package @standardnotes/auth-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/auth-server",
|
"name": "@standardnotes/auth-server",
|
||||||
"version": "1.115.5",
|
"version": "1.116.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -257,16 +257,18 @@ export class ContainerConfigLoader {
|
|||||||
controllerConatiner?: ControllerContainerInterface
|
controllerConatiner?: ControllerContainerInterface
|
||||||
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
||||||
logger?: Transform
|
logger?: Transform
|
||||||
|
environmentOverrides?: { [name: string]: string }
|
||||||
}): Promise<Container> {
|
}): Promise<Container> {
|
||||||
const directCallDomainEventPublisher =
|
const directCallDomainEventPublisher =
|
||||||
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
||||||
|
|
||||||
const env: Env = new Env()
|
const env: Env = new Env(configuration?.environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
const container = new Container()
|
const container = new Container()
|
||||||
|
|
||||||
await AppDataSource.initialize()
|
const appDataSource = new AppDataSource(env)
|
||||||
|
await appDataSource.initialize()
|
||||||
|
|
||||||
const isConfiguredForHomeServer = env.get('DB_TYPE') === 'sqlite'
|
const isConfiguredForHomeServer = env.get('DB_TYPE') === 'sqlite'
|
||||||
|
|
||||||
@@ -296,9 +298,9 @@ export class ContainerConfigLoader {
|
|||||||
container.bind<winston.Logger>(TYPES.Auth_Logger).toConstantValue(configuration.logger as winston.Logger)
|
container.bind<winston.Logger>(TYPES.Auth_Logger).toConstantValue(configuration.logger as winston.Logger)
|
||||||
} else {
|
} else {
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
defaultMeta: { service: 'auth' },
|
defaultMeta: { service: 'auth' },
|
||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Auth_Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Auth_Logger).toConstantValue(logger)
|
||||||
@@ -358,42 +360,42 @@ export class ContainerConfigLoader {
|
|||||||
// ORM
|
// ORM
|
||||||
container
|
container
|
||||||
.bind<Repository<OfflineSetting>>(TYPES.Auth_ORMOfflineSettingRepository)
|
.bind<Repository<OfflineSetting>>(TYPES.Auth_ORMOfflineSettingRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(OfflineSetting))
|
.toConstantValue(appDataSource.getRepository(OfflineSetting))
|
||||||
container
|
container
|
||||||
.bind<Repository<OfflineUserSubscription>>(TYPES.Auth_ORMOfflineUserSubscriptionRepository)
|
.bind<Repository<OfflineUserSubscription>>(TYPES.Auth_ORMOfflineUserSubscriptionRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(OfflineUserSubscription))
|
.toConstantValue(appDataSource.getRepository(OfflineUserSubscription))
|
||||||
container
|
container
|
||||||
.bind<Repository<RevokedSession>>(TYPES.Auth_ORMRevokedSessionRepository)
|
.bind<Repository<RevokedSession>>(TYPES.Auth_ORMRevokedSessionRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(RevokedSession))
|
.toConstantValue(appDataSource.getRepository(RevokedSession))
|
||||||
container.bind<Repository<Role>>(TYPES.Auth_ORMRoleRepository).toConstantValue(AppDataSource.getRepository(Role))
|
container.bind<Repository<Role>>(TYPES.Auth_ORMRoleRepository).toConstantValue(appDataSource.getRepository(Role))
|
||||||
container
|
container
|
||||||
.bind<Repository<Session>>(TYPES.Auth_ORMSessionRepository)
|
.bind<Repository<Session>>(TYPES.Auth_ORMSessionRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(Session))
|
.toConstantValue(appDataSource.getRepository(Session))
|
||||||
container
|
container
|
||||||
.bind<Repository<Setting>>(TYPES.Auth_ORMSettingRepository)
|
.bind<Repository<Setting>>(TYPES.Auth_ORMSettingRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(Setting))
|
.toConstantValue(appDataSource.getRepository(Setting))
|
||||||
container
|
container
|
||||||
.bind<Repository<SharedSubscriptionInvitation>>(TYPES.Auth_ORMSharedSubscriptionInvitationRepository)
|
.bind<Repository<SharedSubscriptionInvitation>>(TYPES.Auth_ORMSharedSubscriptionInvitationRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(SharedSubscriptionInvitation))
|
.toConstantValue(appDataSource.getRepository(SharedSubscriptionInvitation))
|
||||||
container
|
container
|
||||||
.bind<Repository<SubscriptionSetting>>(TYPES.Auth_ORMSubscriptionSettingRepository)
|
.bind<Repository<SubscriptionSetting>>(TYPES.Auth_ORMSubscriptionSettingRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(SubscriptionSetting))
|
.toConstantValue(appDataSource.getRepository(SubscriptionSetting))
|
||||||
container.bind<Repository<User>>(TYPES.Auth_ORMUserRepository).toConstantValue(AppDataSource.getRepository(User))
|
container.bind<Repository<User>>(TYPES.Auth_ORMUserRepository).toConstantValue(appDataSource.getRepository(User))
|
||||||
container
|
container
|
||||||
.bind<Repository<UserSubscription>>(TYPES.Auth_ORMUserSubscriptionRepository)
|
.bind<Repository<UserSubscription>>(TYPES.Auth_ORMUserSubscriptionRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(UserSubscription))
|
.toConstantValue(appDataSource.getRepository(UserSubscription))
|
||||||
container
|
container
|
||||||
.bind<Repository<TypeORMSessionTrace>>(TYPES.Auth_ORMSessionTraceRepository)
|
.bind<Repository<TypeORMSessionTrace>>(TYPES.Auth_ORMSessionTraceRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(TypeORMSessionTrace))
|
.toConstantValue(appDataSource.getRepository(TypeORMSessionTrace))
|
||||||
container
|
container
|
||||||
.bind<Repository<TypeORMAuthenticator>>(TYPES.Auth_ORMAuthenticatorRepository)
|
.bind<Repository<TypeORMAuthenticator>>(TYPES.Auth_ORMAuthenticatorRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(TypeORMAuthenticator))
|
.toConstantValue(appDataSource.getRepository(TypeORMAuthenticator))
|
||||||
container
|
container
|
||||||
.bind<Repository<TypeORMAuthenticatorChallenge>>(TYPES.Auth_ORMAuthenticatorChallengeRepository)
|
.bind<Repository<TypeORMAuthenticatorChallenge>>(TYPES.Auth_ORMAuthenticatorChallengeRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(TypeORMAuthenticatorChallenge))
|
.toConstantValue(appDataSource.getRepository(TypeORMAuthenticatorChallenge))
|
||||||
container
|
container
|
||||||
.bind<Repository<TypeORMCacheEntry>>(TYPES.Auth_ORMCacheEntryRepository)
|
.bind<Repository<TypeORMCacheEntry>>(TYPES.Auth_ORMCacheEntryRepository)
|
||||||
.toConstantValue(AppDataSource.getRepository(TypeORMCacheEntry))
|
.toConstantValue(appDataSource.getRepository(TypeORMCacheEntry))
|
||||||
|
|
||||||
// Repositories
|
// Repositories
|
||||||
container.bind<SessionRepositoryInterface>(TYPES.Auth_SessionRepository).to(TypeORMSessionRepository)
|
container.bind<SessionRepositoryInterface>(TYPES.Auth_SessionRepository).to(TypeORMSessionRepository)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { DataSource, LoggerOptions } from 'typeorm'
|
import { DataSource, EntityTarget, LoggerOptions, ObjectLiteral, Repository } from 'typeorm'
|
||||||
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'
|
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'
|
||||||
import { Permission } from '../Domain/Permission/Permission'
|
import { Permission } from '../Domain/Permission/Permission'
|
||||||
import { Role } from '../Domain/Role/Role'
|
import { Role } from '../Domain/Role/Role'
|
||||||
@@ -19,88 +19,102 @@ import { TypeORMSessionTrace } from '../Infra/TypeORM/TypeORMSessionTrace'
|
|||||||
import { Env } from './Env'
|
import { Env } from './Env'
|
||||||
import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'
|
import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'
|
||||||
|
|
||||||
const env: Env = new Env()
|
export class AppDataSource {
|
||||||
env.load()
|
private dataSource: DataSource | undefined
|
||||||
|
|
||||||
const isConfiguredForMySQL = env.get('DB_TYPE') === 'mysql'
|
constructor(private env: Env) {}
|
||||||
|
|
||||||
const maxQueryExecutionTime = env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
getRepository<Entity extends ObjectLiteral>(target: EntityTarget<Entity>): Repository<Entity> {
|
||||||
? +env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
if (!this.dataSource) {
|
||||||
: 45_000
|
throw new Error('DataSource not initialized')
|
||||||
|
}
|
||||||
|
|
||||||
const commonDataSourceOptions = {
|
return this.dataSource.getRepository(target)
|
||||||
maxQueryExecutionTime,
|
}
|
||||||
entities: [
|
|
||||||
User,
|
async initialize(): Promise<void> {
|
||||||
UserSubscription,
|
this.env.load()
|
||||||
OfflineUserSubscription,
|
|
||||||
Session,
|
const isConfiguredForMySQL = this.env.get('DB_TYPE') === 'mysql'
|
||||||
RevokedSession,
|
|
||||||
Role,
|
const maxQueryExecutionTime = this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||||
Permission,
|
? +this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||||
Setting,
|
: 45_000
|
||||||
OfflineSetting,
|
|
||||||
SharedSubscriptionInvitation,
|
const commonDataSourceOptions = {
|
||||||
SubscriptionSetting,
|
maxQueryExecutionTime,
|
||||||
TypeORMSessionTrace,
|
entities: [
|
||||||
TypeORMAuthenticator,
|
User,
|
||||||
TypeORMAuthenticatorChallenge,
|
UserSubscription,
|
||||||
TypeORMEmergencyAccessInvitation,
|
OfflineUserSubscription,
|
||||||
TypeORMCacheEntry,
|
Session,
|
||||||
],
|
RevokedSession,
|
||||||
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
Role,
|
||||||
migrationsRun: true,
|
Permission,
|
||||||
logging: <LoggerOptions>env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
Setting,
|
||||||
|
OfflineSetting,
|
||||||
|
SharedSubscriptionInvitation,
|
||||||
|
SubscriptionSetting,
|
||||||
|
TypeORMSessionTrace,
|
||||||
|
TypeORMAuthenticator,
|
||||||
|
TypeORMAuthenticatorChallenge,
|
||||||
|
TypeORMEmergencyAccessInvitation,
|
||||||
|
TypeORMCacheEntry,
|
||||||
|
],
|
||||||
|
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
||||||
|
migrationsRun: true,
|
||||||
|
logging: <LoggerOptions>this.env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isConfiguredForMySQL) {
|
||||||
|
const inReplicaMode = this.env.get('DB_REPLICA_HOST', true) ? true : false
|
||||||
|
|
||||||
|
const replicationConfig = {
|
||||||
|
master: {
|
||||||
|
host: this.env.get('DB_HOST'),
|
||||||
|
port: parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: this.env.get('DB_USERNAME'),
|
||||||
|
password: this.env.get('DB_PASSWORD'),
|
||||||
|
database: this.env.get('DB_DATABASE'),
|
||||||
|
},
|
||||||
|
slaves: [
|
||||||
|
{
|
||||||
|
host: this.env.get('DB_REPLICA_HOST', true),
|
||||||
|
port: parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: this.env.get('DB_USERNAME'),
|
||||||
|
password: this.env.get('DB_PASSWORD'),
|
||||||
|
database: this.env.get('DB_DATABASE'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
removeNodeErrorCount: 10,
|
||||||
|
restoreNodeTimeout: 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
const mySQLDataSourceOptions: MysqlConnectionOptions = {
|
||||||
|
...commonDataSourceOptions,
|
||||||
|
type: 'mysql',
|
||||||
|
charset: 'utf8mb4',
|
||||||
|
supportBigNumbers: true,
|
||||||
|
bigNumberStrings: false,
|
||||||
|
replication: inReplicaMode ? replicationConfig : undefined,
|
||||||
|
host: inReplicaMode ? undefined : this.env.get('DB_HOST'),
|
||||||
|
port: inReplicaMode ? undefined : parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: inReplicaMode ? undefined : this.env.get('DB_USERNAME'),
|
||||||
|
password: inReplicaMode ? undefined : this.env.get('DB_PASSWORD'),
|
||||||
|
database: inReplicaMode ? undefined : this.env.get('DB_DATABASE'),
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = new DataSource(mySQLDataSourceOptions)
|
||||||
|
} else {
|
||||||
|
const sqliteDataSourceOptions: SqliteConnectionOptions = {
|
||||||
|
...commonDataSourceOptions,
|
||||||
|
type: 'sqlite',
|
||||||
|
database: `data/${this.env.get('DB_DATABASE')}.sqlite`,
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = new DataSource(sqliteDataSourceOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.dataSource.initialize()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let dataSource: DataSource
|
|
||||||
if (isConfiguredForMySQL) {
|
|
||||||
const inReplicaMode = env.get('DB_REPLICA_HOST', true) ? true : false
|
|
||||||
|
|
||||||
const replicationConfig = {
|
|
||||||
master: {
|
|
||||||
host: env.get('DB_HOST'),
|
|
||||||
port: parseInt(env.get('DB_PORT')),
|
|
||||||
username: env.get('DB_USERNAME'),
|
|
||||||
password: env.get('DB_PASSWORD'),
|
|
||||||
database: env.get('DB_DATABASE'),
|
|
||||||
},
|
|
||||||
slaves: [
|
|
||||||
{
|
|
||||||
host: env.get('DB_REPLICA_HOST', true),
|
|
||||||
port: parseInt(env.get('DB_PORT')),
|
|
||||||
username: env.get('DB_USERNAME'),
|
|
||||||
password: env.get('DB_PASSWORD'),
|
|
||||||
database: env.get('DB_DATABASE'),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
removeNodeErrorCount: 10,
|
|
||||||
restoreNodeTimeout: 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
const mySQLDataSourceOptions: MysqlConnectionOptions = {
|
|
||||||
...commonDataSourceOptions,
|
|
||||||
type: 'mysql',
|
|
||||||
charset: 'utf8mb4',
|
|
||||||
supportBigNumbers: true,
|
|
||||||
bigNumberStrings: false,
|
|
||||||
replication: inReplicaMode ? replicationConfig : undefined,
|
|
||||||
host: inReplicaMode ? undefined : env.get('DB_HOST'),
|
|
||||||
port: inReplicaMode ? undefined : parseInt(env.get('DB_PORT')),
|
|
||||||
username: inReplicaMode ? undefined : env.get('DB_USERNAME'),
|
|
||||||
password: inReplicaMode ? undefined : env.get('DB_PASSWORD'),
|
|
||||||
database: inReplicaMode ? undefined : env.get('DB_DATABASE'),
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSource = new DataSource(mySQLDataSourceOptions)
|
|
||||||
} else {
|
|
||||||
const sqliteDataSourceOptions: SqliteConnectionOptions = {
|
|
||||||
...commonDataSourceOptions,
|
|
||||||
type: 'sqlite',
|
|
||||||
database: `data/${env.get('DB_DATABASE')}.sqlite`,
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSource = new DataSource(sqliteDataSourceOptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const AppDataSource = dataSource
|
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
ControllerContainerInterface,
|
ControllerContainerInterface,
|
||||||
|
ServiceConfiguration,
|
||||||
ServiceContainerInterface,
|
ServiceContainerInterface,
|
||||||
ServiceIdentifier,
|
ServiceIdentifier,
|
||||||
ServiceInterface,
|
ServiceInterface,
|
||||||
@@ -7,11 +8,8 @@ import {
|
|||||||
|
|
||||||
import { ContainerConfigLoader } from './Container'
|
import { ContainerConfigLoader } from './Container'
|
||||||
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
||||||
import { Transform } from 'stream'
|
|
||||||
|
|
||||||
export class Service implements ServiceInterface {
|
export class Service implements ServiceInterface {
|
||||||
private logger: Transform | undefined
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private serviceContainer: ServiceContainerInterface,
|
private serviceContainer: ServiceContainerInterface,
|
||||||
private controllerContainer: ControllerContainerInterface,
|
private controllerContainer: ControllerContainerInterface,
|
||||||
@@ -20,10 +18,6 @@ export class Service implements ServiceInterface {
|
|||||||
this.serviceContainer.register(this.getId(), this)
|
this.serviceContainer.register(this.getId(), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
setLogger(logger: Transform): void {
|
|
||||||
this.logger = logger
|
|
||||||
}
|
|
||||||
|
|
||||||
async handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown> {
|
async handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown> {
|
||||||
const method = this.controllerContainer.get(endpointOrMethodIdentifier)
|
const method = this.controllerContainer.get(endpointOrMethodIdentifier)
|
||||||
|
|
||||||
@@ -34,13 +28,14 @@ export class Service implements ServiceInterface {
|
|||||||
return method(request, response)
|
return method(request, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getContainer(): Promise<unknown> {
|
async getContainer(configuration?: ServiceConfiguration): Promise<unknown> {
|
||||||
const config = new ContainerConfigLoader()
|
const config = new ContainerConfigLoader()
|
||||||
|
|
||||||
return config.load({
|
return config.load({
|
||||||
controllerConatiner: this.controllerContainer,
|
controllerConatiner: this.controllerContainer,
|
||||||
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
||||||
logger: this.logger,
|
logger: configuration?.logger,
|
||||||
|
environmentOverrides: configuration?.environmentOverrides,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [1.18.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.17.0...@standardnotes/domain-core@1.18.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
# [1.17.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.16.2...@standardnotes/domain-core@1.17.0) (2023-05-31)
|
# [1.17.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.16.2...@standardnotes/domain-core@1.17.0) (2023-05-31)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/domain-core",
|
"name": "@standardnotes/domain-core",
|
||||||
"version": "1.17.0",
|
"version": "1.18.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
export abstract class AbstractEnv {
|
||||||
|
protected env?: { [key: string]: string } = {}
|
||||||
|
protected overrides: { [key: string]: string }
|
||||||
|
|
||||||
|
constructor(overrides: { [key: string]: string } = {}) {
|
||||||
|
this.overrides = overrides
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract load(): void
|
||||||
|
|
||||||
|
get(key: string, optional = false): string {
|
||||||
|
if (!this.env) {
|
||||||
|
this.load()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.overrides[key]) {
|
||||||
|
return this.overrides[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!process.env[key] && !optional) {
|
||||||
|
throw new Error(`Environment variable ${key} not set`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return <string>process.env[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import { Transform } from 'stream'
|
||||||
|
|
||||||
|
export interface ServiceConfiguration {
|
||||||
|
logger?: Transform
|
||||||
|
environmentOverrides?: { [name: string]: string }
|
||||||
|
}
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
|
import { ServiceConfiguration } from './ServiceConfiguration'
|
||||||
import { ServiceIdentifier } from './ServiceIdentifier'
|
import { ServiceIdentifier } from './ServiceIdentifier'
|
||||||
import { Transform } from 'stream'
|
|
||||||
|
|
||||||
export interface ServiceInterface {
|
export interface ServiceInterface {
|
||||||
getContainer(): Promise<unknown>
|
getContainer(configuration?: ServiceConfiguration): Promise<unknown>
|
||||||
setLogger(logger: Transform): void
|
|
||||||
getId(): ServiceIdentifier
|
getId(): ServiceIdentifier
|
||||||
handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown>
|
handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,11 @@ export * from './DI/ControllerContainerInterface'
|
|||||||
export * from './Email/EmailLevel'
|
export * from './Email/EmailLevel'
|
||||||
export * from './Email/EmailLevelProps'
|
export * from './Email/EmailLevelProps'
|
||||||
|
|
||||||
|
export * from './Env/AbstractEnv'
|
||||||
|
|
||||||
export * from './Mapping/MapperInterface'
|
export * from './Mapping/MapperInterface'
|
||||||
|
|
||||||
|
export * from './Service/ServiceConfiguration'
|
||||||
export * from './Service/ServiceContainer'
|
export * from './Service/ServiceContainer'
|
||||||
export * from './Service/ServiceContainerInterface'
|
export * from './Service/ServiceContainerInterface'
|
||||||
export * from './Service/ServiceIdentifier'
|
export * from './Service/ServiceIdentifier'
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.10.1](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.10.0...@standardnotes/event-store@1.10.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
# [1.10.0](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.9.6...@standardnotes/event-store@1.10.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.9.6](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.9.5...@standardnotes/event-store@1.9.6) (2023-06-01)
|
## [1.9.6](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.9.5...@standardnotes/event-store@1.9.6) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/event-store
|
**Note:** Version bump only for package @standardnotes/event-store
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/event-store",
|
"name": "@standardnotes/event-store",
|
||||||
"version": "1.9.6",
|
"version": "1.10.1",
|
||||||
"description": "Event Store Service",
|
"description": "Event Store Service",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "dist/src/index.js",
|
"main": "dist/src/index.js",
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-sqs": "^3.332.0",
|
"@aws-sdk/client-sqs": "^3.332.0",
|
||||||
|
"@standardnotes/domain-core": "workspace:^",
|
||||||
"@standardnotes/domain-events": "workspace:*",
|
"@standardnotes/domain-events": "workspace:*",
|
||||||
"@standardnotes/domain-events-infra": "workspace:*",
|
"@standardnotes/domain-events-infra": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(winston.format.splat(), winston.format.json()),
|
format: winston.format.combine(winston.format.splat(), winston.format.json()),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.17.1](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.17.0...@standardnotes/files-server@1.17.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/files/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
# [1.17.0](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.16.5...@standardnotes/files-server@1.17.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/files/issues/621)) ([f0cbec0](https://github.com/standardnotes/files/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.16.5](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.16.4...@standardnotes/files-server@1.16.5) (2023-06-01)
|
## [1.16.5](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.16.4...@standardnotes/files-server@1.16.5) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/files-server
|
**Note:** Version bump only for package @standardnotes/files-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/files-server",
|
"name": "@standardnotes/files-server",
|
||||||
"version": "1.16.5",
|
"version": "1.17.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -53,11 +53,12 @@ export class ContainerConfigLoader {
|
|||||||
async load(configuration?: {
|
async load(configuration?: {
|
||||||
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
||||||
logger?: Transform
|
logger?: Transform
|
||||||
|
environmentOverrides?: { [name: string]: string }
|
||||||
}): Promise<Container> {
|
}): Promise<Container> {
|
||||||
const directCallDomainEventPublisher =
|
const directCallDomainEventPublisher =
|
||||||
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
||||||
|
|
||||||
const env: Env = new Env()
|
const env: Env = new Env(configuration?.environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
const container = new Container()
|
const container = new Container()
|
||||||
@@ -249,9 +250,9 @@ export class ContainerConfigLoader {
|
|||||||
|
|
||||||
createLogger({ env }: { env: Env }): winston.Logger {
|
createLogger({ env }: { env: Env }): winston.Logger {
|
||||||
return winston.createLogger({
|
return winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(winston.format.splat(), winston.format.json()),
|
format: winston.format.combine(winston.format.splat(), winston.format.json()),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
defaultMeta: { service: 'files' },
|
defaultMeta: { service: 'files' },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import { ServiceContainerInterface, ServiceIdentifier, ServiceInterface } from '@standardnotes/domain-core'
|
import {
|
||||||
|
ServiceConfiguration,
|
||||||
|
ServiceContainerInterface,
|
||||||
|
ServiceIdentifier,
|
||||||
|
ServiceInterface,
|
||||||
|
} from '@standardnotes/domain-core'
|
||||||
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
||||||
|
|
||||||
import { ContainerConfigLoader } from './Container'
|
import { ContainerConfigLoader } from './Container'
|
||||||
import { Transform } from 'stream'
|
|
||||||
|
|
||||||
export class Service implements ServiceInterface {
|
export class Service implements ServiceInterface {
|
||||||
private logger: Transform | undefined
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private serviceContainer: ServiceContainerInterface,
|
private serviceContainer: ServiceContainerInterface,
|
||||||
private directCallDomainEventPublisher: DirectCallDomainEventPublisher,
|
private directCallDomainEventPublisher: DirectCallDomainEventPublisher,
|
||||||
@@ -14,20 +16,17 @@ export class Service implements ServiceInterface {
|
|||||||
this.serviceContainer.register(this.getId(), this)
|
this.serviceContainer.register(this.getId(), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
setLogger(logger: Transform): void {
|
|
||||||
this.logger = logger
|
|
||||||
}
|
|
||||||
|
|
||||||
async handleRequest(_request: never, _response: never, _endpointOrMethodIdentifier: string): Promise<unknown> {
|
async handleRequest(_request: never, _response: never, _endpointOrMethodIdentifier: string): Promise<unknown> {
|
||||||
throw new Error('Requests are handled via inversify-express at ApiGateway level')
|
throw new Error('Requests are handled via inversify-express at ApiGateway level')
|
||||||
}
|
}
|
||||||
|
|
||||||
async getContainer(): Promise<unknown> {
|
async getContainer(configuration?: ServiceConfiguration): Promise<unknown> {
|
||||||
const config = new ContainerConfigLoader()
|
const config = new ContainerConfigLoader()
|
||||||
|
|
||||||
return config.load({
|
return config.load({
|
||||||
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
||||||
logger: this.logger,
|
logger: configuration?.logger,
|
||||||
|
environmentOverrides: configuration?.environmentOverrides,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,5 @@
|
|||||||
LOG_LEVEL=debug
|
LOG_LEVEL=debug
|
||||||
NODE_ENV=development
|
NODE_ENV=development
|
||||||
VERSION=development
|
|
||||||
|
|
||||||
# (Optional) New Relic Setup
|
|
||||||
NEW_RELIC_ENABLED=false
|
|
||||||
NEW_RELIC_APP_NAME="Home Server"
|
|
||||||
|
|
||||||
CACHE_TYPE=memory
|
|
||||||
|
|
||||||
DB_TYPE=sqlite
|
|
||||||
DB_DATABASE=home_server
|
|
||||||
|
|
||||||
JWT_SECRET=
|
JWT_SECRET=
|
||||||
AUTH_JWT_SECRET=
|
AUTH_JWT_SECRET=
|
||||||
|
|||||||
@@ -3,6 +3,42 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.8.5](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.8.4...@standardnotes/home-server@1.8.5) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** linter issues ([28cce39](https://github.com/standardnotes/server/commit/28cce39fe7a75fec035f920573271e1e56421818))
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
## [1.8.4](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.8.3...@standardnotes/home-server@1.8.4) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** remove redundant restart method ([58ab410](https://github.com/standardnotes/server/commit/58ab410b0afb1d811247cd65b2585d06f9c8807a))
|
||||||
|
|
||||||
|
## [1.8.3](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.8.2...@standardnotes/home-server@1.8.3) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** add default for VERSION environment variable ([2f569d4](https://github.com/standardnotes/server/commit/2f569d41047a802eb72ef1a3618ffe4df28a709c))
|
||||||
|
* **home-server:** displaying the port on which it is running ([1e62a37](https://github.com/standardnotes/server/commit/1e62a3760e3b9601478c851cf33db2f2b348d7fb))
|
||||||
|
|
||||||
|
## [1.8.2](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.8.1...@standardnotes/home-server@1.8.2) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** default configuration variables ([e6e9a32](https://github.com/standardnotes/server/commit/e6e9a32f0385789e5e772e5cabcc0da0b8ccbb01))
|
||||||
|
|
||||||
|
## [1.8.1](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.8.0...@standardnotes/home-server@1.8.1) (2023-06-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/home-server
|
||||||
|
|
||||||
|
# [1.8.0](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.7.5...@standardnotes/home-server@1.8.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.7.5](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.7.4...@standardnotes/home-server@1.7.5) (2023-06-01)
|
## [1.7.5](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.7.4...@standardnotes/home-server@1.7.5) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/home-server
|
**Note:** Version bump only for package @standardnotes/home-server
|
||||||
|
|||||||
@@ -2,7 +2,16 @@ import { HomeServer } from '../src/Server/HomeServer'
|
|||||||
|
|
||||||
const homeServer = new HomeServer()
|
const homeServer = new HomeServer()
|
||||||
|
|
||||||
Promise.resolve(homeServer.start()).catch((error) => {
|
Promise.resolve(homeServer.start())
|
||||||
// eslint-disable-next-line no-console
|
.then(() => {
|
||||||
console.log(`Could not start server: ${error.message}`)
|
const logStream = homeServer.logs()
|
||||||
})
|
|
||||||
|
logStream.on('data', (chunk: Buffer) => {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(chunk.toString())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`Could not start server: ${error.message}`)
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/home-server",
|
"name": "@standardnotes/home-server",
|
||||||
"version": "1.7.5",
|
"version": "1.8.5",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
"clean": "rm -fr dist",
|
"clean": "rm -fr dist",
|
||||||
"build": "tsc --build",
|
"build": "tsc --build",
|
||||||
"lint": "eslint . --ext .ts",
|
"lint": "eslint . --ext .ts",
|
||||||
|
"lint:fix": "eslint . --ext .ts --fix",
|
||||||
"start": "yarn node dist/bin/server.js"
|
"start": "yarn node dist/bin/server.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,37 +20,58 @@ const robots = require('express-robots-txt')
|
|||||||
|
|
||||||
import { Env } from '../Bootstrap/Env'
|
import { Env } from '../Bootstrap/Env'
|
||||||
import { HomeServerInterface } from './HomeServerInterface'
|
import { HomeServerInterface } from './HomeServerInterface'
|
||||||
|
import { HomeServerConfiguration } from './HomeServerConfiguration'
|
||||||
|
|
||||||
export class HomeServer implements HomeServerInterface {
|
export class HomeServer implements HomeServerInterface {
|
||||||
private serverInstance: http.Server | undefined
|
private serverInstance: http.Server | undefined
|
||||||
|
private logStream: PassThrough = new PassThrough()
|
||||||
|
|
||||||
async start(): Promise<void> {
|
async start(configuration?: HomeServerConfiguration): Promise<void> {
|
||||||
const controllerContainer = new ControllerContainer()
|
const controllerContainer = new ControllerContainer()
|
||||||
const serviceContainer = new ServiceContainer()
|
const serviceContainer = new ServiceContainer()
|
||||||
const directCallDomainEventPublisher = new DirectCallDomainEventPublisher()
|
const directCallDomainEventPublisher = new DirectCallDomainEventPublisher()
|
||||||
|
|
||||||
const env: Env = new Env()
|
const environmentOverrides = {
|
||||||
|
...configuration?.environment,
|
||||||
|
NEW_RELIC_ENABLED: 'false',
|
||||||
|
NEW_RELIC_APP_NAME: 'Home Server',
|
||||||
|
CACHE_TYPE: 'memory',
|
||||||
|
DB_TYPE: 'sqlite',
|
||||||
|
DB_DATABASE: 'home_server',
|
||||||
|
}
|
||||||
|
|
||||||
|
const env: Env = new Env(environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
this.configureLoggers(env)
|
this.configureLoggers(env)
|
||||||
|
|
||||||
const apiGatewayService = new ApiGatewayService(serviceContainer)
|
const apiGatewayService = new ApiGatewayService(serviceContainer)
|
||||||
apiGatewayService.setLogger(winston.loggers.get('api-gateway'))
|
|
||||||
const authService = new AuthService(serviceContainer, controllerContainer, directCallDomainEventPublisher)
|
const authService = new AuthService(serviceContainer, controllerContainer, directCallDomainEventPublisher)
|
||||||
authService.setLogger(winston.loggers.get('auth-server'))
|
|
||||||
const syncingService = new SyncingService(serviceContainer, controllerContainer, directCallDomainEventPublisher)
|
const syncingService = new SyncingService(serviceContainer, controllerContainer, directCallDomainEventPublisher)
|
||||||
syncingService.setLogger(winston.loggers.get('syncing-server'))
|
|
||||||
const revisionsService = new RevisionsService(serviceContainer, controllerContainer, directCallDomainEventPublisher)
|
const revisionsService = new RevisionsService(serviceContainer, controllerContainer, directCallDomainEventPublisher)
|
||||||
revisionsService.setLogger(winston.loggers.get('revisions-server'))
|
|
||||||
const filesService = new FilesService(serviceContainer, directCallDomainEventPublisher)
|
const filesService = new FilesService(serviceContainer, directCallDomainEventPublisher)
|
||||||
filesService.setLogger(winston.loggers.get('files-server'))
|
|
||||||
|
|
||||||
const container = Container.merge(
|
const container = Container.merge(
|
||||||
(await apiGatewayService.getContainer()) as Container,
|
(await apiGatewayService.getContainer({
|
||||||
(await authService.getContainer()) as Container,
|
logger: winston.loggers.get('api-gateway'),
|
||||||
(await syncingService.getContainer()) as Container,
|
environmentOverrides,
|
||||||
(await revisionsService.getContainer()) as Container,
|
})) as Container,
|
||||||
(await filesService.getContainer()) as Container,
|
(await authService.getContainer({
|
||||||
|
logger: winston.loggers.get('auth-server'),
|
||||||
|
environmentOverrides,
|
||||||
|
})) as Container,
|
||||||
|
(await syncingService.getContainer({
|
||||||
|
logger: winston.loggers.get('syncing-server'),
|
||||||
|
environmentOverrides,
|
||||||
|
})) as Container,
|
||||||
|
(await revisionsService.getContainer({
|
||||||
|
logger: winston.loggers.get('revisions-server'),
|
||||||
|
environmentOverrides,
|
||||||
|
})) as Container,
|
||||||
|
(await filesService.getContainer({
|
||||||
|
logger: winston.loggers.get('files-server'),
|
||||||
|
environmentOverrides,
|
||||||
|
})) as Container,
|
||||||
)
|
)
|
||||||
|
|
||||||
const server = new InversifyExpressServer(container)
|
const server = new InversifyExpressServer(container)
|
||||||
@@ -108,9 +129,11 @@ export class HomeServer implements HomeServerInterface {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
this.serverInstance = server.build().listen(env.get('PORT', true) ? +env.get('PORT', true) : 3000)
|
const port = env.get('PORT', true) ? +env.get('PORT', true) : 3000
|
||||||
|
|
||||||
logger.info(`Server started on port ${process.env.PORT}`)
|
this.serverInstance = server.build().listen(port)
|
||||||
|
|
||||||
|
logger.info(`Server started on port ${port}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
async stop(): Promise<void> {
|
async stop(): Promise<void> {
|
||||||
@@ -119,11 +142,6 @@ export class HomeServer implements HomeServerInterface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async restart(): Promise<void> {
|
|
||||||
await this.stop()
|
|
||||||
await this.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
async isRunning(): Promise<boolean> {
|
async isRunning(): Promise<boolean> {
|
||||||
if (!this.serverInstance) {
|
if (!this.serverInstance) {
|
||||||
return false
|
return false
|
||||||
@@ -133,18 +151,14 @@ export class HomeServer implements HomeServerInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logs(): NodeJS.ReadableStream {
|
logs(): NodeJS.ReadableStream {
|
||||||
const passThroughStream = new PassThrough()
|
return this.logStream
|
||||||
|
|
||||||
for (const logger of winston.loggers.loggers.values()) {
|
|
||||||
logger.stream({ start: -1 }).pipe(passThroughStream, { end: false })
|
|
||||||
}
|
|
||||||
|
|
||||||
return passThroughStream
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private configureLoggers(env: Env): void {
|
private configureLoggers(env: Env): void {
|
||||||
const winstonFormatters = [winston.format.splat(), winston.format.json()]
|
const winstonFormatters = [winston.format.splat(), winston.format.json()]
|
||||||
|
|
||||||
|
const level = env.get('LOG_LEVEL', true) || 'info'
|
||||||
|
|
||||||
for (const loggerName of [
|
for (const loggerName of [
|
||||||
'auth-server',
|
'auth-server',
|
||||||
'syncing-server',
|
'syncing-server',
|
||||||
@@ -154,9 +168,14 @@ export class HomeServer implements HomeServerInterface {
|
|||||||
'home-server',
|
'home-server',
|
||||||
]) {
|
]) {
|
||||||
winston.loggers.add(loggerName, {
|
winston.loggers.add(loggerName, {
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level,
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [
|
||||||
|
new winston.transports.Stream({
|
||||||
|
level,
|
||||||
|
stream: this.logStream,
|
||||||
|
}),
|
||||||
|
],
|
||||||
defaultMeta: { service: loggerName },
|
defaultMeta: { service: loggerName },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export interface HomeServerConfiguration {
|
||||||
|
environment: { [name: string]: string }
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
|
import { HomeServerConfiguration } from './HomeServerConfiguration'
|
||||||
|
|
||||||
export interface HomeServerInterface {
|
export interface HomeServerInterface {
|
||||||
start(): Promise<void>
|
start(configuration?: HomeServerConfiguration): Promise<void>
|
||||||
stop(): Promise<void>
|
stop(): Promise<void>
|
||||||
restart(): Promise<void>
|
|
||||||
isRunning(): Promise<boolean>
|
isRunning(): Promise<boolean>
|
||||||
logs(): NodeJS.ReadableStream
|
logs(): NodeJS.ReadableStream
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
export * from './HomeServer'
|
export * from './HomeServer'
|
||||||
|
export * from './HomeServerConfiguration'
|
||||||
export * from './HomeServerInterface'
|
export * from './HomeServerInterface'
|
||||||
|
|||||||
@@ -3,6 +3,30 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.21.3](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.21.2...@standardnotes/revisions-server@1.21.3) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
## [1.21.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.21.1...@standardnotes/revisions-server@1.21.2) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** add default for VERSION environment variable ([2f569d4](https://github.com/standardnotes/server/commit/2f569d41047a802eb72ef1a3618ffe4df28a709c))
|
||||||
|
|
||||||
|
## [1.21.1](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.21.0...@standardnotes/revisions-server@1.21.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* initializing data source with already configured environment ([624b574](https://github.com/standardnotes/server/commit/624b574013157e9e044d4a8ed53cadb7fcc567ae))
|
||||||
|
|
||||||
|
# [1.21.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.20.4...@standardnotes/revisions-server@1.21.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.20.4](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.20.3...@standardnotes/revisions-server@1.20.4) (2023-06-01)
|
## [1.20.4](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.20.3...@standardnotes/revisions-server@1.20.4) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/revisions-server",
|
"name": "@standardnotes/revisions-server",
|
||||||
"version": "1.20.4",
|
"version": "1.21.3",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -53,11 +53,12 @@ export class ContainerConfigLoader {
|
|||||||
controllerConatiner?: ControllerContainerInterface
|
controllerConatiner?: ControllerContainerInterface
|
||||||
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
||||||
logger?: Transform
|
logger?: Transform
|
||||||
|
environmentOverrides?: { [name: string]: string }
|
||||||
}): Promise<Container> {
|
}): Promise<Container> {
|
||||||
const directCallDomainEventPublisher =
|
const directCallDomainEventPublisher =
|
||||||
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
||||||
|
|
||||||
const env: Env = new Env()
|
const env: Env = new Env(configuration?.environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
const isConfiguredForHomeServer = env.get('DB_TYPE') === 'sqlite'
|
const isConfiguredForHomeServer = env.get('DB_TYPE') === 'sqlite'
|
||||||
@@ -66,7 +67,8 @@ export class ContainerConfigLoader {
|
|||||||
defaultScope: 'Singleton',
|
defaultScope: 'Singleton',
|
||||||
})
|
})
|
||||||
|
|
||||||
await AppDataSource.initialize()
|
const appDataSource = new AppDataSource(env)
|
||||||
|
await appDataSource.initialize()
|
||||||
|
|
||||||
container.bind<Env>(TYPES.Revisions_Env).toConstantValue(env)
|
container.bind<Env>(TYPES.Revisions_Env).toConstantValue(env)
|
||||||
|
|
||||||
@@ -83,9 +85,9 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
defaultMeta: { service: 'revisions' },
|
defaultMeta: { service: 'revisions' },
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -93,7 +95,7 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
container.bind(TYPES.Revisions_NEW_RELIC_ENABLED).toConstantValue(env.get('NEW_RELIC_ENABLED', true))
|
container.bind(TYPES.Revisions_NEW_RELIC_ENABLED).toConstantValue(env.get('NEW_RELIC_ENABLED', true))
|
||||||
container.bind(TYPES.Revisions_VERSION).toConstantValue(env.get('VERSION'))
|
container.bind(TYPES.Revisions_VERSION).toConstantValue(env.get('VERSION', true) ?? 'development')
|
||||||
|
|
||||||
// Map
|
// Map
|
||||||
container
|
container
|
||||||
@@ -106,7 +108,7 @@ export class ContainerConfigLoader {
|
|||||||
// ORM
|
// ORM
|
||||||
container
|
container
|
||||||
.bind<Repository<TypeORMRevision>>(TYPES.Revisions_ORMRevisionRepository)
|
.bind<Repository<TypeORMRevision>>(TYPES.Revisions_ORMRevisionRepository)
|
||||||
.toDynamicValue(() => AppDataSource.getRepository(TypeORMRevision))
|
.toDynamicValue(() => appDataSource.getRepository(TypeORMRevision))
|
||||||
|
|
||||||
// Repositories
|
// Repositories
|
||||||
container
|
container
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { DataSource, LoggerOptions } from 'typeorm'
|
import { DataSource, EntityTarget, LoggerOptions, ObjectLiteral, Repository } from 'typeorm'
|
||||||
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'
|
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'
|
||||||
|
|
||||||
import { TypeORMRevision } from '../Infra/TypeORM/TypeORMRevision'
|
import { TypeORMRevision } from '../Infra/TypeORM/TypeORMRevision'
|
||||||
@@ -6,71 +6,85 @@ import { TypeORMRevision } from '../Infra/TypeORM/TypeORMRevision'
|
|||||||
import { Env } from './Env'
|
import { Env } from './Env'
|
||||||
import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'
|
import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'
|
||||||
|
|
||||||
const env: Env = new Env()
|
export class AppDataSource {
|
||||||
env.load()
|
private dataSource: DataSource | undefined
|
||||||
|
|
||||||
const isConfiguredForMySQL = env.get('DB_TYPE') === 'mysql'
|
constructor(private env: Env) {}
|
||||||
|
|
||||||
const maxQueryExecutionTime = env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
getRepository<Entity extends ObjectLiteral>(target: EntityTarget<Entity>): Repository<Entity> {
|
||||||
? +env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
if (!this.dataSource) {
|
||||||
: 45_000
|
throw new Error('DataSource not initialized')
|
||||||
|
}
|
||||||
|
|
||||||
const commonDataSourceOptions = {
|
return this.dataSource.getRepository(target)
|
||||||
maxQueryExecutionTime,
|
}
|
||||||
entities: [TypeORMRevision],
|
|
||||||
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
async initialize(): Promise<void> {
|
||||||
migrationsRun: true,
|
this.env.load()
|
||||||
logging: <LoggerOptions>env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
|
||||||
|
const isConfiguredForMySQL = this.env.get('DB_TYPE') === 'mysql'
|
||||||
|
|
||||||
|
const maxQueryExecutionTime = this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||||
|
? +this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||||
|
: 45_000
|
||||||
|
|
||||||
|
const commonDataSourceOptions = {
|
||||||
|
maxQueryExecutionTime,
|
||||||
|
entities: [TypeORMRevision],
|
||||||
|
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
||||||
|
migrationsRun: true,
|
||||||
|
logging: <LoggerOptions>this.env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isConfiguredForMySQL) {
|
||||||
|
const inReplicaMode = this.env.get('DB_REPLICA_HOST', true) ? true : false
|
||||||
|
|
||||||
|
const replicationConfig = {
|
||||||
|
master: {
|
||||||
|
host: this.env.get('DB_HOST'),
|
||||||
|
port: parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: this.env.get('DB_USERNAME'),
|
||||||
|
password: this.env.get('DB_PASSWORD'),
|
||||||
|
database: this.env.get('DB_DATABASE'),
|
||||||
|
},
|
||||||
|
slaves: [
|
||||||
|
{
|
||||||
|
host: this.env.get('DB_REPLICA_HOST', true),
|
||||||
|
port: parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: this.env.get('DB_USERNAME'),
|
||||||
|
password: this.env.get('DB_PASSWORD'),
|
||||||
|
database: this.env.get('DB_DATABASE'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
removeNodeErrorCount: 10,
|
||||||
|
restoreNodeTimeout: 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
const mySQLDataSourceOptions: MysqlConnectionOptions = {
|
||||||
|
...commonDataSourceOptions,
|
||||||
|
type: 'mysql',
|
||||||
|
charset: 'utf8mb4',
|
||||||
|
supportBigNumbers: true,
|
||||||
|
bigNumberStrings: false,
|
||||||
|
replication: inReplicaMode ? replicationConfig : undefined,
|
||||||
|
host: inReplicaMode ? undefined : this.env.get('DB_HOST'),
|
||||||
|
port: inReplicaMode ? undefined : parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: inReplicaMode ? undefined : this.env.get('DB_USERNAME'),
|
||||||
|
password: inReplicaMode ? undefined : this.env.get('DB_PASSWORD'),
|
||||||
|
database: inReplicaMode ? undefined : this.env.get('DB_DATABASE'),
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = new DataSource(mySQLDataSourceOptions)
|
||||||
|
} else {
|
||||||
|
const sqliteDataSourceOptions: SqliteConnectionOptions = {
|
||||||
|
...commonDataSourceOptions,
|
||||||
|
type: 'sqlite',
|
||||||
|
database: `data/${this.env.get('DB_DATABASE')}.sqlite`,
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = new DataSource(sqliteDataSourceOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.dataSource.initialize()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let dataSource: DataSource
|
|
||||||
if (isConfiguredForMySQL) {
|
|
||||||
const inReplicaMode = env.get('DB_REPLICA_HOST', true) ? true : false
|
|
||||||
|
|
||||||
const replicationConfig = {
|
|
||||||
master: {
|
|
||||||
host: env.get('DB_HOST'),
|
|
||||||
port: parseInt(env.get('DB_PORT')),
|
|
||||||
username: env.get('DB_USERNAME'),
|
|
||||||
password: env.get('DB_PASSWORD'),
|
|
||||||
database: env.get('DB_DATABASE'),
|
|
||||||
},
|
|
||||||
slaves: [
|
|
||||||
{
|
|
||||||
host: env.get('DB_REPLICA_HOST', true),
|
|
||||||
port: parseInt(env.get('DB_PORT')),
|
|
||||||
username: env.get('DB_USERNAME'),
|
|
||||||
password: env.get('DB_PASSWORD'),
|
|
||||||
database: env.get('DB_DATABASE'),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
removeNodeErrorCount: 10,
|
|
||||||
restoreNodeTimeout: 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
const mySQLDataSourceOptions: MysqlConnectionOptions = {
|
|
||||||
...commonDataSourceOptions,
|
|
||||||
type: 'mysql',
|
|
||||||
charset: 'utf8mb4',
|
|
||||||
supportBigNumbers: true,
|
|
||||||
bigNumberStrings: false,
|
|
||||||
replication: inReplicaMode ? replicationConfig : undefined,
|
|
||||||
host: inReplicaMode ? undefined : env.get('DB_HOST'),
|
|
||||||
port: inReplicaMode ? undefined : parseInt(env.get('DB_PORT')),
|
|
||||||
username: inReplicaMode ? undefined : env.get('DB_USERNAME'),
|
|
||||||
password: inReplicaMode ? undefined : env.get('DB_PASSWORD'),
|
|
||||||
database: inReplicaMode ? undefined : env.get('DB_DATABASE'),
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSource = new DataSource(mySQLDataSourceOptions)
|
|
||||||
} else {
|
|
||||||
const sqliteDataSourceOptions: SqliteConnectionOptions = {
|
|
||||||
...commonDataSourceOptions,
|
|
||||||
type: 'sqlite',
|
|
||||||
database: `data/${env.get('DB_DATABASE')}.sqlite`,
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSource = new DataSource(sqliteDataSourceOptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const AppDataSource = dataSource
|
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
ControllerContainerInterface,
|
ControllerContainerInterface,
|
||||||
|
ServiceConfiguration,
|
||||||
ServiceContainerInterface,
|
ServiceContainerInterface,
|
||||||
ServiceIdentifier,
|
ServiceIdentifier,
|
||||||
ServiceInterface,
|
ServiceInterface,
|
||||||
@@ -7,11 +8,8 @@ import {
|
|||||||
|
|
||||||
import { ContainerConfigLoader } from './Container'
|
import { ContainerConfigLoader } from './Container'
|
||||||
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
||||||
import { Transform } from 'stream'
|
|
||||||
|
|
||||||
export class Service implements ServiceInterface {
|
export class Service implements ServiceInterface {
|
||||||
private logger: Transform | undefined
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private serviceContainer: ServiceContainerInterface,
|
private serviceContainer: ServiceContainerInterface,
|
||||||
private controllerContainer: ControllerContainerInterface,
|
private controllerContainer: ControllerContainerInterface,
|
||||||
@@ -20,10 +18,6 @@ export class Service implements ServiceInterface {
|
|||||||
this.serviceContainer.register(this.getId(), this)
|
this.serviceContainer.register(this.getId(), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
setLogger(logger: Transform): void {
|
|
||||||
this.logger = logger
|
|
||||||
}
|
|
||||||
|
|
||||||
async handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown> {
|
async handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown> {
|
||||||
const method = this.controllerContainer.get(endpointOrMethodIdentifier)
|
const method = this.controllerContainer.get(endpointOrMethodIdentifier)
|
||||||
|
|
||||||
@@ -34,13 +28,14 @@ export class Service implements ServiceInterface {
|
|||||||
return method(request, response)
|
return method(request, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getContainer(): Promise<unknown> {
|
async getContainer(configuration?: ServiceConfiguration): Promise<unknown> {
|
||||||
const config = new ContainerConfigLoader()
|
const config = new ContainerConfigLoader()
|
||||||
|
|
||||||
return config.load({
|
return config.load({
|
||||||
controllerConatiner: this.controllerContainer,
|
controllerConatiner: this.controllerContainer,
|
||||||
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
||||||
logger: this.logger,
|
logger: configuration?.logger,
|
||||||
|
environmentOverrides: configuration?.environmentOverrides,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.20.1](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.20.0...@standardnotes/scheduler-server@1.20.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
# [1.20.0](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.19.6...@standardnotes/scheduler-server@1.20.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.19.6](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.19.5...@standardnotes/scheduler-server@1.19.6) (2023-06-01)
|
## [1.19.6](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.19.5...@standardnotes/scheduler-server@1.19.6) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/scheduler-server",
|
"name": "@standardnotes/scheduler-server",
|
||||||
"version": "1.19.6",
|
"version": "1.20.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -66,9 +66,9 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.21.8](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.21.7...@standardnotes/settings@1.21.8) (2023-06-02)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/settings
|
||||||
|
|
||||||
## [1.21.7](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.21.6...@standardnotes/settings@1.21.7) (2023-05-31)
|
## [1.21.7](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.21.6...@standardnotes/settings@1.21.7) (2023-05-31)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/settings
|
**Note:** Version bump only for package @standardnotes/settings
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/settings",
|
"name": "@standardnotes/settings",
|
||||||
"version": "1.21.7",
|
"version": "1.21.8",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,6 +3,24 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.42.2](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.42.1...@standardnotes/syncing-server@1.42.2) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/syncing-server-js/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
## [1.42.1](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.42.0...@standardnotes/syncing-server@1.42.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* initializing data source with already configured environment ([624b574](https://github.com/standardnotes/syncing-server-js/commit/624b574013157e9e044d4a8ed53cadb7fcc567ae))
|
||||||
|
|
||||||
|
# [1.42.0](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.41.4...@standardnotes/syncing-server@1.42.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/syncing-server-js/issues/621)) ([f0cbec0](https://github.com/standardnotes/syncing-server-js/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.41.4](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.41.3...@standardnotes/syncing-server@1.41.4) (2023-06-01)
|
## [1.41.4](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.41.3...@standardnotes/syncing-server@1.41.4) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/syncing-server",
|
"name": "@standardnotes/syncing-server",
|
||||||
"version": "1.41.4",
|
"version": "1.42.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -83,18 +83,20 @@ export class ContainerConfigLoader {
|
|||||||
controllerConatiner?: ControllerContainerInterface
|
controllerConatiner?: ControllerContainerInterface
|
||||||
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
directCallDomainEventPublisher?: DirectCallDomainEventPublisher
|
||||||
logger?: Transform
|
logger?: Transform
|
||||||
|
environmentOverrides?: { [name: string]: string }
|
||||||
}): Promise<Container> {
|
}): Promise<Container> {
|
||||||
const directCallDomainEventPublisher =
|
const directCallDomainEventPublisher =
|
||||||
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
|
||||||
|
|
||||||
const env: Env = new Env()
|
const env: Env = new Env(configuration?.environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
const container = new Container({
|
const container = new Container({
|
||||||
defaultScope: 'Singleton',
|
defaultScope: 'Singleton',
|
||||||
})
|
})
|
||||||
|
|
||||||
await AppDataSource.initialize()
|
const appDataSource = new AppDataSource(env)
|
||||||
|
await appDataSource.initialize()
|
||||||
|
|
||||||
const isConfiguredForHomeServer = env.get('DB_TYPE') === 'sqlite'
|
const isConfiguredForHomeServer = env.get('DB_TYPE') === 'sqlite'
|
||||||
|
|
||||||
@@ -113,9 +115,9 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
defaultMeta: { service: 'syncing-server' },
|
defaultMeta: { service: 'syncing-server' },
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -205,7 +207,7 @@ export class ContainerConfigLoader {
|
|||||||
// ORM
|
// ORM
|
||||||
container
|
container
|
||||||
.bind<Repository<Item>>(TYPES.Sync_ORMItemRepository)
|
.bind<Repository<Item>>(TYPES.Sync_ORMItemRepository)
|
||||||
.toDynamicValue(() => AppDataSource.getRepository(Item))
|
.toDynamicValue(() => appDataSource.getRepository(Item))
|
||||||
|
|
||||||
// Projectors
|
// Projectors
|
||||||
container
|
container
|
||||||
|
|||||||
@@ -1,74 +1,88 @@
|
|||||||
import { DataSource, LoggerOptions } from 'typeorm'
|
import { DataSource, EntityTarget, LoggerOptions, ObjectLiteral, Repository } from 'typeorm'
|
||||||
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'
|
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'
|
||||||
import { Item } from '../Domain/Item/Item'
|
import { Item } from '../Domain/Item/Item'
|
||||||
import { Env } from './Env'
|
import { Env } from './Env'
|
||||||
import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'
|
import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'
|
||||||
|
|
||||||
const env: Env = new Env()
|
export class AppDataSource {
|
||||||
env.load()
|
private dataSource: DataSource | undefined
|
||||||
|
|
||||||
const isConfiguredForMySQL = env.get('DB_TYPE') === 'mysql'
|
constructor(private env: Env) {}
|
||||||
|
|
||||||
const maxQueryExecutionTime = env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
getRepository<Entity extends ObjectLiteral>(target: EntityTarget<Entity>): Repository<Entity> {
|
||||||
? +env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
if (!this.dataSource) {
|
||||||
: 45_000
|
throw new Error('DataSource not initialized')
|
||||||
|
}
|
||||||
|
|
||||||
const commonDataSourceOptions = {
|
return this.dataSource.getRepository(target)
|
||||||
maxQueryExecutionTime,
|
}
|
||||||
entities: [Item],
|
|
||||||
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
async initialize(): Promise<void> {
|
||||||
migrationsRun: true,
|
this.env.load()
|
||||||
logging: <LoggerOptions>env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
|
||||||
|
const isConfiguredForMySQL = this.env.get('DB_TYPE') === 'mysql'
|
||||||
|
|
||||||
|
const maxQueryExecutionTime = this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||||
|
? +this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||||
|
: 45_000
|
||||||
|
|
||||||
|
const commonDataSourceOptions = {
|
||||||
|
maxQueryExecutionTime,
|
||||||
|
entities: [Item],
|
||||||
|
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
||||||
|
migrationsRun: true,
|
||||||
|
logging: <LoggerOptions>this.env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isConfiguredForMySQL) {
|
||||||
|
const inReplicaMode = this.env.get('DB_REPLICA_HOST', true) ? true : false
|
||||||
|
|
||||||
|
const replicationConfig = {
|
||||||
|
master: {
|
||||||
|
host: this.env.get('DB_HOST'),
|
||||||
|
port: parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: this.env.get('DB_USERNAME'),
|
||||||
|
password: this.env.get('DB_PASSWORD'),
|
||||||
|
database: this.env.get('DB_DATABASE'),
|
||||||
|
},
|
||||||
|
slaves: [
|
||||||
|
{
|
||||||
|
host: this.env.get('DB_REPLICA_HOST', true),
|
||||||
|
port: parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: this.env.get('DB_USERNAME'),
|
||||||
|
password: this.env.get('DB_PASSWORD'),
|
||||||
|
database: this.env.get('DB_DATABASE'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
removeNodeErrorCount: 10,
|
||||||
|
restoreNodeTimeout: 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
const mySQLDataSourceOptions: MysqlConnectionOptions = {
|
||||||
|
...commonDataSourceOptions,
|
||||||
|
type: 'mysql',
|
||||||
|
charset: 'utf8mb4',
|
||||||
|
supportBigNumbers: true,
|
||||||
|
bigNumberStrings: false,
|
||||||
|
replication: inReplicaMode ? replicationConfig : undefined,
|
||||||
|
host: inReplicaMode ? undefined : this.env.get('DB_HOST'),
|
||||||
|
port: inReplicaMode ? undefined : parseInt(this.env.get('DB_PORT')),
|
||||||
|
username: inReplicaMode ? undefined : this.env.get('DB_USERNAME'),
|
||||||
|
password: inReplicaMode ? undefined : this.env.get('DB_PASSWORD'),
|
||||||
|
database: inReplicaMode ? undefined : this.env.get('DB_DATABASE'),
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = new DataSource(mySQLDataSourceOptions)
|
||||||
|
} else {
|
||||||
|
const sqliteDataSourceOptions: SqliteConnectionOptions = {
|
||||||
|
...commonDataSourceOptions,
|
||||||
|
type: 'sqlite',
|
||||||
|
database: `data/${this.env.get('DB_DATABASE')}.sqlite`,
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = new DataSource(sqliteDataSourceOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.dataSource.initialize()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let dataSource: DataSource
|
|
||||||
if (isConfiguredForMySQL) {
|
|
||||||
const inReplicaMode = env.get('DB_REPLICA_HOST', true) ? true : false
|
|
||||||
|
|
||||||
const replicationConfig = {
|
|
||||||
master: {
|
|
||||||
host: env.get('DB_HOST'),
|
|
||||||
port: parseInt(env.get('DB_PORT')),
|
|
||||||
username: env.get('DB_USERNAME'),
|
|
||||||
password: env.get('DB_PASSWORD'),
|
|
||||||
database: env.get('DB_DATABASE'),
|
|
||||||
},
|
|
||||||
slaves: [
|
|
||||||
{
|
|
||||||
host: env.get('DB_REPLICA_HOST', true),
|
|
||||||
port: parseInt(env.get('DB_PORT')),
|
|
||||||
username: env.get('DB_USERNAME'),
|
|
||||||
password: env.get('DB_PASSWORD'),
|
|
||||||
database: env.get('DB_DATABASE'),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
removeNodeErrorCount: 10,
|
|
||||||
restoreNodeTimeout: 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
const mySQLDataSourceOptions: MysqlConnectionOptions = {
|
|
||||||
...commonDataSourceOptions,
|
|
||||||
type: 'mysql',
|
|
||||||
charset: 'utf8mb4',
|
|
||||||
supportBigNumbers: true,
|
|
||||||
bigNumberStrings: false,
|
|
||||||
replication: inReplicaMode ? replicationConfig : undefined,
|
|
||||||
host: inReplicaMode ? undefined : env.get('DB_HOST'),
|
|
||||||
port: inReplicaMode ? undefined : parseInt(env.get('DB_PORT')),
|
|
||||||
username: inReplicaMode ? undefined : env.get('DB_USERNAME'),
|
|
||||||
password: inReplicaMode ? undefined : env.get('DB_PASSWORD'),
|
|
||||||
database: inReplicaMode ? undefined : env.get('DB_DATABASE'),
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSource = new DataSource(mySQLDataSourceOptions)
|
|
||||||
} else {
|
|
||||||
const sqliteDataSourceOptions: SqliteConnectionOptions = {
|
|
||||||
...commonDataSourceOptions,
|
|
||||||
type: 'sqlite',
|
|
||||||
database: `data/${env.get('DB_DATABASE')}.sqlite`,
|
|
||||||
}
|
|
||||||
|
|
||||||
dataSource = new DataSource(sqliteDataSourceOptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const AppDataSource = dataSource
|
|
||||||
|
|||||||
@@ -1,22 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
|
|
||||||
export class Env {
|
export class Env extends AbstractEnv {
|
||||||
private env?: DotenvParseOutput
|
load(): void {
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
ControllerContainerInterface,
|
ControllerContainerInterface,
|
||||||
|
ServiceConfiguration,
|
||||||
ServiceContainerInterface,
|
ServiceContainerInterface,
|
||||||
ServiceIdentifier,
|
ServiceIdentifier,
|
||||||
ServiceInterface,
|
ServiceInterface,
|
||||||
@@ -7,11 +8,8 @@ import {
|
|||||||
|
|
||||||
import { ContainerConfigLoader } from './Container'
|
import { ContainerConfigLoader } from './Container'
|
||||||
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
import { DirectCallDomainEventPublisher } from '@standardnotes/domain-events-infra'
|
||||||
import { Transform } from 'stream'
|
|
||||||
|
|
||||||
export class Service implements ServiceInterface {
|
export class Service implements ServiceInterface {
|
||||||
private logger: Transform | undefined
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private serviceContainer: ServiceContainerInterface,
|
private serviceContainer: ServiceContainerInterface,
|
||||||
private controllerContainer: ControllerContainerInterface,
|
private controllerContainer: ControllerContainerInterface,
|
||||||
@@ -20,10 +18,6 @@ export class Service implements ServiceInterface {
|
|||||||
this.serviceContainer.register(this.getId(), this)
|
this.serviceContainer.register(this.getId(), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
setLogger(logger: Transform): void {
|
|
||||||
this.logger = logger
|
|
||||||
}
|
|
||||||
|
|
||||||
async handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown> {
|
async handleRequest(request: never, response: never, endpointOrMethodIdentifier: string): Promise<unknown> {
|
||||||
const method = this.controllerContainer.get(endpointOrMethodIdentifier)
|
const method = this.controllerContainer.get(endpointOrMethodIdentifier)
|
||||||
|
|
||||||
@@ -34,13 +28,14 @@ export class Service implements ServiceInterface {
|
|||||||
return method(request, response)
|
return method(request, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getContainer(): Promise<unknown> {
|
async getContainer(configuration?: ServiceConfiguration): Promise<unknown> {
|
||||||
const config = new ContainerConfigLoader()
|
const config = new ContainerConfigLoader()
|
||||||
|
|
||||||
return config.load({
|
return config.load({
|
||||||
controllerConatiner: this.controllerContainer,
|
controllerConatiner: this.controllerContainer,
|
||||||
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
directCallDomainEventPublisher: this.directCallDomainEventPublisher,
|
||||||
logger: this.logger,
|
logger: configuration?.logger,
|
||||||
|
environmentOverrides: configuration?.environmentOverrides,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.9.1](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.9.0...@standardnotes/websockets-server@1.9.1) (2023-06-02)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **home-server:** streaming logs ([a8b806a](https://github.com/standardnotes/server/commit/a8b806af084b3e3fe8707ff0cb041a74042ee049))
|
||||||
|
|
||||||
|
# [1.9.0](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.8.6...@standardnotes/websockets-server@1.9.0) (2023-06-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **home-server:** add overriding environment variables in underlying services ([#621](https://github.com/standardnotes/server/issues/621)) ([f0cbec0](https://github.com/standardnotes/server/commit/f0cbec07b87d60dfad92072944553f76e0bea164))
|
||||||
|
|
||||||
## [1.8.6](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.8.5...@standardnotes/websockets-server@1.8.6) (2023-06-01)
|
## [1.8.6](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.8.5...@standardnotes/websockets-server@1.8.6) (2023-06-01)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/websockets-server",
|
"name": "@standardnotes/websockets-server",
|
||||||
"version": "1.8.6",
|
"version": "1.9.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <21.0.0"
|
"node": ">=18.0.0 <21.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -66,9 +66,9 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL', true) || 'info',
|
||||||
format: winston.format.combine(...winstonFormatters),
|
format: winston.format.combine(...winstonFormatters),
|
||||||
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
|
transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
|
||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,9 @@
|
|||||||
|
import { AbstractEnv } from '@standardnotes/domain-core'
|
||||||
import { config, DotenvParseOutput } from 'dotenv'
|
import { config, DotenvParseOutput } from 'dotenv'
|
||||||
import { injectable } from 'inversify'
|
|
||||||
|
|
||||||
@injectable()
|
export class Env extends AbstractEnv {
|
||||||
export class Env {
|
load(): void {
|
||||||
private env?: DotenvParseOutput
|
|
||||||
|
|
||||||
public load(): void {
|
|
||||||
const output = config()
|
const output = config()
|
||||||
this.env = <DotenvParseOutput>output.parsed
|
this.env = <DotenvParseOutput>output.parsed
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string, optional = false): string {
|
|
||||||
if (!this.env) {
|
|
||||||
this.load()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!process.env[key] && !optional) {
|
|
||||||
throw new Error(`Environment variable ${key} not set`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <string>process.env[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3706,6 +3706,7 @@ __metadata:
|
|||||||
resolution: "@standardnotes/event-store@workspace:packages/event-store"
|
resolution: "@standardnotes/event-store@workspace:packages/event-store"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@aws-sdk/client-sqs": "npm:^3.332.0"
|
"@aws-sdk/client-sqs": "npm:^3.332.0"
|
||||||
|
"@standardnotes/domain-core": "workspace:^"
|
||||||
"@standardnotes/domain-events": "workspace:*"
|
"@standardnotes/domain-events": "workspace:*"
|
||||||
"@standardnotes/domain-events-infra": "workspace:*"
|
"@standardnotes/domain-events-infra": "workspace:*"
|
||||||
"@standardnotes/time": "workspace:*"
|
"@standardnotes/time": "workspace:*"
|
||||||
|
|||||||
Reference in New Issue
Block a user