[{"data":1,"prerenderedAt":1310},["ShallowReactive",2],{"docs:/docs/concepts/qos":3},{"id":4,"title":5,"body":6,"description":1303,"extension":1304,"meta":1305,"navigation":505,"path":1306,"seo":1307,"stem":1308,"__hash__":1309},"docs/docs/concepts/qos.md","Quality of Service (QoS)",{"type":7,"value":8,"toc":1291},"minimark",[9,13,17,22,25,100,104,107,203,209,225,229,232,307,311,325,329,332,413,417,431,435,440,466,470,473,1039,1043,1046,1268,1272,1287],[10,11,5],"h1",{"id":12},"quality-of-service-qos",[14,15,16],"p",{},"Choose the right delivery guarantee for your messages. NoLag supports three QoS levels for different reliability requirements.",[18,19,21],"h2",{"id":20},"qos-levels","QoS Levels",[14,23,24],{},"Quality of Service determines how NoLag handles message delivery. Different use cases require different guarantees:",[26,27,28,47],"table",{},[29,30,31],"thead",{},[32,33,34,38,41,44],"tr",{},[35,36,37],"th",{},"Level",[35,39,40],{},"Name",[35,42,43],{},"Guarantee",[35,45,46],{},"Use Case",[48,49,50,68,84],"tbody",{},[32,51,52,59,62,65],{},[53,54,55],"td",{},[56,57,58],"code",{},"0",[53,60,61],{},"At-most-once",[53,63,64],{},"Fire and forget",[53,66,67],{},"Telemetry, status updates",[32,69,70,75,78,81],{},[53,71,72],{},[56,73,74],{},"1",[53,76,77],{},"At-least-once",[53,79,80],{},"Acknowledged delivery",[53,82,83],{},"Notifications, chat messages",[32,85,86,91,94,97],{},[53,87,88],{},[56,89,90],{},"2",[53,92,93],{},"Exactly-once",[53,95,96],{},"Transactional",[53,98,99],{},"Payments, critical events",[18,101,103],{"id":102},"qos-0-at-most-once","QoS 0: At-most-once",[14,105,106],{},"Messages are sent once with no acknowledgment. The fastest option, but messages may be lost if the connection drops.",[108,109,110,162,180],"code-tabs",{},[111,112,118],"pre",{"className":113,"code":114,"filename":115,"language":116,"meta":117,"style":117},"language-typescript shiki shiki-themes github-light github-dark","// Fire and forget - no delivery confirmation\nclient.emit('sensors/temperature', { temperature: 72.5 }, { qos: 0 })\n","TypeScript","typescript","",[56,119,120,129],{"__ignoreMap":117},[121,122,125],"span",{"class":123,"line":124},"line",1,[121,126,128],{"class":127},"sJ8bj","// Fire and forget - no delivery confirmation\n",[121,130,132,136,140,143,147,150,154,157,159],{"class":123,"line":131},2,[121,133,135],{"class":134},"sVt8B","client.",[121,137,139],{"class":138},"sScJk","emit",[121,141,142],{"class":134},"(",[121,144,146],{"class":145},"sZZnC","'sensors/temperature'",[121,148,149],{"class":134},", { temperature: ",[121,151,153],{"class":152},"sj4cs","72.5",[121,155,156],{"class":134}," }, { qos: ",[121,158,58],{"class":152},[121,160,161],{"class":134}," })\n",[111,163,168],{"className":164,"code":165,"filename":166,"language":167,"meta":117,"style":117},"language-python shiki shiki-themes github-light github-dark","# Fire and forget - no delivery confirmation\nawait client.emit('sensors/temperature', {'temperature': 72.5}, EmitOptions(qos=QoS.AT_MOST_ONCE))\n","Python","python",[56,169,170,175],{"__ignoreMap":117},[121,171,172],{"class":123,"line":124},[121,173,174],{},"# Fire and forget - no delivery confirmation\n",[121,176,177],{"class":123,"line":131},[121,178,179],{},"await client.emit('sensors/temperature', {'temperature': 72.5}, EmitOptions(qos=QoS.AT_MOST_ONCE))\n",[111,181,186],{"className":182,"code":183,"filename":184,"language":185,"meta":117,"style":117},"language-go shiki shiki-themes github-light github-dark","// Fire and forget - no delivery confirmation\nqos := nolag.QoSAtMostOnce\nclient.Emit(\"sensors/temperature\", map[string]any{\"temperature\": 72.5}, nolag.EmitOptions{QoS: &qos})\n","Go","go",[56,187,188,192,197],{"__ignoreMap":117},[121,189,190],{"class":123,"line":124},[121,191,128],{},[121,193,194],{"class":123,"line":131},[121,195,196],{},"qos := nolag.QoSAtMostOnce\n",[121,198,200],{"class":123,"line":199},3,[121,201,202],{},"client.Emit(\"sensors/temperature\", map[string]any{\"temperature\": 72.5}, nolag.EmitOptions{QoS: &qos})\n",[14,204,205],{},[206,207,208],"strong",{},"Best for:",[210,211,212,216,219,222],"ul",{},[213,214,215],"li",{},"Sensor data that updates frequently",[213,217,218],{},"Live location updates",[213,220,221],{},"Typing indicators",[213,223,224],{},"Mouse cursor positions",[18,226,228],{"id":227},"qos-1-at-least-once","QoS 1: At-least-once",[14,230,231],{},"Messages are acknowledged by the broker. If no acknowledgment is received, the message is resent. Messages may be delivered more than once.",[108,233,234,273,288],{},[111,235,237],{"className":113,"code":236,"filename":115,"language":116,"meta":117,"style":117},"// Acknowledged delivery\nclient.emit('notifications', { type: 'alert', message: 'You have a new message' }, { qos: 1 })\n",[56,238,239,244],{"__ignoreMap":117},[121,240,241],{"class":123,"line":124},[121,242,243],{"class":127},"// Acknowledged delivery\n",[121,245,246,248,250,252,255,258,261,264,267,269,271],{"class":123,"line":131},[121,247,135],{"class":134},[121,249,139],{"class":138},[121,251,142],{"class":134},[121,253,254],{"class":145},"'notifications'",[121,256,257],{"class":134},", { type: ",[121,259,260],{"class":145},"'alert'",[121,262,263],{"class":134},", message: ",[121,265,266],{"class":145},"'You have a new message'",[121,268,156],{"class":134},[121,270,74],{"class":152},[121,272,161],{"class":134},[111,274,276],{"className":164,"code":275,"filename":166,"language":167,"meta":117,"style":117},"# Acknowledged delivery\nawait client.emit('notifications', {'type': 'alert', 'message': 'You have a new message'}, EmitOptions(qos=QoS.AT_LEAST_ONCE))\n",[56,277,278,283],{"__ignoreMap":117},[121,279,280],{"class":123,"line":124},[121,281,282],{},"# Acknowledged delivery\n",[121,284,285],{"class":123,"line":131},[121,286,287],{},"await client.emit('notifications', {'type': 'alert', 'message': 'You have a new message'}, EmitOptions(qos=QoS.AT_LEAST_ONCE))\n",[111,289,291],{"className":182,"code":290,"filename":184,"language":185,"meta":117,"style":117},"// Acknowledged delivery\nqos := nolag.QoSAtLeastOnce\nclient.Emit(\"notifications\", map[string]any{\"type\": \"alert\", \"message\": \"You have a new message\"}, nolag.EmitOptions{QoS: &qos})\n",[56,292,293,297,302],{"__ignoreMap":117},[121,294,295],{"class":123,"line":124},[121,296,243],{},[121,298,299],{"class":123,"line":131},[121,300,301],{},"qos := nolag.QoSAtLeastOnce\n",[121,303,304],{"class":123,"line":199},[121,305,306],{},"client.Emit(\"notifications\", map[string]any{\"type\": \"alert\", \"message\": \"You have a new message\"}, nolag.EmitOptions{QoS: &qos})\n",[14,308,309],{},[206,310,208],{},[210,312,313,316,319,322],{},[213,314,315],{},"Chat messages",[213,317,318],{},"Notifications",[213,320,321],{},"Event broadcasts",[213,323,324],{},"Most real-time applications",[18,326,328],{"id":327},"qos-2-exactly-once","QoS 2: Exactly-once",[14,330,331],{},"Messages are delivered exactly once using a four-step handshake. The most reliable but slowest option.",[108,333,334,379,394],{},[111,335,337],{"className":113,"code":336,"filename":115,"language":116,"meta":117,"style":117},"// Exactly-once delivery\nclient.emit('orders/status', { orderId: '12345', status: 'completed', amount: 99.99 }, { qos: 2 })\n",[56,338,339,344],{"__ignoreMap":117},[121,340,341],{"class":123,"line":124},[121,342,343],{"class":127},"// Exactly-once delivery\n",[121,345,346,348,350,352,355,358,361,364,367,370,373,375,377],{"class":123,"line":131},[121,347,135],{"class":134},[121,349,139],{"class":138},[121,351,142],{"class":134},[121,353,354],{"class":145},"'orders/status'",[121,356,357],{"class":134},", { orderId: ",[121,359,360],{"class":145},"'12345'",[121,362,363],{"class":134},", status: ",[121,365,366],{"class":145},"'completed'",[121,368,369],{"class":134},", amount: ",[121,371,372],{"class":152},"99.99",[121,374,156],{"class":134},[121,376,90],{"class":152},[121,378,161],{"class":134},[111,380,382],{"className":164,"code":381,"filename":166,"language":167,"meta":117,"style":117},"# Exactly-once delivery\nawait client.emit('orders/status', {'orderId': '12345', 'status': 'completed', 'amount': 99.99}, EmitOptions(qos=QoS.EXACTLY_ONCE))\n",[56,383,384,389],{"__ignoreMap":117},[121,385,386],{"class":123,"line":124},[121,387,388],{},"# Exactly-once delivery\n",[121,390,391],{"class":123,"line":131},[121,392,393],{},"await client.emit('orders/status', {'orderId': '12345', 'status': 'completed', 'amount': 99.99}, EmitOptions(qos=QoS.EXACTLY_ONCE))\n",[111,395,397],{"className":182,"code":396,"filename":184,"language":185,"meta":117,"style":117},"// Exactly-once delivery\nqos := nolag.QoSExactlyOnce\nclient.Emit(\"orders/status\", map[string]any{\"orderId\": \"12345\", \"status\": \"completed\", \"amount\": 99.99}, nolag.EmitOptions{QoS: &qos})\n",[56,398,399,403,408],{"__ignoreMap":117},[121,400,401],{"class":123,"line":124},[121,402,343],{},[121,404,405],{"class":123,"line":131},[121,406,407],{},"qos := nolag.QoSExactlyOnce\n",[121,409,410],{"class":123,"line":199},[121,411,412],{},"client.Emit(\"orders/status\", map[string]any{\"orderId\": \"12345\", \"status\": \"completed\", \"amount\": 99.99}, nolag.EmitOptions{QoS: &qos})\n",[14,414,415],{},[206,416,208],{},[210,418,419,422,425,428],{},[213,420,421],{},"Financial transactions",[213,423,424],{},"Order processing",[213,426,427],{},"Critical state changes",[213,429,430],{},"Inventory updates",[18,432,434],{"id":433},"choosing-the-right-qos","Choosing the Right QoS",[436,437,439],"h3",{"id":438},"decision-guide","Decision Guide",[210,441,442,448,454,460],{},[213,443,444,447],{},[206,445,446],{},"Can you tolerate lost messages?"," → Use QoS 0",[213,449,450,453],{},[206,451,452],{},"Need delivery confirmation?"," → Use QoS 1",[213,455,456,459],{},[206,457,458],{},"Can't tolerate duplicates?"," → Use QoS 2",[213,461,462,465],{},[206,463,464],{},"Not sure?"," → Start with QoS 1 (recommended default)",[18,467,469],{"id":468},"handling-duplicates-qos-1","Handling Duplicates (QoS 1)",[14,471,472],{},"When using QoS 1, implement idempotency to handle potential duplicate messages:",[108,474,475,742,856],{},[111,476,478],{"className":113,"code":477,"filename":115,"language":116,"meta":117,"style":117},"const processedMessages = new Set()\n\nclient.on('orders/new', (data, meta) => {\n  // Use a unique identifier from your data\n  const messageId = data.orderId\n\n  // Skip if already processed\n  if (processedMessages.has(messageId)) {\n    return\n  }\n\n  // Process the message\n  processOrder(data)\n\n  // Mark as processed\n  processedMessages.add(messageId)\n\n  // Clean up old IDs periodically\n  if (processedMessages.size > 10000) {\n    const entries = Array.from(processedMessages)\n    entries.slice(0, 5000).forEach(id => processedMessages.delete(id))\n  }\n})\n",[56,479,480,501,507,541,547,561,566,572,587,593,599,604,610,619,624,630,642,647,653,670,690,731,736],{"__ignoreMap":117},[121,481,482,486,489,492,495,498],{"class":123,"line":124},[121,483,485],{"class":484},"szBVR","const",[121,487,488],{"class":152}," processedMessages",[121,490,491],{"class":484}," =",[121,493,494],{"class":484}," new",[121,496,497],{"class":138}," Set",[121,499,500],{"class":134},"()\n",[121,502,503],{"class":123,"line":131},[121,504,506],{"emptyLinePlaceholder":505},true,"\n",[121,508,509,511,514,516,519,522,526,529,532,535,538],{"class":123,"line":199},[121,510,135],{"class":134},[121,512,513],{"class":138},"on",[121,515,142],{"class":134},[121,517,518],{"class":145},"'orders/new'",[121,520,521],{"class":134},", (",[121,523,525],{"class":524},"s4XuR","data",[121,527,528],{"class":134},", ",[121,530,531],{"class":524},"meta",[121,533,534],{"class":134},") ",[121,536,537],{"class":484},"=>",[121,539,540],{"class":134}," {\n",[121,542,544],{"class":123,"line":543},4,[121,545,546],{"class":127},"  // Use a unique identifier from your data\n",[121,548,550,553,556,558],{"class":123,"line":549},5,[121,551,552],{"class":484},"  const",[121,554,555],{"class":152}," messageId",[121,557,491],{"class":484},[121,559,560],{"class":134}," data.orderId\n",[121,562,564],{"class":123,"line":563},6,[121,565,506],{"emptyLinePlaceholder":505},[121,567,569],{"class":123,"line":568},7,[121,570,571],{"class":127},"  // Skip if already processed\n",[121,573,575,578,581,584],{"class":123,"line":574},8,[121,576,577],{"class":484},"  if",[121,579,580],{"class":134}," (processedMessages.",[121,582,583],{"class":138},"has",[121,585,586],{"class":134},"(messageId)) {\n",[121,588,590],{"class":123,"line":589},9,[121,591,592],{"class":484},"    return\n",[121,594,596],{"class":123,"line":595},10,[121,597,598],{"class":134},"  }\n",[121,600,602],{"class":123,"line":601},11,[121,603,506],{"emptyLinePlaceholder":505},[121,605,607],{"class":123,"line":606},12,[121,608,609],{"class":127},"  // Process the message\n",[121,611,613,616],{"class":123,"line":612},13,[121,614,615],{"class":138},"  processOrder",[121,617,618],{"class":134},"(data)\n",[121,620,622],{"class":123,"line":621},14,[121,623,506],{"emptyLinePlaceholder":505},[121,625,627],{"class":123,"line":626},15,[121,628,629],{"class":127},"  // Mark as processed\n",[121,631,633,636,639],{"class":123,"line":632},16,[121,634,635],{"class":134},"  processedMessages.",[121,637,638],{"class":138},"add",[121,640,641],{"class":134},"(messageId)\n",[121,643,645],{"class":123,"line":644},17,[121,646,506],{"emptyLinePlaceholder":505},[121,648,650],{"class":123,"line":649},18,[121,651,652],{"class":127},"  // Clean up old IDs periodically\n",[121,654,656,658,661,664,667],{"class":123,"line":655},19,[121,657,577],{"class":484},[121,659,660],{"class":134}," (processedMessages.size ",[121,662,663],{"class":484},">",[121,665,666],{"class":152}," 10000",[121,668,669],{"class":134},") {\n",[121,671,673,676,679,681,684,687],{"class":123,"line":672},20,[121,674,675],{"class":484},"    const",[121,677,678],{"class":152}," entries",[121,680,491],{"class":484},[121,682,683],{"class":134}," Array.",[121,685,686],{"class":138},"from",[121,688,689],{"class":134},"(processedMessages)\n",[121,691,693,696,699,701,703,705,708,711,714,716,719,722,725,728],{"class":123,"line":692},21,[121,694,695],{"class":134},"    entries.",[121,697,698],{"class":138},"slice",[121,700,142],{"class":134},[121,702,58],{"class":152},[121,704,528],{"class":134},[121,706,707],{"class":152},"5000",[121,709,710],{"class":134},").",[121,712,713],{"class":138},"forEach",[121,715,142],{"class":134},[121,717,718],{"class":524},"id",[121,720,721],{"class":484}," =>",[121,723,724],{"class":134}," processedMessages.",[121,726,727],{"class":138},"delete",[121,729,730],{"class":134},"(id))\n",[121,732,734],{"class":123,"line":733},22,[121,735,598],{"class":134},[121,737,739],{"class":123,"line":738},23,[121,740,741],{"class":134},"})\n",[111,743,745],{"className":164,"code":744,"filename":166,"language":167,"meta":117,"style":117},"processed_messages = set()\n\ndef handle_order(data, meta):\n    # Use a unique identifier from your data\n    message_id = data['orderId']\n\n    # Skip if already processed\n    if message_id in processed_messages:\n        return\n\n    # Process the message\n    process_order(data)\n\n    # Mark as processed\n    processed_messages.add(message_id)\n\n    # Clean up old IDs periodically\n    if len(processed_messages) > 10000:\n        to_remove = list(processed_messages)[:5000]\n        for id in to_remove:\n            processed_messages.discard(id)\n\nclient.on('orders/new', handle_order)\n",[56,746,747,752,756,761,766,771,775,780,785,790,794,799,804,808,813,818,822,827,832,837,842,847,851],{"__ignoreMap":117},[121,748,749],{"class":123,"line":124},[121,750,751],{},"processed_messages = set()\n",[121,753,754],{"class":123,"line":131},[121,755,506],{"emptyLinePlaceholder":505},[121,757,758],{"class":123,"line":199},[121,759,760],{},"def handle_order(data, meta):\n",[121,762,763],{"class":123,"line":543},[121,764,765],{},"    # Use a unique identifier from your data\n",[121,767,768],{"class":123,"line":549},[121,769,770],{},"    message_id = data['orderId']\n",[121,772,773],{"class":123,"line":563},[121,774,506],{"emptyLinePlaceholder":505},[121,776,777],{"class":123,"line":568},[121,778,779],{},"    # Skip if already processed\n",[121,781,782],{"class":123,"line":574},[121,783,784],{},"    if message_id in processed_messages:\n",[121,786,787],{"class":123,"line":589},[121,788,789],{},"        return\n",[121,791,792],{"class":123,"line":595},[121,793,506],{"emptyLinePlaceholder":505},[121,795,796],{"class":123,"line":601},[121,797,798],{},"    # Process the message\n",[121,800,801],{"class":123,"line":606},[121,802,803],{},"    process_order(data)\n",[121,805,806],{"class":123,"line":612},[121,807,506],{"emptyLinePlaceholder":505},[121,809,810],{"class":123,"line":621},[121,811,812],{},"    # Mark as processed\n",[121,814,815],{"class":123,"line":626},[121,816,817],{},"    processed_messages.add(message_id)\n",[121,819,820],{"class":123,"line":632},[121,821,506],{"emptyLinePlaceholder":505},[121,823,824],{"class":123,"line":644},[121,825,826],{},"    # Clean up old IDs periodically\n",[121,828,829],{"class":123,"line":649},[121,830,831],{},"    if len(processed_messages) > 10000:\n",[121,833,834],{"class":123,"line":655},[121,835,836],{},"        to_remove = list(processed_messages)[:5000]\n",[121,838,839],{"class":123,"line":672},[121,840,841],{},"        for id in to_remove:\n",[121,843,844],{"class":123,"line":692},[121,845,846],{},"            processed_messages.discard(id)\n",[121,848,849],{"class":123,"line":733},[121,850,506],{"emptyLinePlaceholder":505},[121,852,853],{"class":123,"line":738},[121,854,855],{},"client.on('orders/new', handle_order)\n",[111,857,859],{"className":182,"code":858,"filename":184,"language":185,"meta":117,"style":117},"var (\n    processedMessages = make(map[string]bool)\n    mu                sync.Mutex\n)\n\nclient.Subscribe(\"orders/new\", func(data any, meta nolag.MessageMeta) {\n    msg, _ := data.(map[string]any)\n    messageId, _ := msg[\"orderId\"].(string)\n\n    mu.Lock()\n    defer mu.Unlock()\n\n    // Skip if already processed\n    if processedMessages[messageId] {\n        return\n    }\n\n    // Process the message\n    processOrder(msg)\n\n    // Mark as processed\n    processedMessages[messageId] = true\n\n    // Clean up old IDs periodically\n    if len(processedMessages) > 10000 {\n        i := 0\n        for id := range processedMessages {\n            if i >= 5000 {\n                break\n            }\n            delete(processedMessages, id)\n            i++\n        }\n    }\n})\n",[56,860,861,866,871,876,881,885,890,895,900,904,909,914,918,923,928,932,937,941,946,951,955,960,965,969,975,981,987,993,999,1005,1011,1017,1023,1029,1034],{"__ignoreMap":117},[121,862,863],{"class":123,"line":124},[121,864,865],{},"var (\n",[121,867,868],{"class":123,"line":131},[121,869,870],{},"    processedMessages = make(map[string]bool)\n",[121,872,873],{"class":123,"line":199},[121,874,875],{},"    mu                sync.Mutex\n",[121,877,878],{"class":123,"line":543},[121,879,880],{},")\n",[121,882,883],{"class":123,"line":549},[121,884,506],{"emptyLinePlaceholder":505},[121,886,887],{"class":123,"line":563},[121,888,889],{},"client.Subscribe(\"orders/new\", func(data any, meta nolag.MessageMeta) {\n",[121,891,892],{"class":123,"line":568},[121,893,894],{},"    msg, _ := data.(map[string]any)\n",[121,896,897],{"class":123,"line":574},[121,898,899],{},"    messageId, _ := msg[\"orderId\"].(string)\n",[121,901,902],{"class":123,"line":589},[121,903,506],{"emptyLinePlaceholder":505},[121,905,906],{"class":123,"line":595},[121,907,908],{},"    mu.Lock()\n",[121,910,911],{"class":123,"line":601},[121,912,913],{},"    defer mu.Unlock()\n",[121,915,916],{"class":123,"line":606},[121,917,506],{"emptyLinePlaceholder":505},[121,919,920],{"class":123,"line":612},[121,921,922],{},"    // Skip if already processed\n",[121,924,925],{"class":123,"line":621},[121,926,927],{},"    if processedMessages[messageId] {\n",[121,929,930],{"class":123,"line":626},[121,931,789],{},[121,933,934],{"class":123,"line":632},[121,935,936],{},"    }\n",[121,938,939],{"class":123,"line":644},[121,940,506],{"emptyLinePlaceholder":505},[121,942,943],{"class":123,"line":649},[121,944,945],{},"    // Process the message\n",[121,947,948],{"class":123,"line":655},[121,949,950],{},"    processOrder(msg)\n",[121,952,953],{"class":123,"line":672},[121,954,506],{"emptyLinePlaceholder":505},[121,956,957],{"class":123,"line":692},[121,958,959],{},"    // Mark as processed\n",[121,961,962],{"class":123,"line":733},[121,963,964],{},"    processedMessages[messageId] = true\n",[121,966,967],{"class":123,"line":738},[121,968,506],{"emptyLinePlaceholder":505},[121,970,972],{"class":123,"line":971},24,[121,973,974],{},"    // Clean up old IDs periodically\n",[121,976,978],{"class":123,"line":977},25,[121,979,980],{},"    if len(processedMessages) > 10000 {\n",[121,982,984],{"class":123,"line":983},26,[121,985,986],{},"        i := 0\n",[121,988,990],{"class":123,"line":989},27,[121,991,992],{},"        for id := range processedMessages {\n",[121,994,996],{"class":123,"line":995},28,[121,997,998],{},"            if i >= 5000 {\n",[121,1000,1002],{"class":123,"line":1001},29,[121,1003,1004],{},"                break\n",[121,1006,1008],{"class":123,"line":1007},30,[121,1009,1010],{},"            }\n",[121,1012,1014],{"class":123,"line":1013},31,[121,1015,1016],{},"            delete(processedMessages, id)\n",[121,1018,1020],{"class":123,"line":1019},32,[121,1021,1022],{},"            i++\n",[121,1024,1026],{"class":123,"line":1025},33,[121,1027,1028],{},"        }\n",[121,1030,1032],{"class":123,"line":1031},34,[121,1033,936],{},[121,1035,1037],{"class":123,"line":1036},35,[121,1038,741],{},[18,1040,1042],{"id":1041},"default-qos","Default QoS",[14,1044,1045],{},"You can set a default QoS level for all messages:",[108,1047,1048,1153,1210],{},[111,1049,1051],{"className":113,"code":1050,"filename":115,"language":116,"meta":117,"style":117},"import { NoLag } from '@nolag/js-sdk'\n\n// Set default QoS for all messages\nconst client = NoLag('your_access_token', {\n  qos: 1  // Default QoS level\n})\n\nawait client.connect()\n\n// Override per-message\nclient.emit('topic', data, { qos: 2 })\n",[56,1052,1053,1066,1070,1075,1095,1105,1109,1113,1126,1130,1135],{"__ignoreMap":117},[121,1054,1055,1058,1061,1063],{"class":123,"line":124},[121,1056,1057],{"class":484},"import",[121,1059,1060],{"class":134}," { NoLag } ",[121,1062,686],{"class":484},[121,1064,1065],{"class":145}," '@nolag/js-sdk'\n",[121,1067,1068],{"class":123,"line":131},[121,1069,506],{"emptyLinePlaceholder":505},[121,1071,1072],{"class":123,"line":199},[121,1073,1074],{"class":127},"// Set default QoS for all messages\n",[121,1076,1077,1079,1082,1084,1087,1089,1092],{"class":123,"line":543},[121,1078,485],{"class":484},[121,1080,1081],{"class":152}," client",[121,1083,491],{"class":484},[121,1085,1086],{"class":138}," NoLag",[121,1088,142],{"class":134},[121,1090,1091],{"class":145},"'your_access_token'",[121,1093,1094],{"class":134},", {\n",[121,1096,1097,1100,1102],{"class":123,"line":549},[121,1098,1099],{"class":134},"  qos: ",[121,1101,74],{"class":152},[121,1103,1104],{"class":127},"  // Default QoS level\n",[121,1106,1107],{"class":123,"line":563},[121,1108,741],{"class":134},[121,1110,1111],{"class":123,"line":568},[121,1112,506],{"emptyLinePlaceholder":505},[121,1114,1115,1118,1121,1124],{"class":123,"line":574},[121,1116,1117],{"class":484},"await",[121,1119,1120],{"class":134}," client.",[121,1122,1123],{"class":138},"connect",[121,1125,500],{"class":134},[121,1127,1128],{"class":123,"line":589},[121,1129,506],{"emptyLinePlaceholder":505},[121,1131,1132],{"class":123,"line":595},[121,1133,1134],{"class":127},"// Override per-message\n",[121,1136,1137,1139,1141,1143,1146,1149,1151],{"class":123,"line":601},[121,1138,135],{"class":134},[121,1140,139],{"class":138},[121,1142,142],{"class":134},[121,1144,1145],{"class":145},"'topic'",[121,1147,1148],{"class":134},", data, { qos: ",[121,1150,90],{"class":152},[121,1152,161],{"class":134},[111,1154,1156],{"className":164,"code":1155,"filename":166,"language":167,"meta":117,"style":117},"from nolag import NoLag, NoLagOptions, EmitOptions, QoS\n\n# Set default QoS for all messages\nclient = NoLag('your_access_token', NoLagOptions(\n    qos=QoS.AT_LEAST_ONCE  # Default QoS level\n))\n\nawait client.connect()\n\n# Override per-message\nawait client.emit('topic', data, EmitOptions(qos=QoS.EXACTLY_ONCE))\n",[56,1157,1158,1163,1167,1172,1177,1182,1187,1191,1196,1200,1205],{"__ignoreMap":117},[121,1159,1160],{"class":123,"line":124},[121,1161,1162],{},"from nolag import NoLag, NoLagOptions, EmitOptions, QoS\n",[121,1164,1165],{"class":123,"line":131},[121,1166,506],{"emptyLinePlaceholder":505},[121,1168,1169],{"class":123,"line":199},[121,1170,1171],{},"# Set default QoS for all messages\n",[121,1173,1174],{"class":123,"line":543},[121,1175,1176],{},"client = NoLag('your_access_token', NoLagOptions(\n",[121,1178,1179],{"class":123,"line":549},[121,1180,1181],{},"    qos=QoS.AT_LEAST_ONCE  # Default QoS level\n",[121,1183,1184],{"class":123,"line":563},[121,1185,1186],{},"))\n",[121,1188,1189],{"class":123,"line":568},[121,1190,506],{"emptyLinePlaceholder":505},[121,1192,1193],{"class":123,"line":574},[121,1194,1195],{},"await client.connect()\n",[121,1197,1198],{"class":123,"line":589},[121,1199,506],{"emptyLinePlaceholder":505},[121,1201,1202],{"class":123,"line":595},[121,1203,1204],{},"# Override per-message\n",[121,1206,1207],{"class":123,"line":601},[121,1208,1209],{},"await client.emit('topic', data, EmitOptions(qos=QoS.EXACTLY_ONCE))\n",[111,1211,1213],{"className":182,"code":1212,"filename":184,"language":185,"meta":117,"style":117},"import nolag \"github.com/NoLagApp/go-sdk\"\n\n// Set default QoS for all messages\nclient := nolag.New(\"your_access_token\", nolag.Options{\n    QoS: nolag.QoSAtLeastOnce,  // Default QoS level\n})\n\nclient.Connect()\n\n// Override per-message\nqos := nolag.QoSExactlyOnce\nclient.Emit(\"topic\", data, nolag.EmitOptions{QoS: &qos})\n",[56,1214,1215,1220,1224,1228,1233,1238,1242,1246,1251,1255,1259,1263],{"__ignoreMap":117},[121,1216,1217],{"class":123,"line":124},[121,1218,1219],{},"import nolag \"github.com/NoLagApp/go-sdk\"\n",[121,1221,1222],{"class":123,"line":131},[121,1223,506],{"emptyLinePlaceholder":505},[121,1225,1226],{"class":123,"line":199},[121,1227,1074],{},[121,1229,1230],{"class":123,"line":543},[121,1231,1232],{},"client := nolag.New(\"your_access_token\", nolag.Options{\n",[121,1234,1235],{"class":123,"line":549},[121,1236,1237],{},"    QoS: nolag.QoSAtLeastOnce,  // Default QoS level\n",[121,1239,1240],{"class":123,"line":563},[121,1241,741],{},[121,1243,1244],{"class":123,"line":568},[121,1245,506],{"emptyLinePlaceholder":505},[121,1247,1248],{"class":123,"line":574},[121,1249,1250],{},"client.Connect()\n",[121,1252,1253],{"class":123,"line":589},[121,1254,506],{"emptyLinePlaceholder":505},[121,1256,1257],{"class":123,"line":595},[121,1258,1134],{},[121,1260,1261],{"class":123,"line":601},[121,1262,407],{},[121,1264,1265],{"class":123,"line":606},[121,1266,1267],{},"client.Emit(\"topic\", data, nolag.EmitOptions{QoS: &qos})\n",[18,1269,1271],{"id":1270},"next-steps","Next Steps",[210,1273,1274,1281],{},[213,1275,1276],{},[1277,1278,1280],"a",{"href":1279},"/docs/concepts/acl","Learn about Access Control",[213,1282,1283],{},[1277,1284,1286],{"href":1285},"/docs/api-reference","API Reference",[1288,1289,1290],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":117,"searchDepth":131,"depth":131,"links":1292},[1293,1294,1295,1296,1297,1300,1301,1302],{"id":20,"depth":131,"text":21},{"id":102,"depth":131,"text":103},{"id":227,"depth":131,"text":228},{"id":327,"depth":131,"text":328},{"id":433,"depth":131,"text":434,"children":1298},[1299],{"id":438,"depth":199,"text":439},{"id":468,"depth":131,"text":469},{"id":1041,"depth":131,"text":1042},{"id":1270,"depth":131,"text":1271},"Learn about NoLag QoS levels: at-most-once, at-least-once, and exactly-once message delivery guarantees.","md",{},"/docs/concepts/qos",{"title":5,"description":1303},"docs/concepts/qos","BY5I0mS7DAXhvvkz1IysD0V3jLjAxl0AlruGlQl379k",1788160343056]