# Initalizing Server

## Content

The [Server](/spreadjs/api/collaboration/js-collaboration/classes/Server) class from `@mescius/js-collaboration` initializes the server-side endpoint for real-time collaboration.
This page explains how to create and configure a `Server` instance.

## Installation

Install the server package:

```bash
npm install @mescius/js-collaboration
```

## Start in Standalone Mode

The simplest way to start the server is by specifying a `port`.

```typescript
import { Server } from '@mescius/js-collaboration';

const server = new Server({ port: 8080 });

server.on('connect', (context) => {
  // Handle client connection
});
```

Use this mode when the collaboration service runs independently.

## Attach to an Existing HTTP Server

If your application already uses a Node.js server (for example, Express), you can attach the collaboration server to it.
Supported server types:

* `http.Server`
* `https.Server`
* `http2.Http2Server`
* `http2.Http2SecureServer`

```typescript
import express from "express";
import { createServer } from "http";
import { Server } from "@mescius/js-collaboration";

const app = express();
const httpServer = createServer(app);

const server = new Server({ httpServer });

app.use(express.static("public"));

server.on("connect", (context) => {
  // Collaboration logic
});

httpServer.listen(8080);
```

Use this mode when:

* Sharing the same server with REST APIs
* Using existing middleware
* Deploying in a unified backend service

## Configure the Endpoint Path

By default, the collaboration endpoint uses: `/collaboration/`

>type=warning
> The server and client configurations must use the same `path`.

**Server**

```typescript
const server = new Server({
  port: 8080,
  path: "/my-custom-path/"
});
```

**Client**

```typescript
import { Client } from "@mescius/js-collaboration-client";

const client = new Client("ws://server-domain.com:8000", {
  path: "/my-custom-path/"
});
```

## Advanced Configuration

In addition to `port`, `httpServer`, and `path`, the `Server` constructor accepts advanced configuration options through [`IServerConfig`](/spreadjs/api/collaboration/js-collaboration/interfaces/IServerConfig).
These options allow you to:

* Configure cross-origin access (CORS)
* Validate handshake or upgrade requests
* Control maximum payload size
* Customize the Socket.IO adapter for distributed deployments

The following example illustrates how multiple advanced options can be combined in a production-style configuration. Replace the placeholder values with settings appropriate for your environment.

```typescript
import { Server } from '@mescius/js-collaboration';
import { createClient } from 'redis';
import { createAdapter } from '@socket.io/redis-adapter';

const pubClient = createClient({ url: 'redis://localhost:6379' });
const subClient = pubClient.duplicate();

await Promise.all([pubClient.connect(), subClient.connect()]);

const server = new Server({
  port: 8080,

  // Custom endpoint
  path: "/collaboration/",

  // Enable multi-node broadcasting
  socketIoAdapter: createAdapter(pubClient, subClient),

  // Configure CORS
  cors: {
    origin: ["https://app.example.com"]
  },

  // Restrict handshake requests
  allowRequest: (req, callback) => {
    const origin = req.headers.origin;
    callback(null, !!origin);
  },

  // Control payload limits
  maxHttpBufferSize: 1024 * 1024 * 1024,
  maxDecompressedMessageSize: 1024 * 1024 * 1024,
});
```

## Deploy in Multiple Server Instances

For multi-node deployments (for example, behind a load balancer), configure a custom adapter to synchronize messages across instances.
See:

* [Multiple Servers Deployment](/spreadjs/docs/spreadjs-collaboration-server/collaboration-framework/js-collaboration/multi-node-deployment)
* [IServerConfig (API Reference)](/spreadjs/api/collaboration/js-collaboration/interfaces/IServerConfig)

## API Reference

For complete configuration options, see:

* [IServerConfig](/spreadjs/api/collaboration/js-collaboration/interfaces/IServerConfig)
* [Server Class](/spreadjs/api/collaboration/js-collaboration/classes/Server)

## Next Steps

After initializing the server, use the methods of the [Server ](/spreadjs/api/collaboration/js-collaboration/classes/Server)class to register hooks and middleware for handling connections and messages. For more details, refer to the [Server Class](/spreadjs/docs/spreadjs-collaboration-server/collaboration-framework/js-collaboration/server-class) and [Middleware](/spreadjs/docs/spreadjs-collaboration-server/collaboration-framework/js-collaboration/server-middleware).