Source: token.js

const { AccessToken } = require('livekit-server-sdk');
require('dotenv').config();

const apiKey = process.env.liveKitKey;
const apiSecret = process.env.liveKitSecret;

/**
 * Creates a LiveKit JWT for a participant.
 *
 * @param {Object} params - Token creation input.
 * @param {string} params.roomName - Target room to join.
 * @param {string} params.username - Participant identity.
 * @param {string} [params.metadata] - Optional participant metadata JSON string.
 * @returns {Promise<string>} Signed JWT token.
 */
async function createToken({
  roomName,
  username,
  metadata,
}) {
  const at = new AccessToken(apiKey, apiSecret, { identity: username, metadata });
  at.addGrant({ roomJoin: true, room: roomName });

  const token = await at.toJwt();
  return token;
}

module.exports = createToken;

// This code allows you to call from the cli
if (require.main === module) {
  const roomName = process.argv[2] || 'test-room';
  const username = process.argv[3] || 'host';

  createToken({ roomName, username })
    .then(token => {
      console.log({token});
    })
    .catch(console.error);
}