@rws-framework/client
Version:
This package provides the core client-side framework for Realtime Web Suit (RWS), enabling modular, asynchronous web components, state management, and integration with backend services. It is located in `.dev/client`.
189 lines (142 loc) • 5.46 kB
Markdown
add functionality without writing too much code. Target of the functionality is to run with one config line per plugin.
1. [TS work part](
2. [JS build plugin part](
3. [Adding plugin to TS](
4. [Adding plugin to build order](
5. [Examples](
***Currently there are separate frontend and build plugin parts. To be included in .rws.json***
**src/plugin.ts**
```typescript
import { RWSClient, RWSClientInstance, RWSPlugin, DefaultRWSPluginOptionsType, NotifyService, NotifyServiceInstance, ConfigService, ConfigServiceInstance } from '@rws-framework/client';
import WSService, { WSServiceInstance, WSEvent, WSStatus } from './services/WSService';
WSService;
interface WSOptions extends DefaultRWSPluginOptionsType {
}
class RWSWebsocketsPlugin extends RWSPlugin<WSOptions> {
async onClientStart(): Promise<void>
{
const wsService: WSServiceInstance = this.container.get(WSService);
const notifyService: NotifyServiceInstance = this.container.get(NotifyService);
const appConfig: ConfigServiceInstance = this.container.get(ConfigService);
wsService.on('ws:disconnected', (instance, params) => {
notifyService.notify(`Your websocket client disconnected from the server. Your ID was <strong>${params.socketId}</strong>`, 'error');
});
wsService.on('ws:connected', (instance, params) => {
notifyService.notify('You are connected to websocket. Your ID is: <strong>' + instance.socket().id + '</strong>', 'info');
});
wsService.on('ws:reconnect', (instance, params) => {
console.info('WS RECONNECTION ' + (params.reconnects + 1));
notifyService.notify('Your websocket client has tried to reconnect to server. Attempt #' + (params.reconnects+1), 'warning');
});
wsService.init(appConfig.get('wsUrl'), appConfig.get('user'), appConfig.get('transports'));
};
}
export { RWSWebsocketsPlugin, WSService, WSServiceInstance, WSEvent, WSStatus };
```
**./build.js**
```javascript
const {RWSPluginBuilder} = require('@rws-framework/client/src/plugins/_builder');
class BrowserRouterBuilder extends RWSPluginBuilder{
constructor(buildConfigurator, baseBuildConfig){
super(__dirname, buildConfigurator, baseBuildConfig);
}
async onComponentsLocated(partedComponentsLocations = []){
if(!partedComponentsLocations){
partedComponentsLocations = [];
}
return [...partedComponentsLocations,`${this.pluginPath}/src/components`];
}
async onServicesLocated(servicesLocations){
return [...servicesLocations,`${this.pluginPath}/src/services`];
}
async onBuild(buildOptions){
this.log('webpack build modified');
return buildOptions;
}
}
module.exports = BrowserRouterBuilder;
```
```typescript
import RWSClient, { RWSContainer, RWSPlugin, RWSPluginEntry } from '@rws-framework/client';
import { RWSBrowserRouter, BrowserRouterOpts } from '@rws-framework/browser-router';
import './styles/main.scss';
import routes from './routing/routes';
import backendImports from './backendImport';
import notifierMethod from './_notifier';
import _initComponents from './application/_initComponents';
import { loadRWSRichWindow } from '@rws-framework/client/src/interfaces/RWSWindow';
async function initializeApp() {
const theClient = RWSContainer().get(RWSClient);
//(...)
theClient.onInit(async () => {
console.log(loadRWSRichWindow().RWS);
RWSPlugin.getPlugin<RWSBrowserRouter>(RWSBrowserRouter).addRoutes(routes);
_initComponents(theClient.appConfig.get('parted'));
});
theClient.setup({
partedPrefix: 'rws',
partedDirUrlPrefix: '/js',
parted: true,
plugins: [ // RWS Plugins option for TS
RWSBrowserRouter //Plugin class name from package
]
});
}
initializeApp();
```
**webpack.config.ts**
```javascript
const path = require('path');
const RWSWebpackWrapper = require('@rws-framework/client/rws.webpack.config');
const executionDir = process.cwd();
module.exports = RWSWebpackWrapper({
dev: false,
hot: false,
report: false,
tsConfigPath: executionDir + '/tsconfig.json',
entry: `${executionDir}/src/index.ts`,
executionDir: executionDir,
publicDir: path.resolve(executionDir, 'public'),
outputDir: path.resolve(executionDir, 'public', 'js'),
outputFileName: 'warlock.client.js',
parted: true,
partedDirUrlPrefix: '/js',
copyAssets: {
'./public/js/' : [
'./src/styles/compiled/main.css'
]
},
rwsPlugins: [
'@rws-framework/nest-interconnectors',
'@rws-framework/browser-router'
]
});
```
```javascript
{
"name": "@rws-framework/some-plugin",
"version": "0.2.0",
"private": false,
"description": "",
"main": "src/plugin.ts",
"author": "papablack"
}
```
> [!CAUTION]
> EVERY plugin needs plugin-info.json
```javascript
{
"name": "some-plugin"
}
```
https://github.com/papablack/rws-browser-router
Plugin systems lets users