The better way to import cometD library into LWC

You do not need EMP-Connector if you are using lwc. Salesforce has a lightning-emp-api base component for it (

The lightning/empApi module uses a shared CometD connection.

You can use the provided functions from the module

import { subscribe, unsubscribe, onError, setDebugFlag, isEmpEnabled } from 'lightning/empApi';


You are right that for communities this component is not supported.I still suggest you give a try because i have it working at least for aura component in the lightning community builder using emp api. I have not tested the lwc one.

Also push topics might not be supported but platform events are supported in the lightning communities.

One can completely engineer the emp api component with a custom component because under the hood it uses cometd js library.

Here is a sample code to get you started

NOTE - I have used the 3.1.1 version from here. You can extract the archive and under the common folder just download the comted.js file for using in static resource.

I also uploaded the cometd.js file that i have used for testing. You can get it here

Here is the sample code to get started

  <div>Streaming Component</div>

The JS controller is

import { LightningElement, wire, track } from "lwc";
import { loadScript } from "lightning/platformResourceLoader";
import cometdlwc from "@salesforce/resourceUrl/cometd";
import getSessionId from '@salesforce/apex/SessionUtil.getSessionId';

export default class Cometdlwc extends LightningElement {
 libInitialized = false;
 @track sessionId;
 @track error;

 wiredSessionId({ error, data }) {
  if (data) {
    this.sessionId = data;
    this.error = undefined;
    loadScript(this, cometdlwc)
    .then(() => {
} else if (error) {
    this.error = error;
    this.sessionId = undefined;

initializecometd() {

  if (this.libInitialized) {

 this.libInitialized = true;

 //inintializing cometD object/class
 var cometdlib = new;

//Calling configure method of cometD class, to setup authentication which will be used in handshaking
    url: window.location.protocol + '//' + window.location.hostname + '/cometd/47.0/',
    requestHeaders: { Authorization: 'OAuth ' + this.sessionId},
    appendMessageTypeToURL : false,
    logLevel: 'debug'

cometdlib.websocketEnabled = false;

cometdlib.handshake(function(status) {

    if (status.successful) {
        // Successfully connected to the server.
        // Now it is possible to subscribe or send messages
        console.log('Successfully connected to server');
    } else {
        /// Cannot handshake with the server, alert user.
        console.error('Error in handshaking: ' + JSON.stringify(status));

It requires a simple apex controller to get sessionId

public with sharing class SessionUtil {

   public static String getSessionId() {
    return UserInfo.getSessionId();

Community licenses don't support Streaming API, therefor empApi doesn't work. Streaming API is based on Push Topics and Read of Push Topics are not supported by Community License (so you can create events, but cannot subscribe to them)

UPDATE: you can subscribe with cometD library, please check comments