[{"data":1,"prerenderedAt":1441},["ShallowReactive",2],{"docs:/docs/concepts/filters":3},{"id":4,"title":5,"body":6,"description":1434,"extension":1435,"meta":1436,"navigation":106,"path":1437,"seo":1438,"stem":1439,"__hash__":1440},"docs/docs/concepts/filters.md","Topic Filters",{"type":7,"value":8,"toc":1423},"minimark",[9,13,17,22,30,42,46,49,59,63,70,512,516,523,776,780,787,976,986,990,993,1273,1277,1326,1330,1388,1392,1419],[10,11,5],"h1",{"id":12},"topic-filters",[14,15,16],"p",{},"Filters let you narrow message delivery to specific entities within a topic. Instead of receiving all updates, subscribe with filters and only get the messages you care about.",[18,19,21],"h2",{"id":20},"why-filters","Why Filters?",[14,23,24,25,29],{},"Without filters, subscribing to a topic delivers ",[26,27,28],"strong",{},"every"," message published to it. For a dashboard showing 3 bookings out of thousands, this means receiving updates for all bookings and discarding most of them client-side.",[14,31,32,33,37,38,41],{},"Filters solve this at the infrastructure level. Subscribe to ",[34,35,36],"code",{},"bookings"," with filters ",[34,39,40],{},"[\"booking_1\", \"booking_2\"]"," and only updates for those two bookings are delivered. When the user navigates to different bookings, swap filters dynamically, no resubscribe needed.",[18,43,45],{"id":44},"how-it-works","How It Works",[14,47,48],{},"Each filter value becomes a separate subscription at the infrastructure level, so filtering happens before messages reach your client, not by inspecting message payloads. This means zero wasted bandwidth.",[50,51,57],"pre",{"className":52,"code":54,"language":55,"meta":56},[53],"language-text","No filters (wildcard, receives everything on the topic):\nsubscribe(\"bookings\")\n\nWith filter, only receives matching updates:\nsubscribe(\"bookings\", { filters: [\"booking_1\"] })\n\nPublish targeting filtered subscribers:\npublish(\"bookings\", data, { filter: \"booking_1\" })\n\nPublish without filter:\npublish(\"bookings\", data) // only wildcard subscribers receive this\n","text","",[34,58,54],{"__ignoreMap":56},[18,60,62],{"id":61},"subscribe-with-filters","Subscribe with Filters",[14,64,65,66,69],{},"Pass a ",[34,67,68],{},"filters"," array when subscribing to a topic:",[71,72,73,324,418],"code-tabs",{},[50,74,79],{"className":75,"code":76,"filename":77,"language":78,"meta":56,"style":56},"language-typescript shiki shiki-themes github-light github-dark","import { NoLag } from '@nolag/js-sdk'\n\nconst client = NoLag('your_access_token')\nawait client.connect()\n\nconst room = client.setApp('dashboard').setRoom('ops')\n\n// Subscribe with filters: only receive updates for these bookings\nroom.subscribe('bookings', {\n  filters: ['booking_1', 'booking_2']\n})\n\n// Listen for messages (only matching filters arrive)\nroom.on('bookings', (data, meta) => {\n  console.log('Booking update:', data)\n  console.log('Filter:', meta.filter)  // e.g. 'booking_1'\n})\n","TypeScript","typescript",[34,80,81,101,108,134,149,154,187,192,199,216,234,240,245,251,284,301,319],{"__ignoreMap":56},[82,83,86,90,94,97],"span",{"class":84,"line":85},"line",1,[82,87,89],{"class":88},"szBVR","import",[82,91,93],{"class":92},"sVt8B"," { NoLag } ",[82,95,96],{"class":88},"from",[82,98,100],{"class":99},"sZZnC"," '@nolag/js-sdk'\n",[82,102,104],{"class":84,"line":103},2,[82,105,107],{"emptyLinePlaceholder":106},true,"\n",[82,109,111,114,118,121,125,128,131],{"class":84,"line":110},3,[82,112,113],{"class":88},"const",[82,115,117],{"class":116},"sj4cs"," client",[82,119,120],{"class":88}," =",[82,122,124],{"class":123},"sScJk"," NoLag",[82,126,127],{"class":92},"(",[82,129,130],{"class":99},"'your_access_token'",[82,132,133],{"class":92},")\n",[82,135,137,140,143,146],{"class":84,"line":136},4,[82,138,139],{"class":88},"await",[82,141,142],{"class":92}," client.",[82,144,145],{"class":123},"connect",[82,147,148],{"class":92},"()\n",[82,150,152],{"class":84,"line":151},5,[82,153,107],{"emptyLinePlaceholder":106},[82,155,157,159,162,164,166,169,171,174,177,180,182,185],{"class":84,"line":156},6,[82,158,113],{"class":88},[82,160,161],{"class":116}," room",[82,163,120],{"class":88},[82,165,142],{"class":92},[82,167,168],{"class":123},"setApp",[82,170,127],{"class":92},[82,172,173],{"class":99},"'dashboard'",[82,175,176],{"class":92},").",[82,178,179],{"class":123},"setRoom",[82,181,127],{"class":92},[82,183,184],{"class":99},"'ops'",[82,186,133],{"class":92},[82,188,190],{"class":84,"line":189},7,[82,191,107],{"emptyLinePlaceholder":106},[82,193,195],{"class":84,"line":194},8,[82,196,198],{"class":197},"sJ8bj","// Subscribe with filters: only receive updates for these bookings\n",[82,200,202,205,208,210,213],{"class":84,"line":201},9,[82,203,204],{"class":92},"room.",[82,206,207],{"class":123},"subscribe",[82,209,127],{"class":92},[82,211,212],{"class":99},"'bookings'",[82,214,215],{"class":92},", {\n",[82,217,219,222,225,228,231],{"class":84,"line":218},10,[82,220,221],{"class":92},"  filters: [",[82,223,224],{"class":99},"'booking_1'",[82,226,227],{"class":92},", ",[82,229,230],{"class":99},"'booking_2'",[82,232,233],{"class":92},"]\n",[82,235,237],{"class":84,"line":236},11,[82,238,239],{"class":92},"})\n",[82,241,243],{"class":84,"line":242},12,[82,244,107],{"emptyLinePlaceholder":106},[82,246,248],{"class":84,"line":247},13,[82,249,250],{"class":197},"// Listen for messages (only matching filters arrive)\n",[82,252,254,256,259,261,263,266,270,272,275,278,281],{"class":84,"line":253},14,[82,255,204],{"class":92},[82,257,258],{"class":123},"on",[82,260,127],{"class":92},[82,262,212],{"class":99},[82,264,265],{"class":92},", (",[82,267,269],{"class":268},"s4XuR","data",[82,271,227],{"class":92},[82,273,274],{"class":268},"meta",[82,276,277],{"class":92},") ",[82,279,280],{"class":88},"=>",[82,282,283],{"class":92}," {\n",[82,285,287,290,293,295,298],{"class":84,"line":286},15,[82,288,289],{"class":92},"  console.",[82,291,292],{"class":123},"log",[82,294,127],{"class":92},[82,296,297],{"class":99},"'Booking update:'",[82,299,300],{"class":92},", data)\n",[82,302,304,306,308,310,313,316],{"class":84,"line":303},16,[82,305,289],{"class":92},[82,307,292],{"class":123},[82,309,127],{"class":92},[82,311,312],{"class":99},"'Filter:'",[82,314,315],{"class":92},", meta.filter)  ",[82,317,318],{"class":197},"// e.g. 'booking_1'\n",[82,320,322],{"class":84,"line":321},17,[82,323,239],{"class":92},[50,325,330],{"className":326,"code":327,"filename":328,"language":329,"meta":56,"style":56},"language-python shiki shiki-themes github-light github-dark","from nolag import NoLag, SubscribeOptions\n\nclient = NoLag('your_access_token')\nawait client.connect()\n\nroom = client.set_app('dashboard').set_room('ops')\n\n# Subscribe with filters\nawait room.subscribe('bookings', SubscribeOptions(\n    filters=['booking_1', 'booking_2']\n))\n\n# Listen for messages\ndef handle_booking(data, meta):\n    print('Booking update:', data)\n    print('Filter:', meta.filter)\n\nroom.on('bookings', handle_booking)\n","Python","python",[34,331,332,337,341,346,351,355,360,364,369,374,379,384,388,393,398,403,408,412],{"__ignoreMap":56},[82,333,334],{"class":84,"line":85},[82,335,336],{},"from nolag import NoLag, SubscribeOptions\n",[82,338,339],{"class":84,"line":103},[82,340,107],{"emptyLinePlaceholder":106},[82,342,343],{"class":84,"line":110},[82,344,345],{},"client = NoLag('your_access_token')\n",[82,347,348],{"class":84,"line":136},[82,349,350],{},"await client.connect()\n",[82,352,353],{"class":84,"line":151},[82,354,107],{"emptyLinePlaceholder":106},[82,356,357],{"class":84,"line":156},[82,358,359],{},"room = client.set_app('dashboard').set_room('ops')\n",[82,361,362],{"class":84,"line":189},[82,363,107],{"emptyLinePlaceholder":106},[82,365,366],{"class":84,"line":194},[82,367,368],{},"# Subscribe with filters\n",[82,370,371],{"class":84,"line":201},[82,372,373],{},"await room.subscribe('bookings', SubscribeOptions(\n",[82,375,376],{"class":84,"line":218},[82,377,378],{},"    filters=['booking_1', 'booking_2']\n",[82,380,381],{"class":84,"line":236},[82,382,383],{},"))\n",[82,385,386],{"class":84,"line":242},[82,387,107],{"emptyLinePlaceholder":106},[82,389,390],{"class":84,"line":247},[82,391,392],{},"# Listen for messages\n",[82,394,395],{"class":84,"line":253},[82,396,397],{},"def handle_booking(data, meta):\n",[82,399,400],{"class":84,"line":286},[82,401,402],{},"    print('Booking update:', data)\n",[82,404,405],{"class":84,"line":303},[82,406,407],{},"    print('Filter:', meta.filter)\n",[82,409,410],{"class":84,"line":321},[82,411,107],{"emptyLinePlaceholder":106},[82,413,415],{"class":84,"line":414},18,[82,416,417],{},"room.on('bookings', handle_booking)\n",[50,419,424],{"className":420,"code":421,"filename":422,"language":423,"meta":56,"style":56},"language-go shiki shiki-themes github-light github-dark","package main\n\nnolag \"github.com/NoLagApp/go-sdk\"\n\nfunc main() {\n    client := nolag.New(\"your_access_token\")\n    client.Connect()\n\n    room := client.SetApp(\"dashboard\").SetRoom(\"ops\")\n\n    // Subscribe with filters and handler\n    room.Subscribe(\"bookings\", func(data any, meta nolag.MessageMeta) {\n        fmt.Println(\"Booking update:\", data)\n        fmt.Println(\"Filter:\", meta.Filter)\n    }, nolag.SubscribeOptions{\n        Filters: []string{\"booking_1\", \"booking_2\"},\n    })\n}\n","Go","go",[34,425,426,431,435,440,444,449,454,459,463,468,472,477,482,487,492,497,502,507],{"__ignoreMap":56},[82,427,428],{"class":84,"line":85},[82,429,430],{},"package main\n",[82,432,433],{"class":84,"line":103},[82,434,107],{"emptyLinePlaceholder":106},[82,436,437],{"class":84,"line":110},[82,438,439],{},"nolag \"github.com/NoLagApp/go-sdk\"\n",[82,441,442],{"class":84,"line":136},[82,443,107],{"emptyLinePlaceholder":106},[82,445,446],{"class":84,"line":151},[82,447,448],{},"func main() {\n",[82,450,451],{"class":84,"line":156},[82,452,453],{},"    client := nolag.New(\"your_access_token\")\n",[82,455,456],{"class":84,"line":189},[82,457,458],{},"    client.Connect()\n",[82,460,461],{"class":84,"line":194},[82,462,107],{"emptyLinePlaceholder":106},[82,464,465],{"class":84,"line":201},[82,466,467],{},"    room := client.SetApp(\"dashboard\").SetRoom(\"ops\")\n",[82,469,470],{"class":84,"line":218},[82,471,107],{"emptyLinePlaceholder":106},[82,473,474],{"class":84,"line":236},[82,475,476],{},"    // Subscribe with filters and handler\n",[82,478,479],{"class":84,"line":242},[82,480,481],{},"    room.Subscribe(\"bookings\", func(data any, meta nolag.MessageMeta) {\n",[82,483,484],{"class":84,"line":247},[82,485,486],{},"        fmt.Println(\"Booking update:\", data)\n",[82,488,489],{"class":84,"line":253},[82,490,491],{},"        fmt.Println(\"Filter:\", meta.Filter)\n",[82,493,494],{"class":84,"line":286},[82,495,496],{},"    }, nolag.SubscribeOptions{\n",[82,498,499],{"class":84,"line":303},[82,500,501],{},"        Filters: []string{\"booking_1\", \"booking_2\"},\n",[82,503,504],{"class":84,"line":321},[82,505,506],{},"    })\n",[82,508,509],{"class":84,"line":414},[82,510,511],{},"}\n",[18,513,515],{"id":514},"dynamic-filter-management","Dynamic Filter Management",[14,517,518,519,522],{},"Change filters at any time without unsubscribing and resubscribing. New filters are subscribed ",[26,520,521],{},"before"," old ones are removed to minimize message gaps.",[71,524,525,645,712],{},[50,526,528],{"className":75,"code":527,"filename":77,"language":78,"meta":56,"style":56},"// Replace all filters (full swap)\nroom.setFilters('bookings', ['booking_3', 'booking_4'])\n\n// Add filters to existing set\nroom.addFilters('bookings', ['booking_5'])\n// Now active: ['booking_3', 'booking_4', 'booking_5']\n\n// Remove specific filters\nroom.removeFilters('bookings', ['booking_3'])\n// Now active: ['booking_4', 'booking_5']\n\n// Remove all filters (switch to wildcard, receives everything)\nroom.setFilters('bookings', [])\n",[34,529,530,535,560,564,569,587,592,596,601,618,623,627,632],{"__ignoreMap":56},[82,531,532],{"class":84,"line":85},[82,533,534],{"class":197},"// Replace all filters (full swap)\n",[82,536,537,539,542,544,546,549,552,554,557],{"class":84,"line":103},[82,538,204],{"class":92},[82,540,541],{"class":123},"setFilters",[82,543,127],{"class":92},[82,545,212],{"class":99},[82,547,548],{"class":92},", [",[82,550,551],{"class":99},"'booking_3'",[82,553,227],{"class":92},[82,555,556],{"class":99},"'booking_4'",[82,558,559],{"class":92},"])\n",[82,561,562],{"class":84,"line":110},[82,563,107],{"emptyLinePlaceholder":106},[82,565,566],{"class":84,"line":136},[82,567,568],{"class":197},"// Add filters to existing set\n",[82,570,571,573,576,578,580,582,585],{"class":84,"line":151},[82,572,204],{"class":92},[82,574,575],{"class":123},"addFilters",[82,577,127],{"class":92},[82,579,212],{"class":99},[82,581,548],{"class":92},[82,583,584],{"class":99},"'booking_5'",[82,586,559],{"class":92},[82,588,589],{"class":84,"line":156},[82,590,591],{"class":197},"// Now active: ['booking_3', 'booking_4', 'booking_5']\n",[82,593,594],{"class":84,"line":189},[82,595,107],{"emptyLinePlaceholder":106},[82,597,598],{"class":84,"line":194},[82,599,600],{"class":197},"// Remove specific filters\n",[82,602,603,605,608,610,612,614,616],{"class":84,"line":201},[82,604,204],{"class":92},[82,606,607],{"class":123},"removeFilters",[82,609,127],{"class":92},[82,611,212],{"class":99},[82,613,548],{"class":92},[82,615,551],{"class":99},[82,617,559],{"class":92},[82,619,620],{"class":84,"line":218},[82,621,622],{"class":197},"// Now active: ['booking_4', 'booking_5']\n",[82,624,625],{"class":84,"line":236},[82,626,107],{"emptyLinePlaceholder":106},[82,628,629],{"class":84,"line":242},[82,630,631],{"class":197},"// Remove all filters (switch to wildcard, receives everything)\n",[82,633,634,636,638,640,642],{"class":84,"line":247},[82,635,204],{"class":92},[82,637,541],{"class":123},[82,639,127],{"class":92},[82,641,212],{"class":99},[82,643,644],{"class":92},", [])\n",[50,646,648],{"className":326,"code":647,"filename":328,"language":329,"meta":56,"style":56},"# Replace all filters (full swap)\nawait room.set_filters('bookings', ['booking_3', 'booking_4'])\n\n# Add filters to existing set\nawait room.add_filters('bookings', ['booking_5'])\n# Now active: ['booking_3', 'booking_4', 'booking_5']\n\n# Remove specific filters\nawait room.remove_filters('bookings', ['booking_3'])\n# Now active: ['booking_4', 'booking_5']\n\n# Remove all filters (switch to wildcard)\nawait room.set_filters('bookings', [])\n",[34,649,650,655,660,664,669,674,679,683,688,693,698,702,707],{"__ignoreMap":56},[82,651,652],{"class":84,"line":85},[82,653,654],{},"# Replace all filters (full swap)\n",[82,656,657],{"class":84,"line":103},[82,658,659],{},"await room.set_filters('bookings', ['booking_3', 'booking_4'])\n",[82,661,662],{"class":84,"line":110},[82,663,107],{"emptyLinePlaceholder":106},[82,665,666],{"class":84,"line":136},[82,667,668],{},"# Add filters to existing set\n",[82,670,671],{"class":84,"line":151},[82,672,673],{},"await room.add_filters('bookings', ['booking_5'])\n",[82,675,676],{"class":84,"line":156},[82,677,678],{},"# Now active: ['booking_3', 'booking_4', 'booking_5']\n",[82,680,681],{"class":84,"line":189},[82,682,107],{"emptyLinePlaceholder":106},[82,684,685],{"class":84,"line":194},[82,686,687],{},"# Remove specific filters\n",[82,689,690],{"class":84,"line":201},[82,691,692],{},"await room.remove_filters('bookings', ['booking_3'])\n",[82,694,695],{"class":84,"line":218},[82,696,697],{},"# Now active: ['booking_4', 'booking_5']\n",[82,699,700],{"class":84,"line":236},[82,701,107],{"emptyLinePlaceholder":106},[82,703,704],{"class":84,"line":242},[82,705,706],{},"# Remove all filters (switch to wildcard)\n",[82,708,709],{"class":84,"line":247},[82,710,711],{},"await room.set_filters('bookings', [])\n",[50,713,715],{"className":420,"code":714,"filename":422,"language":423,"meta":56,"style":56},"// Replace all filters (full swap)\nroom.SetFilters(\"bookings\", []string{\"booking_3\", \"booking_4\"})\n\n// Add filters to existing set\nroom.AddFilters(\"bookings\", []string{\"booking_5\"})\n// Now active: [\"booking_3\", \"booking_4\", \"booking_5\"]\n\n// Remove specific filters\nroom.RemoveFilters(\"bookings\", []string{\"booking_3\"})\n// Now active: [\"booking_4\", \"booking_5\"]\n\n// Remove all filters (switch to wildcard)\nroom.SetFilters(\"bookings\", []string{})\n",[34,716,717,721,726,730,734,739,744,748,752,757,762,766,771],{"__ignoreMap":56},[82,718,719],{"class":84,"line":85},[82,720,534],{},[82,722,723],{"class":84,"line":103},[82,724,725],{},"room.SetFilters(\"bookings\", []string{\"booking_3\", \"booking_4\"})\n",[82,727,728],{"class":84,"line":110},[82,729,107],{"emptyLinePlaceholder":106},[82,731,732],{"class":84,"line":136},[82,733,568],{},[82,735,736],{"class":84,"line":151},[82,737,738],{},"room.AddFilters(\"bookings\", []string{\"booking_5\"})\n",[82,740,741],{"class":84,"line":156},[82,742,743],{},"// Now active: [\"booking_3\", \"booking_4\", \"booking_5\"]\n",[82,745,746],{"class":84,"line":189},[82,747,107],{"emptyLinePlaceholder":106},[82,749,750],{"class":84,"line":194},[82,751,600],{},[82,753,754],{"class":84,"line":201},[82,755,756],{},"room.RemoveFilters(\"bookings\", []string{\"booking_3\"})\n",[82,758,759],{"class":84,"line":218},[82,760,761],{},"// Now active: [\"booking_4\", \"booking_5\"]\n",[82,763,764],{"class":84,"line":236},[82,765,107],{"emptyLinePlaceholder":106},[82,767,768],{"class":84,"line":242},[82,769,770],{},"// Remove all filters (switch to wildcard)\n",[82,772,773],{"class":84,"line":247},[82,774,775],{},"room.SetFilters(\"bookings\", []string{})\n",[18,777,779],{"id":778},"publishing-with-filters","Publishing with Filters",[14,781,782,783,786],{},"Specify a ",[34,784,785],{},"filter"," when publishing to target specific subscribers:",[71,788,789,874,931],{},[50,790,792],{"className":75,"code":791,"filename":77,"language":78,"meta":56,"style":56},"// Publish to a specific filter\nroom.emit('bookings', { status: 'confirmed' }, {\n  filter: 'booking_1'\n})\n// Only subscribers with 'booking_1' in their filters receive this\n\n// Publish without a filter\nroom.emit('bookings', { type: 'system_update' })\n// Only wildcard subscribers (no filters) receive this\n// Filtered subscribers do NOT receive filterless publishes\n",[34,793,794,799,819,827,831,836,840,845,864,869],{"__ignoreMap":56},[82,795,796],{"class":84,"line":85},[82,797,798],{"class":197},"// Publish to a specific filter\n",[82,800,801,803,806,808,810,813,816],{"class":84,"line":103},[82,802,204],{"class":92},[82,804,805],{"class":123},"emit",[82,807,127],{"class":92},[82,809,212],{"class":99},[82,811,812],{"class":92},", { status: ",[82,814,815],{"class":99},"'confirmed'",[82,817,818],{"class":92}," }, {\n",[82,820,821,824],{"class":84,"line":110},[82,822,823],{"class":92},"  filter: ",[82,825,826],{"class":99},"'booking_1'\n",[82,828,829],{"class":84,"line":136},[82,830,239],{"class":92},[82,832,833],{"class":84,"line":151},[82,834,835],{"class":197},"// Only subscribers with 'booking_1' in their filters receive this\n",[82,837,838],{"class":84,"line":156},[82,839,107],{"emptyLinePlaceholder":106},[82,841,842],{"class":84,"line":189},[82,843,844],{"class":197},"// Publish without a filter\n",[82,846,847,849,851,853,855,858,861],{"class":84,"line":194},[82,848,204],{"class":92},[82,850,805],{"class":123},[82,852,127],{"class":92},[82,854,212],{"class":99},[82,856,857],{"class":92},", { type: ",[82,859,860],{"class":99},"'system_update'",[82,862,863],{"class":92}," })\n",[82,865,866],{"class":84,"line":201},[82,867,868],{"class":197},"// Only wildcard subscribers (no filters) receive this\n",[82,870,871],{"class":84,"line":218},[82,872,873],{"class":197},"// Filtered subscribers do NOT receive filterless publishes\n",[50,875,877],{"className":326,"code":876,"filename":328,"language":329,"meta":56,"style":56},"from nolag import EmitOptions\n\n# Publish to a specific filter\nawait room.emit('bookings', {'status': 'confirmed'}, EmitOptions(\n    filter='booking_1'\n))\n# Only subscribers with 'booking_1' in their filters receive this\n\n# Publish without a filter\nawait room.emit('bookings', {'type': 'system_update'})\n# Only wildcard subscribers (no filters) receive this\n",[34,878,879,884,888,893,898,903,907,912,916,921,926],{"__ignoreMap":56},[82,880,881],{"class":84,"line":85},[82,882,883],{},"from nolag import EmitOptions\n",[82,885,886],{"class":84,"line":103},[82,887,107],{"emptyLinePlaceholder":106},[82,889,890],{"class":84,"line":110},[82,891,892],{},"# Publish to a specific filter\n",[82,894,895],{"class":84,"line":136},[82,896,897],{},"await room.emit('bookings', {'status': 'confirmed'}, EmitOptions(\n",[82,899,900],{"class":84,"line":151},[82,901,902],{},"    filter='booking_1'\n",[82,904,905],{"class":84,"line":156},[82,906,383],{},[82,908,909],{"class":84,"line":189},[82,910,911],{},"# Only subscribers with 'booking_1' in their filters receive this\n",[82,913,914],{"class":84,"line":194},[82,915,107],{"emptyLinePlaceholder":106},[82,917,918],{"class":84,"line":201},[82,919,920],{},"# Publish without a filter\n",[82,922,923],{"class":84,"line":218},[82,924,925],{},"await room.emit('bookings', {'type': 'system_update'})\n",[82,927,928],{"class":84,"line":236},[82,929,930],{},"# Only wildcard subscribers (no filters) receive this\n",[50,932,934],{"className":420,"code":933,"filename":422,"language":423,"meta":56,"style":56},"// Publish to a specific filter\nroom.Emit(\"bookings\", map[string]string{\"status\": \"confirmed\"}, nolag.EmitOptions{\n    Filter: \"booking_1\",\n})\n// Only subscribers with \"booking_1\" in their filters receive this\n\n// Publish without a filter\nroom.Emit(\"bookings\", map[string]string{\"type\": \"system_update\"})\n// Only wildcard subscribers (no filters) receive this\n",[34,935,936,940,945,950,954,959,963,967,972],{"__ignoreMap":56},[82,937,938],{"class":84,"line":85},[82,939,798],{},[82,941,942],{"class":84,"line":103},[82,943,944],{},"room.Emit(\"bookings\", map[string]string{\"status\": \"confirmed\"}, nolag.EmitOptions{\n",[82,946,947],{"class":84,"line":110},[82,948,949],{},"    Filter: \"booking_1\",\n",[82,951,952],{"class":84,"line":136},[82,953,239],{},[82,955,956],{"class":84,"line":151},[82,957,958],{},"// Only subscribers with \"booking_1\" in their filters receive this\n",[82,960,961],{"class":84,"line":156},[82,962,107],{"emptyLinePlaceholder":106},[82,964,965],{"class":84,"line":189},[82,966,844],{},[82,968,969],{"class":84,"line":194},[82,970,971],{},"room.Emit(\"bookings\", map[string]string{\"type\": \"system_update\"})\n",[82,973,974],{"class":84,"line":201},[82,975,868],{},[977,978,980],"callout",{"type":979},"warning",[14,981,982,985],{},[26,983,984],{},"Important:"," Messages published without a filter are only delivered to wildcard (no-filter) subscribers. Filtered subscribers do NOT receive filterless publishes. Use a separate topic for broadcasts if needed.",[18,987,989],{"id":988},"example-real-time-dashboard","Example: Real-time Dashboard",[14,991,992],{},"The most common use case for filters is dashboards where users view a subset of entities that update in real-time:",[71,994,995],{},[50,996,998],{"className":75,"code":997,"filename":77,"language":78,"meta":56,"style":56},"// Real-time dashboard: user views 3 bookings out of thousands\nconst room = client.setApp('dashboard').setRoom('ops')\n\n// Subscribe only to the bookings currently visible\nconst visibleBookingIds = ['booking_42', 'booking_87', 'booking_153']\nroom.subscribe('bookings', {\n  filters: visibleBookingIds\n})\n\nroom.on('bookings', (data, meta) => {\n  updateBookingCard(meta.filter, data)\n})\n\n// User navigates to a different page of bookings\nfunction onPageChange(newBookingIds: string[]) {\n  room.setFilters('bookings', newBookingIds)\n}\n\n// User opens a booking detail view, add it to filters\nfunction onBookingOpen(bookingId: string) {\n  room.addFilters('bookings', [bookingId])\n}\n\n// User closes a booking detail view, remove it\nfunction onBookingClose(bookingId: string) {\n  room.removeFilters('bookings', [bookingId])\n}\n",[34,999,1000,1005,1031,1035,1040,1067,1079,1084,1088,1092,1116,1124,1128,1132,1137,1159,1173,1177,1181,1187,1207,1221,1226,1231,1237,1255,1268],{"__ignoreMap":56},[82,1001,1002],{"class":84,"line":85},[82,1003,1004],{"class":197},"// Real-time dashboard: user views 3 bookings out of thousands\n",[82,1006,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029],{"class":84,"line":103},[82,1008,113],{"class":88},[82,1010,161],{"class":116},[82,1012,120],{"class":88},[82,1014,142],{"class":92},[82,1016,168],{"class":123},[82,1018,127],{"class":92},[82,1020,173],{"class":99},[82,1022,176],{"class":92},[82,1024,179],{"class":123},[82,1026,127],{"class":92},[82,1028,184],{"class":99},[82,1030,133],{"class":92},[82,1032,1033],{"class":84,"line":110},[82,1034,107],{"emptyLinePlaceholder":106},[82,1036,1037],{"class":84,"line":136},[82,1038,1039],{"class":197},"// Subscribe only to the bookings currently visible\n",[82,1041,1042,1044,1047,1049,1052,1055,1057,1060,1062,1065],{"class":84,"line":151},[82,1043,113],{"class":88},[82,1045,1046],{"class":116}," visibleBookingIds",[82,1048,120],{"class":88},[82,1050,1051],{"class":92}," [",[82,1053,1054],{"class":99},"'booking_42'",[82,1056,227],{"class":92},[82,1058,1059],{"class":99},"'booking_87'",[82,1061,227],{"class":92},[82,1063,1064],{"class":99},"'booking_153'",[82,1066,233],{"class":92},[82,1068,1069,1071,1073,1075,1077],{"class":84,"line":156},[82,1070,204],{"class":92},[82,1072,207],{"class":123},[82,1074,127],{"class":92},[82,1076,212],{"class":99},[82,1078,215],{"class":92},[82,1080,1081],{"class":84,"line":189},[82,1082,1083],{"class":92},"  filters: visibleBookingIds\n",[82,1085,1086],{"class":84,"line":194},[82,1087,239],{"class":92},[82,1089,1090],{"class":84,"line":201},[82,1091,107],{"emptyLinePlaceholder":106},[82,1093,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114],{"class":84,"line":218},[82,1095,204],{"class":92},[82,1097,258],{"class":123},[82,1099,127],{"class":92},[82,1101,212],{"class":99},[82,1103,265],{"class":92},[82,1105,269],{"class":268},[82,1107,227],{"class":92},[82,1109,274],{"class":268},[82,1111,277],{"class":92},[82,1113,280],{"class":88},[82,1115,283],{"class":92},[82,1117,1118,1121],{"class":84,"line":236},[82,1119,1120],{"class":123},"  updateBookingCard",[82,1122,1123],{"class":92},"(meta.filter, data)\n",[82,1125,1126],{"class":84,"line":242},[82,1127,239],{"class":92},[82,1129,1130],{"class":84,"line":247},[82,1131,107],{"emptyLinePlaceholder":106},[82,1133,1134],{"class":84,"line":253},[82,1135,1136],{"class":197},"// User navigates to a different page of bookings\n",[82,1138,1139,1142,1145,1147,1150,1153,1156],{"class":84,"line":286},[82,1140,1141],{"class":88},"function",[82,1143,1144],{"class":123}," onPageChange",[82,1146,127],{"class":92},[82,1148,1149],{"class":268},"newBookingIds",[82,1151,1152],{"class":88},":",[82,1154,1155],{"class":116}," string",[82,1157,1158],{"class":92},"[]) {\n",[82,1160,1161,1164,1166,1168,1170],{"class":84,"line":303},[82,1162,1163],{"class":92},"  room.",[82,1165,541],{"class":123},[82,1167,127],{"class":92},[82,1169,212],{"class":99},[82,1171,1172],{"class":92},", newBookingIds)\n",[82,1174,1175],{"class":84,"line":321},[82,1176,511],{"class":92},[82,1178,1179],{"class":84,"line":414},[82,1180,107],{"emptyLinePlaceholder":106},[82,1182,1184],{"class":84,"line":1183},19,[82,1185,1186],{"class":197},"// User opens a booking detail view, add it to filters\n",[82,1188,1190,1192,1195,1197,1200,1202,1204],{"class":84,"line":1189},20,[82,1191,1141],{"class":88},[82,1193,1194],{"class":123}," onBookingOpen",[82,1196,127],{"class":92},[82,1198,1199],{"class":268},"bookingId",[82,1201,1152],{"class":88},[82,1203,1155],{"class":116},[82,1205,1206],{"class":92},") {\n",[82,1208,1210,1212,1214,1216,1218],{"class":84,"line":1209},21,[82,1211,1163],{"class":92},[82,1213,575],{"class":123},[82,1215,127],{"class":92},[82,1217,212],{"class":99},[82,1219,1220],{"class":92},", [bookingId])\n",[82,1222,1224],{"class":84,"line":1223},22,[82,1225,511],{"class":92},[82,1227,1229],{"class":84,"line":1228},23,[82,1230,107],{"emptyLinePlaceholder":106},[82,1232,1234],{"class":84,"line":1233},24,[82,1235,1236],{"class":197},"// User closes a booking detail view, remove it\n",[82,1238,1240,1242,1245,1247,1249,1251,1253],{"class":84,"line":1239},25,[82,1241,1141],{"class":88},[82,1243,1244],{"class":123}," onBookingClose",[82,1246,127],{"class":92},[82,1248,1199],{"class":268},[82,1250,1152],{"class":88},[82,1252,1155],{"class":116},[82,1254,1206],{"class":92},[82,1256,1258,1260,1262,1264,1266],{"class":84,"line":1257},26,[82,1259,1163],{"class":92},[82,1261,607],{"class":123},[82,1263,127],{"class":92},[82,1265,212],{"class":99},[82,1267,1220],{"class":92},[82,1269,1271],{"class":84,"line":1270},27,[82,1272,511],{"class":92},[18,1274,1276],{"id":1275},"filter-rules","Filter Rules",[1278,1279,1280,1287,1305,1312,1319],"ul",{},[1281,1282,1283,1286],"li",{},[26,1284,1285],{},"Max 100 filters"," per topic per connection",[1281,1288,1289,1290,1293,1294,227,1297,1300,1301,1304],{},"Filter values must ",[26,1291,1292],{},"not"," contain ",[34,1295,1296],{},"/",[34,1298,1299],{},"#",", or ",[34,1302,1303],{},"+"," (reserved characters)",[1281,1306,1307,1308,1311],{},"Filters are ",[26,1309,1310],{},"persisted",", on reconnect, your filters are automatically restored",[1281,1313,1314,1315,1318],{},"Filters work with ",[26,1316,1317],{},"load balancing",", each filter topic uses the shared subscription group",[1281,1320,1321,1322,1325],{},"Setting filters to an empty array switches back to ",[26,1323,1324],{},"wildcard mode"," (receives everything)",[18,1327,1329],{"id":1328},"filters-vs-wildcards","Filters vs Wildcards",[1331,1332,1333,1346],"table",{},[1334,1335,1336],"thead",{},[1337,1338,1339,1343],"tr",{},[1340,1341,1342],"th",{},"Scenario",[1340,1344,1345],{},"Approach",[1347,1348,1349,1358,1366,1380],"tbody",{},[1337,1350,1351,1355],{},[1352,1353,1354],"td",{},"Receive all messages on a topic",[1352,1356,1357],{},"Subscribe without filters (wildcard)",[1337,1359,1360,1363],{},[1352,1361,1362],{},"Receive updates for specific entities",[1352,1364,1365],{},"Subscribe with filters",[1337,1367,1368,1371],{},[1352,1369,1370],{},"Change which entities to track",[1352,1372,1373,1375,1376,1375,1378],{},[34,1374,541],{}," / ",[34,1377,575],{},[34,1379,607],{},[1337,1381,1382,1385],{},[1352,1383,1384],{},"Broadcast to all subscribers",[1352,1386,1387],{},"Use a separate topic (filtered subscribers won't receive filterless publishes)",[18,1389,1391],{"id":1390},"next-steps","Next Steps",[1278,1393,1394,1401,1407,1413],{},[1281,1395,1396],{},[1397,1398,1400],"a",{"href":1399},"/docs/concepts/topics","Topics & Pub/Sub",[1281,1402,1403],{},[1397,1404,1406],{"href":1405},"/docs/concepts/rooms","Rooms",[1281,1408,1409],{},[1397,1410,1412],{"href":1411},"/docs/sdks/javascript","JavaScript SDK Reference",[1281,1414,1415],{},[1397,1416,1418],{"href":1417},"/docs/guides/dashboards","Live Dashboards Guide",[1420,1421,1422],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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);}",{"title":56,"searchDepth":103,"depth":103,"links":1424},[1425,1426,1427,1428,1429,1430,1431,1432,1433],{"id":20,"depth":103,"text":21},{"id":44,"depth":103,"text":45},{"id":61,"depth":103,"text":62},{"id":514,"depth":103,"text":515},{"id":778,"depth":103,"text":779},{"id":988,"depth":103,"text":989},{"id":1275,"depth":103,"text":1276},{"id":1328,"depth":103,"text":1329},{"id":1390,"depth":103,"text":1391},"Learn how to use topic filters to narrow message delivery to specific entities. Subscribe with filters, manage them dynamically, and publish to filtered subscribers.","md",{},"/docs/concepts/filters",{"title":5,"description":1434},"docs/concepts/filters","rO1xCvX4Y4fk_-9SfrP-a1wxGdoIdoiO3cfr46bVA0Y",1788160342792]