Compare commits

...

14 Commits

Author SHA1 Message Date
c1311f493f 1.0.11 2024-05-11 12:33:15 +02:00
97cbe6e398 fix(core): update 2024-05-11 12:33:14 +02:00
0bb9c5e1e5 1.0.10 2024-05-11 12:29:04 +02:00
cf90560243 fix(core): update 2024-05-11 12:29:03 +02:00
8def86494a 1.0.9 2024-05-11 12:27:02 +02:00
db46e01f6e fix(core): update 2024-05-11 12:27:01 +02:00
7baf747972 1.0.8 2024-04-01 02:58:27 +02:00
4a17a1073e fix(core): update 2024-04-01 02:58:27 +02:00
8997ded81d 1.0.7 2024-03-19 18:37:25 +01:00
f177d8e9ab fix(core): update 2024-03-19 18:37:24 +01:00
808a9cc856 1.0.6 2024-02-16 20:47:25 +01:00
be1c8d1164 fix(core): update 2024-02-16 20:47:25 +01:00
2ecb2f3aa0 1.0.5 2024-02-16 20:42:26 +01:00
01dcdebda5 fix(core): update 2024-02-16 20:42:26 +01:00
26 changed files with 2511 additions and 1690 deletions

View File

@ -5,10 +5,32 @@
"githost": "gitlab.com",
"gitscope": "serve.zone",
"gitrepo": "platformservice",
"description": "contains the platformservice container with mail, sms, letter, ai services.",
"description": "A multifaceted platform service handling mail, SMS, letter delivery, and AI services.",
"npmPackagename": "@serve.zone/platformservice",
"license": "MIT",
"projectDomain": "serve.zone"
"projectDomain": "serve.zone",
"keywords": [
"mail service",
"SMS",
"letter delivery",
"AI services",
"SMTP server",
"mail parsing",
"DKIM",
"platform service",
"mailgun integration",
"letterXpress",
"OpenAI",
"Anthropic AI",
"DKIM signing",
"mail forwarding",
"SMTP TLS",
"domain management",
"email templating",
"rule management",
"SMTP STARTTLS",
"DNS management"
]
}
},
"npmci": {

View File

@ -1,7 +1,8 @@
{
"name": "@serve.zone/platformservice",
"version": "1.0.4",
"description": "contains the platformservice container with mail, sms, letter, ai services.",
"private": true,
"version": "1.0.11",
"description": "A multifaceted platform service handling mail, SMS, letter delivery, and AI services.",
"main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts",
"type": "module",
@ -9,22 +10,24 @@
"license": "MIT",
"scripts": {
"test": "(tstest test/)",
"start": "(node --max_old_space_size=100 ./cli.js)",
"start": "(node --max_old_space_size=250 ./cli.js)",
"startTs": "(node cli.ts.js)",
"build": "(tsbuild --web --allowimplicitany)"
"localPublish": ""
},
"devDependencies": {
"@git.zone/tsbuild": "^2.1.17",
"@git.zone/tsrun": "^1.2.8",
"@git.zone/tstest": "^1.0.28",
"@git.zone/tstest": "^1.0.88",
"@git.zone/tswatch": "^2.0.1",
"@push.rocks/tapbundle": "^5.0.3"
"@push.rocks/tapbundle": "^5.0.22"
},
"dependencies": {
"@api.global/typedrequest": "^3.0.4",
"@api.global/typedserver": "^3.0.20",
"@anthropic-ai/sdk": "^0.18.0",
"@api.global/typedrequest": "^3.0.19",
"@api.global/typedserver": "^3.0.27",
"@api.global/typedsocket": "^3.0.0",
"@apiclient.xyz/cloudflare": "^6.0.3",
"@apiclient.xyz/letterxpress": "^1.0.17",
"@push.rocks/projectinfo": "^5.0.1",
"@push.rocks/qenv": "^6.0.5",
"@push.rocks/smartdata": "^5.0.7",
@ -36,10 +39,33 @@
"@push.rocks/smartrequest": "^2.0.21",
"@push.rocks/smartrx": "^3.0.7",
"@push.rocks/smartstate": "^2.0.0",
"@serve.zone/interfaces": "^1.0.34",
"@tsclass/tsclass": "^4.0.51",
"@serve.zone/interfaces": "^1.0.47",
"@tsclass/tsclass": "^4.0.52",
"mailauth": "^4.6.5",
"mailparser": "^3.6.7",
"mailparser": "^3.6.9",
"openai": "^4.29.2",
"uuid": "^9.0.1"
}
},
"keywords": [
"mail service",
"SMS",
"letter delivery",
"AI services",
"SMTP server",
"mail parsing",
"DKIM",
"platform service",
"mailgun integration",
"letterXpress",
"OpenAI",
"Anthropic AI",
"DKIM signing",
"mail forwarding",
"SMTP TLS",
"domain management",
"email templating",
"rule management",
"SMTP STARTTLS",
"DNS management"
]
}

3656
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

0
readme.hints.md Normal file
View File

141
readme.md
View File

@ -1,31 +1,126 @@
# @serve.zone/platformservice
contains the platformservice container with mail, sms, letter, ai services.
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@serve.zone/platformservice)
* [gitlab.com (source)](https://gitlab.com/serve.zone/platformservice)
* [github.com (source mirror)](https://github.com/serve.zone/platformservice)
* [docs (typedoc)](https://serve.zone.gitlab.io/platformservice/)
## Install
## Status for master
To install `@serve.zone/platformservice`, run the following command:
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/serve.zone/platformservice/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/serve.zone/platformservice/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@serve.zone/platformservice)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/serve.zone/platformservice)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@serve.zone/platformservice)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@serve.zone/platformservice)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@serve.zone/platformservice)](https://lossless.cloud)
```sh
npm install @serve.zone/platformservice --save
```
Make sure you have Node.js and npm installed on your system to use this package.
## Usage
Use TypeScript for best in class intellisense.
For further information read the linked docs at the top of this readme.
## Legal
> MIT licensed | **©** [Task Venture Capital GmbH](https://task.vc)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
This document provides extensive usage scenarios for the `@serve.zone/platformservice`, a comprehensive ESM module written in TypeScript offering a wide range of services such as mail, SMS, letter, and artificial intelligence (AI) functionalities. This service is an exemplar of a modular design, allowing users to leverage various communication methods and AI services efficiently. Key features provided by this platform include sending and receiving emails, managing SMS services, letter dispatching, and utilizing AI for diverse purposes.
### Prerequisites
Before diving into the examples, ensure you have the platform service installed and configured correctly. The package leverages environment variables for configuration, so you must set up the necessary variables, including service endpoints, authentication tokens, and database connections.
### Initialization
First, initialize the platform service, ensuring all dependencies are correctly loaded and configured:
```ts
import { SzPlatformService } from '@serve.zone/platformservice';
async function initService() {
const platformService = new SzPlatformService();
await platformService.start();
console.log('Platform service initialized successfully.');
}
initService();
```
### Sending Emails
One of the primary services offered is email management. Here's how to send an email using the platform service:
```ts
import { EmailService, IEmailOptions } from '@serve.zone/platformservice';
async function sendEmail() {
const emailOptions: IEmailOptions = {
from: 'no-reply@example.com',
to: 'recipient@example.com',
subject: 'Test Email',
body: '<h1>This is a test email</h1>',
};
const emailService = new EmailService('MAILGUN_API_KEY'); // Replace with your real API key
await emailService.sendEmail(emailOptions);
console.log('Email sent successfully.');
}
sendEmail();
```
### Managing SMS
Similar to email, the platform also facilitates SMS sending:
```ts
import { SmsService, ISmsConstructorOptions } from '@serve.zone/platformservice';
async function sendSms() {
const smsOptions: ISmsConstructorOptions = {
apiGatewayApiToken: 'SMS_API_TOKEN', // Replace with your real token
};
const smsService = new SmsService(smsOptions);
await smsService.sendSms(1234567890, 'SENDER_NAME', 'This is a test SMS.');
console.log('SMS sent successfully.');
}
sendSms();
```
### Dispatching Letters
For physical mail correspondence, the platform provides a letter service:
```ts
import { LetterService, ILetterConstructorOptions } from '@serve.zone/platformservice';
async function sendLetter() {
const letterOptions: ILetterConstructorOptions = {
letterxpressUser: 'USER',
letterxpressToken: 'TOKEN',
};
const letterService = new LetterService(letterOptions);
await letterService.sendLetter('This is a test letter body.', {address: 'Recipient Address', name: 'Recipient Name'});
console.log('Letter dispatched successfully.');
}
sendLetter();
```
### Leveraging AI Services
The platform also integrates AI functionalities, allowing for innovative use cases like generating content, analyzing text, or automating responses:
```ts
import { AiService } from '@serve.zone/platformservice';
async function useAiService() {
const aiService = new AiService('OPENAI_API_KEY'); // Replace with your real API key
const response = await aiService.generateText('Prompt for the AI service.');
console.log(`AI response: ${response}`);
}
useAiService();
```
### Conclusion
The `@serve.zone/platformservice` offers a robust set of features for modern application requirements, including but not limited to communication and AI services. By following the examples above, developers can integrate these services into their applications, harnessing the power of email, SMS, letters, and artificial intelligence seamlessly.
undefined

5
test/test.ts Normal file
View File

@ -0,0 +1,5 @@
import { tap, expect } from '@push.rocks/tapbundle';
tap.test('should create a platform service', async () => {});
tap.start();

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@serve.zone/platformservice',
version: '1.0.4',
description: 'contains the platformservice container with mail, sms, letter, ai services.'
version: '1.0.11',
description: 'A multifaceted platform service handling mail, SMS, letter delivery, and AI services.'
}

View File

@ -0,0 +1,50 @@
import * as plugins from './aibridge.plugins.js';
import * as paths from './aibridge.paths.js';
import { AiBridgeDb } from './aibridge.classes.aibridgedb.js';
import { OpenAiBridge } from './aibridge.classes.openaibridge.js';
export class AiBridge {
public projectinfo: plugins.projectinfo.ProjectInfo;
public serverInstance: plugins.loleServiceserver.ServiceServer;
public serviceQenv = new plugins.qenv.Qenv('./', './.nogit');
public aibridgeDb: AiBridgeDb;
public openAiBridge: OpenAiBridge;
public typedrouter = new plugins.typedrequest.TypedRouter();
public async start() {
this.aibridgeDb = new AiBridgeDb(this);
await this.aibridgeDb.start();
this.projectinfo = new plugins.projectinfo.ProjectInfo(paths.packageDir);
this.openAiBridge = new OpenAiBridge(this);
await this.openAiBridge.start();
// server
this.serverInstance = new plugins.loleServiceserver.ServiceServer({
serviceDomain: 'aibridge.lossless.one',
serviceName: 'aibridge',
serviceVersion: this.projectinfo.npm.version,
addCustomRoutes: async (serverArg) => {
// any custom route configs go here
},
});
// lets implemenet the actual typedrequest functions
this.typedrouter.addTypedHandler<plugins.lointAiBridge.requests.IReq_Chat>(new plugins.typedrequest.TypedHandler('chat', async reqArg => {
const resultChat = await this.openAiBridge.chat(reqArg.chat.systemMessage, reqArg.chat.messages[reqArg.chat.messages.length - 1].content, reqArg.chat.messages);
return {
chat: reqArg.chat,
latestMessage: resultChat.message.content,
}
}))
await this.serverInstance.start();
this.serverInstance.typedServer.typedrouter.addTypedRouter(this.typedrouter);
}
public async stop() {
await this.serverInstance.stop();
await this.aibridgeDb.stop();
}
}

View File

@ -0,0 +1,25 @@
import * as plugins from './aibridge.plugins.js';
import { AiBridge } from './aibridge.classes.aibridge.js';
export class AiBridgeDb {
public smartdataDb: plugins.smartdata.SmartdataDb;
public aibridgeRef: AiBridge;
constructor(aibridgeRefArg: AiBridge) {
this.aibridgeRef = aibridgeRefArg;
}
public async start() {
this.smartdataDb = new plugins.smartdata.SmartdataDb({
mongoDbUser: await this.aibridgeRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_USER'),
mongoDbName: await this.aibridgeRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_NAME'),
mongoDbPass: await this.aibridgeRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_PASS'),
mongoDbUrl: await this.aibridgeRef.serviceQenv.getEnvVarOnDemand('MONGO_DB_URL'),
});
await this.smartdataDb.init();
}
public async stop() {
await this.smartdataDb.close();
}
}

View File

@ -0,0 +1,58 @@
import { AiBridge } from './aibridge.classes.aibridge.js';
import * as plugins from './aibridge.plugins.js';
import * as paths from './aibridge.paths.js';
export class OpenAiBridge {
public aiBridgeRef: AiBridge;
public openAiApiClient: plugins.openai.default;
constructor(aiBridgeRefArg: AiBridge) {
this.aiBridgeRef = aiBridgeRefArg;
}
public async start() {
const openAiToken = await this.aiBridgeRef.serviceQenv.getEnvVarOnDemand('OPENAI_TOKEN');
this.openAiApiClient = new plugins.openai.default({
apiKey: openAiToken,
dangerouslyAllowBrowser: true,
});
}
public async stop() {}
public async chat(
systemMessage: string,
userMessage: string,
messageHistory: {
role: 'assistant' | 'user';
content: string;
}[]
) {
const result = await this.openAiApiClient.chat.completions.create({
model: 'gpt-4-turbo-preview',
messages: [
{ role: 'system', content: systemMessage },
...messageHistory,
{ role: 'user', content: userMessage },
],
});
return {
message: result.choices[0].message,
};
}
public async audio(messageArg: string) {
const done = plugins.smartpromise.defer();
const result = await this.openAiApiClient.audio.speech.create({
model: 'tts-1-hd',
input: messageArg,
voice: 'nova',
response_format: 'mp3',
speed: 1,
});
const stream = result.body.pipe(plugins.smartfile.fsStream.createWriteStream(plugins.path.join(paths.nogitDir, 'output.mp3')));
stream.on('finish', () => {
done.resolve();
});
return done.promise;
}
}

View File

@ -0,0 +1,16 @@
import * as plugins from './aibridge.plugins.js';
export const packageDir = plugins.path.join(
plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
'../'
);
export const assetsDir = plugins.path.join(
packageDir,
'./assets/'
);
export const nogitDir = plugins.path.join(
packageDir,
'./.nogit/'
);

View File

@ -0,0 +1,32 @@
// node native
import * as path from 'path';
export { path };
// @losslessone_private scope
import * as loleServiceserver from '@losslessone_private/lole-serviceserver';
import * as lointAiBridge from '@losslessone_private/loint-aibridge';
export { loleServiceserver, lointAiBridge };
// apiglobal scope
import * as typedrequest from '@api.global/typedrequest';
export {
typedrequest,
}
// pushrocks scope
import * as projectinfo from '@push.rocks/projectinfo';
import * as qenv from '@push.rocks/qenv';
import * as smartdata from '@push.rocks/smartdata';
import * as smartfile from '@push.rocks/smartfile';
import * as smartpath from '@push.rocks/smartpath';
import * as smartpromise from '@push.rocks/smartpromise';
export { projectinfo, qenv, smartdata, smartfile, smartpath, smartpromise };
// thirdparty scope
import * as antrophic from '@anthropic-ai/sdk';
import * as openai from 'openai';
export { antrophic as anthropic, openai };

17
ts/aibridge/index.ts Normal file
View File

@ -0,0 +1,17 @@
import { AiBridge } from './aibridge.classes.aibridge.js';
export {
AiBridge,
}
let aibridgeInstance: AiBridge;
export const runCli = async () => {
aibridgeInstance = new AiBridge();
await aibridgeInstance.start();
};
export const stop = async () => {
if (aibridgeInstance) {
await aibridgeInstance.stop();
}
};

View File

@ -1,6 +1,10 @@
import * as plugins from './plugins.js';
import * as paths from './paths.js';
import { PlatformServiceDb } from './classes.platformservicedb.js'
import { EmailService } from './email/email.classes.emailservice.js';
import { SmsService } from './sms/smsservice.js';
import { LetterService } from './letter/classes.letterservice.js';
import { MtaService } from './mta/mta.classes.mta.js';
export class SzPlatformService {
public projectinfo: plugins.projectinfo.ProjectInfo;
@ -10,9 +14,28 @@ export class SzPlatformService {
public typedserver: plugins.typedserver.TypedServer;
public typedrouter = new plugins.typedrequest.TypedRouter();
// SubServices
public emailService: EmailService;
public letterService: LetterService;
public mtaService: MtaService;
public smsService: SmsService;
public async start() {
this.platformserviceDb = new PlatformServiceDb(this);
this.projectinfo = new plugins.projectinfo.ProjectInfo(paths.packageDir);
// lets start the sub services
this.emailService = new EmailService(this);
this.letterService = new LetterService(this, {
letterxpressUser: await this.serviceQenv.getEnvVarOnDemand('LETTER_API_USER'),
letterxpressToken: await this.serviceQenv.getEnvVarOnDemand('LETTER_API_TOKEN')
});
this.mtaService = new MtaService(this);
this.smsService = new SmsService(this, {
apiGatewayApiToken: await this.serviceQenv.getEnvVarOnDemand('SMS_API_TOKEN'),
});
// lets start the server finally
this.typedserver = new plugins.typedserver.TypedServer({
cors: true,
});

View File

@ -6,6 +6,11 @@ import { ApiManager } from './email.classes.apimanager.js';
import { logger } from '../logger.js';
import type { SzPlatformService } from '../classes.platformservice.js';
export interface IEmailConstructorOptions {
mailgunApiKey: string;
}
export class EmailService {
public platformServiceRef: SzPlatformService;

View File

@ -0,0 +1,41 @@
import type { SzPlatformService } from '../classes.platformservice.js';
import * as plugins from '../plugins.js';
export interface ILetterConstructorOptions {
letterxpressUser: string;
letterxpressToken: string;
}
export class LetterService {
public platformServiceRef: SzPlatformService;
public options: ILetterConstructorOptions;
public letterxpressAccount: plugins.letterxpress.LetterXpressAccount;
public typedrouter = new plugins.typedrequest.TypedRouter();
constructor(platformServiceRefArg: SzPlatformService, optionsArg: ILetterConstructorOptions) {
this.platformServiceRef = platformServiceRefArg;
this.options = optionsArg;
this.platformServiceRef.typedrouter.addTypedRouter(this.typedrouter);
this.typedrouter.addTypedHandler<
plugins.servezoneInterfaces.platformservice.letter.IRequest_SendLetter
>(new plugins.typedrequest.TypedHandler('sendLetter', async dataArg => {
if(dataArg.needsCover) {
}
return {
processId: '',
}
}));
}
public async start() {
this.letterxpressAccount = new plugins.letterxpress.LetterXpressAccount({
username: this.options.letterxpressUser,
apiKey: this.options.letterxpressToken,
});
await this.letterxpressAccount.start();
}
public async stop() {}
}

0
ts/letter/index.ts Normal file
View File

View File

@ -2,7 +2,7 @@ import * as plugins from '../plugins.js';
import * as paths from '../paths.js';
import { Email } from './mta.classes.email.js';
import type { MTA } from './mta.classes.mta.js';
import type { MtaService } from './mta.classes.mta.js';
const readFile = plugins.util.promisify(plugins.fs.readFile);
const writeFile = plugins.util.promisify(plugins.fs.writeFile);
@ -16,7 +16,7 @@ export interface IKeyPaths {
export class DKIMCreator {
private keysDir: string;
constructor(metaRef: MTA, keysDir = paths.keysDir) {
constructor(metaRef: MtaService, keysDir = paths.keysDir) {
this.keysDir = keysDir;
}

View File

@ -1,10 +1,10 @@
import * as plugins from '../plugins.js';
import { MTA } from './mta.classes.mta.js';
import { MtaService } from './mta.classes.mta.js';
class DKIMVerifier {
public mtaRef: MTA;
public mtaRef: MtaService;
constructor(mtaRefArg: MTA) {
constructor(mtaRefArg: MtaService) {
this.mtaRef = mtaRefArg;
}

View File

@ -1,10 +1,10 @@
import type { MTA } from './mta.classes.mta.js';
import type { MtaService } from './mta.classes.mta.js';
import * as plugins from '../plugins.js';
export class DNSManager {
public mtaRef: MTA;
public mtaRef: MtaService;
constructor(mtaRefArg: MTA) {
constructor(mtaRefArg: MtaService) {
this.mtaRef = mtaRefArg;
}
}

View File

@ -2,15 +2,15 @@ import * as plugins from '../plugins.js';
import * as paths from '../paths.js';
import { Email } from './mta.classes.email.js';
import { EmailSignJob } from './mta.classes.emailsignjob.js';
import type { MTA } from './mta.classes.mta.js';
import type { MtaService } from './mta.classes.mta.js';
export class EmailSendJob {
mtaRef: MTA;
mtaRef: MtaService;
private email: Email;
private socket: plugins.net.Socket | plugins.tls.TLSSocket = null;
private mxRecord: string = null;
constructor(mtaRef: MTA, emailArg: Email) {
constructor(mtaRef: MtaService, emailArg: Email) {
this.email = emailArg;
this.mtaRef = mtaRef;
}

View File

@ -1,5 +1,5 @@
import * as plugins from '../plugins.js';
import type { MTA } from './mta.classes.mta.js';
import type { MtaService } from './mta.classes.mta.js';
interface Headers {
[key: string]: string;
@ -13,10 +13,10 @@ interface IEmailSignJobOptions {
}
export class EmailSignJob {
mtaRef: MTA;
mtaRef: MtaService;
jobOptions: IEmailSignJobOptions;
constructor(mtaRefArg: MTA, options: IEmailSignJobOptions) {
constructor(mtaRefArg: MtaService, options: IEmailSignJobOptions) {
this.mtaRef = mtaRefArg;
this.jobOptions = options;
}

View File

@ -6,14 +6,17 @@ import { DKIMCreator } from './mta.classes.dkimcreator.js';
import { DKIMVerifier } from './mta.classes.dkimverifier.js';
import { SMTPServer } from './mta.classes.smtpserver.js';
import { DNSManager } from './mta.classes.dnsmanager.js';
import type { SzPlatformService } from '../classes.platformservice.js';
export class MTA {
export class MtaService {
public platformServiceRef: SzPlatformService;
public server: SMTPServer;
public dkimCreator: DKIMCreator;
public dkimVerifier: DKIMVerifier;
public dnsManager: DNSManager;
constructor() {
constructor(platformServiceRefArg: SzPlatformService) {
this.platformServiceRef = platformServiceRefArg;
this.dkimCreator = new DKIMCreator(this);
this.dkimVerifier = new DKIMVerifier(this);
this.dnsManager = new DNSManager(this);

View File

@ -1,7 +1,7 @@
import * as plugins from '../plugins.js';
import * as paths from '../paths.js';
import { Email } from './mta.classes.email.js';
import type { MTA } from './mta.classes.mta.js';
import type { MtaService } from './mta.classes.mta.js';
export interface ISmtpServerOptions {
port: number;
@ -10,12 +10,12 @@ export interface ISmtpServerOptions {
}
export class SMTPServer {
public mtaRef: MTA;
public mtaRef: MtaService;
private smtpServerOptions: ISmtpServerOptions;
private server: plugins.net.Server;
private emailBufferStringMap: Map<plugins.net.Socket, string>;
constructor(mtaRefArg: MTA, optionsArg: ISmtpServerOptions) {
constructor(mtaRefArg: MtaService, optionsArg: ISmtpServerOptions) {
console.log('SMTPServer instance is being created...');
this.mtaRef = mtaRefArg;

View File

@ -49,6 +49,13 @@ import * as smartrx from '@push.rocks/smartrx';
export { projectinfo, qenv, smartdata, smartfile, smartlog, smartmail, smartpath, smartpromise, smartrequest, smartrx };
// apiclient.xyz scope
import * as letterxpress from '@apiclient.xyz/letterxpress';
export {
letterxpress,
}
// tsclass scope
import * as tsclass from '@tsclass/tsclass';

View File

@ -4,7 +4,7 @@ import { logger } from '../logger.js';
import type { SzPlatformService } from '../classes.platformservice.js';
export interface ISmsConstructorOptions {
apiToken: string;
apiGatewayApiToken: string;
}
export class SmsService {
@ -63,7 +63,7 @@ export class SmsService {
method: 'POST',
requestBody: JSON.stringify(payload),
headers: {
Authorization: `Basic ${Buffer.from(`${this.options.apiToken}:`).toString('base64')}`,
Authorization: `Basic ${Buffer.from(`${this.options.apiGatewayApiToken}:`).toString('base64')}`,
'Content-Type': 'application/json',
},
});