Get started with SRCS WebSocket API

Integrate real-time roll cutting optimization into your project in minutes.

Install and Setup

1. Environment Configuration

Add the WebSocket URL to your environment file:

# .env.local (Next.js) or .env (React)
NEXT_PUBLIC_WS_BASE_URL=ws://localhost:8000

2. Create the Hook

Create hooks/useOptimization.js:

import { useState } from 'react'

/**
 * Custom hook for roll cutting optimization via WebSocket
 * Manages loading state and WebSocket connection
 */
export const useOptimization = () => {
  const [loading, setLoading] = useState(false)

  /**
   * Sends roll cutting data to WebSocket server for optimization
   * @param {Object} data - Roll cutting specifications
   * @returns {Promise} - Resolves with optimization results
   */
  const optimize = async (data) => {
    setLoading(true)
    
    // Connect to WebSocket server
    const ws = new WebSocket(
      process.env.NEXT_PUBLIC_WS_BASE_URL
    )
    
    return new Promise((resolve, reject) => {
      // Send data when connection opens
      ws.onopen = () => ws.send(JSON.stringify(data))
      
      // Handle server response
      ws.onmessage = (event) => {
        const result = JSON.parse(event.data)
        if (result.status) {
          resolve(result.data)
        } else {
          reject(new Error(result.message))
        }
        ws.close()
        setLoading(false)
      }
      
      // Handle connection errors
      ws.onerror = () => {
        reject(new Error('Connection failed'))
        setLoading(false)
      }
    })
  }

  return { optimize, loading }
}

3. Use in Component

Import and use the hook in your component:

import { useOptimization } from './hooks/useOptimization'

/**
 * Component for roll cutting optimization form
 * Uses WebSocket to send data and receive results
 */
export default function OptimizeForm() {
  const { optimize, loading } = useOptimization()

  /**
   * Handles form submission and sends data for optimization
   * Creates sample roll cutting data and processes it
   */
  const handleSubmit = async () => {
    // Sample roll cutting data
    const data = {
      decal_size: 4500,      // Mother roll width in mm
      no_of_cut: 7,          // Maximum cuts per roll
      rolls: [
        {
          item_name: "Pattern 1",  // Product name
          size: 32,               // Cut size
          uom: "IN",              // Unit of measurement
          nor: 5,                 // Number of rolls required
          roll_id: "R1"           // Unique roll identifier
        }
      ]
    }

    try {
      const result = await optimize(data)
      console.log('Success:', result)
    } catch (error) {
      console.error('Error:', error)
    }
  }

  return (
    <button 
      onClick={handleSubmit} 
      disabled={loading}
    >
      {loading ? 'Optimizing...' : 'Optimize'}
    </button>
  )
}

4. Excel File Upload (Optional)

For Excel file upload, install XLSX and create upload hook:

// Install XLSX package
npm install xlsx

// Create hooks/useExcelUpload.js
import { useState } from 'react'

export const useExcelUpload = () => {
  const [loading, setLoading] = useState(false)

  const fileToBase64 = (file) => {
    return new Promise((resolve) => {
      const reader = new FileReader()
      reader.onload = () => {
        const bytes = new Uint8Array(reader.result)
        const base64 = btoa(String.fromCharCode(...bytes))
        resolve(base64)
      }
      reader.readAsArrayBuffer(file)
    })
  }

  const optimizeFromFile = async (file, formData) => {
    setLoading(true)
    const fileBase64 = await fileToBase64(file)
    
    const ws = new WebSocket(
      process.env.NEXT_PUBLIC_WS_BASE_URL + '/ws/optimize-cutting-from-file'
    )
    
    return new Promise((resolve, reject) => {
      ws.onopen = () => {
        ws.send(JSON.stringify({
          decal_size: parseFloat(formData.motherRollWidth),
          no_of_cut: parseInt(formData.maxCuts),
          file_content: fileBase64,
          filename: file.name,
          customer_name: formData.customerName,
          so_no: formData.soNo
        }))
      }
      
      ws.onmessage = (event) => {
        const result = JSON.parse(event.data)
        result.status ? resolve(result.data) : reject(result.message)
        ws.close()
        setLoading(false)
      }
      
      ws.onerror = () => {
        reject('Connection failed')
        setLoading(false)
      }
    })
  }

  return { optimizeFromFile, loading }
}

API Reference

WebSocket Endpoints

Manual Input
wss://srcs-backend-0aqk.onrender.com/ws/optimize-cutting
File Upload
wss://srcs-backend-0aqk.onrender.com/ws/optimize-cutting-from-file

Required Fields

  • decal_size - Mother roll width in mm
  • no_of_cut - Maximum cuts per roll
  • rolls - Array of roll specifications
  • item_name - Product name
  • size - Cut size
  • uom - Unit of measurement (IN, MM, CM)
  • nor - Number of rolls required

Excel File Format

Required Columns:

  • • ItemName (or Item_Name)
  • • Size
  • • UOM
  • • NOR

Optional Columns:

  • • DIA, BF, GSM
  • • Quality, Quantity