[{"data":1,"prerenderedAt":782},["ShallowReactive",2],{"navigation_docs":3,"-apps-services-streaming":196,"-apps-services-streaming-surround":777},[4,127,166],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Kinotic Apps","i-lucide-rocket","\u002Fapps","1.apps",[10,14,18,37,58,91,106,122],{"title":11,"path":12,"stem":13},"Introduction","\u002Fapps\u002Fintroduction","1.apps\u002F1.introduction",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fapps\u002Fquick-start","1.apps\u002F2.quick-start",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":36},"Application Structure","i-lucide-folder-tree","\u002Fapps\u002Fapplication-structure","1.apps\u002F3.application-structure",[24,28,32],{"title":25,"path":26,"stem":27},"Overview","\u002Fapps\u002Fapplication-structure\u002Foverview","1.apps\u002F3.application-structure\u002F1.overview",{"title":29,"path":30,"stem":31},"Applications and Projects","\u002Fapps\u002Fapplication-structure\u002Fapplications-and-projects","1.apps\u002F3.application-structure\u002F2.applications-and-projects",{"title":33,"path":34,"stem":35},"Artifact Types","\u002Fapps\u002Fapplication-structure\u002Fartifact-types","1.apps\u002F3.application-structure\u002F3.artifact-types",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Services","i-lucide-network","\u002Fapps\u002Fservices","1.apps\u002F4.services",[43,46,50,54],{"title":25,"path":44,"stem":45},"\u002Fapps\u002Fservices\u002Foverview","1.apps\u002F4.services\u002F1.overview",{"title":47,"path":48,"stem":49},"Publishing Services","\u002Fapps\u002Fservices\u002Fpublishing-services","1.apps\u002F4.services\u002F2.publishing-services",{"title":51,"path":52,"stem":53},"Service Proxies","\u002Fapps\u002Fservices\u002Fservice-proxies","1.apps\u002F4.services\u002F3.service-proxies",{"title":55,"path":56,"stem":57},"Streaming","\u002Fapps\u002Fservices\u002Fstreaming","1.apps\u002F4.services\u002F4.streaming",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"Persistence","i-lucide-database","\u002Fapps\u002Fpersistence","1.apps\u002F5.persistence",[64,67,71,75,79,83,87],{"title":25,"path":65,"stem":66},"\u002Fapps\u002Fpersistence\u002Foverview","1.apps\u002F5.persistence\u002F1.overview",{"title":68,"path":69,"stem":70},"Defining Entities","\u002Fapps\u002Fpersistence\u002Fdefining-entities","1.apps\u002F5.persistence\u002F2.defining-entities",{"title":72,"path":73,"stem":74},"Entity Decorators","\u002Fapps\u002Fpersistence\u002Fentity-decorators","1.apps\u002F5.persistence\u002F3.entity-decorators",{"title":76,"path":77,"stem":78},"CRUD Operations","\u002Fapps\u002Fpersistence\u002Fcrud-operations","1.apps\u002F5.persistence\u002F4.crud-operations",{"title":80,"path":81,"stem":82},"Named Queries","\u002Fapps\u002Fpersistence\u002Fnamed-queries","1.apps\u002F5.persistence\u002F5.named-queries",{"title":84,"path":85,"stem":86},"Multi-Tenancy","\u002Fapps\u002Fpersistence\u002Fmulti-tenancy","1.apps\u002F5.persistence\u002F6.multi-tenancy",{"title":88,"path":89,"stem":90},"Migrations","\u002Fapps\u002Fpersistence\u002Fmigrations","1.apps\u002F5.persistence\u002F7.migrations",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":36},"Security","i-lucide-shield-check","\u002Fapps\u002Fsecurity","1.apps\u002F6.security",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Access Control","\u002Fapps\u002Fsecurity\u002Faccess-control","1.apps\u002F6.security\u002F1.access-control",{"title":102,"path":103,"stem":104,"icon":105},"Authentication","\u002Fapps\u002Fsecurity\u002Fauthentication","1.apps\u002F6.security\u002F2.authentication","i-lucide-key-round",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":36},"Deployment","i-lucide-cloud-upload","\u002Fapps\u002Fdeployment","1.apps\u002F7.deployment",[112,117],{"title":113,"path":114,"stem":115,"icon":116},"Deployment Workflow","\u002Fapps\u002Fdeployment\u002Fworkflow","1.apps\u002F7.deployment\u002F1.workflow","i-lucide-git-branch",{"title":118,"path":119,"stem":120,"icon":121},"Environments","\u002Fapps\u002Fdeployment\u002Fenvironments","1.apps\u002F7.deployment\u002F2.environments","i-lucide-server",{"title":123,"path":124,"stem":125,"icon":126},"CLI Reference","\u002Fapps\u002Fcli-reference","1.apps\u002F8.cli-reference","i-lucide-terminal",{"title":128,"icon":121,"path":129,"stem":130,"children":131,"page":36},"Kinotic OS","\u002Fplatform","2.platform",[132,137,141,146,151,156,161],{"title":133,"path":134,"stem":135,"icon":136},"System Architecture","\u002Fplatform\u002Farchitecture","2.platform\u002F1.architecture","i-lucide-boxes",{"title":138,"path":139,"stem":140,"icon":6},"Deployment Guide","\u002Fplatform\u002Fdeployment-guide","2.platform\u002F2.deployment-guide",{"title":142,"path":143,"stem":144,"icon":145},"Configuration","\u002Fplatform\u002Fconfiguration","2.platform\u002F3.configuration","i-lucide-settings",{"title":147,"path":148,"stem":149,"icon":150},"Organization Management","\u002Fplatform\u002Forganization-management","2.platform\u002F4.organization-management","i-lucide-building-2",{"title":152,"path":153,"stem":154,"icon":155},"System Security","\u002Fplatform\u002Fsystem-security","2.platform\u002F5.system-security","i-lucide-shield",{"title":157,"path":158,"stem":159,"icon":160},"Observability","\u002Fplatform\u002Fobservability","2.platform\u002F6.observability","i-lucide-activity",{"title":162,"path":163,"stem":164,"icon":165},"Contributing","\u002Fplatform\u002Fcontributing","2.platform\u002F7.contributing","i-lucide-git-pull-request",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":36},"Reference","i-lucide-book-open","\u002Freference","3.reference",[172,177,181,186,191],{"title":173,"path":174,"stem":175,"icon":176},"Decorators Reference","\u002Freference\u002Fdecorators","3.reference\u002F1.decorators","i-lucide-at-sign",{"title":178,"path":179,"stem":180,"icon":60},"Migration SQL Grammar","\u002Freference\u002Fmigration-sql-grammar","3.reference\u002F2.migration-sql-grammar",{"title":182,"path":183,"stem":184,"icon":185},"ABAC Expression Language","\u002Freference\u002Fabac-expression-language","3.reference\u002F3.abac-expression-language","i-lucide-file-code",{"title":187,"path":188,"stem":189,"icon":190},"CRI Format","\u002Freference\u002Fcri-format","3.reference\u002F4.cri-format","i-lucide-link",{"title":192,"path":193,"stem":194,"icon":195},"SDK Packages","\u002Freference\u002Fsdk-packages","3.reference\u002F5.sdk-packages","i-lucide-package",{"id":197,"title":55,"body":198,"description":771,"extension":772,"links":773,"meta":774,"navigation":316,"path":56,"seo":775,"stem":57,"__hash__":776},"docs\u002F1.apps\u002F4.services\u002F4.streaming.md",{"type":199,"value":200,"toc":766},"minimark",[201,210,215,221,517,521,527,729,733,762],[202,203,204,205,209],"p",{},"Kinotic services can push multiple values to callers over time using the streaming pattern. Instead of returning a single response, a streaming method returns an ",[206,207,208],"code",{},"Observable"," that emits values as they become available.",[211,212,214],"h2",{"id":213},"defining-a-streaming-method","Defining a Streaming Method",[202,216,217,218,220],{},"Any service method that returns an ",[206,219,208],{}," is treated as a streaming endpoint.",[222,223,228],"pre",{"className":224,"code":225,"language":226,"meta":227,"style":227},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Publish } from '@kinotic-ai\u002Fcore'\nimport { Observable, interval } from 'rxjs'\nimport { map } from 'rxjs\u002Foperators'\n\n@Publish('com.example')\nclass SensorService {\n    streamReadings(sensorId: string): Observable\u003CSensorReading> {\n        return interval(1000).pipe(\n            map(() => ({\n                sensorId,\n                value: Math.random() * 100,\n                timestamp: new Date()\n            }))\n        )\n    }\n}\n","typescript","",[206,229,230,263,290,311,318,342,356,391,417,437,446,473,490,499,505,511],{"__ignoreMap":227},[231,232,235,239,243,247,250,253,256,260],"span",{"class":233,"line":234},"line",1,[231,236,238],{"class":237},"s7zQu","import",[231,240,242],{"class":241},"sMK4o"," {",[231,244,246],{"class":245},"sTEyZ"," Publish",[231,248,249],{"class":241}," }",[231,251,252],{"class":237}," from",[231,254,255],{"class":241}," '",[231,257,259],{"class":258},"sfazB","@kinotic-ai\u002Fcore",[231,261,262],{"class":241},"'\n",[231,264,266,268,270,273,276,279,281,283,285,288],{"class":233,"line":265},2,[231,267,238],{"class":237},[231,269,242],{"class":241},[231,271,272],{"class":245}," Observable",[231,274,275],{"class":241},",",[231,277,278],{"class":245}," interval",[231,280,249],{"class":241},[231,282,252],{"class":237},[231,284,255],{"class":241},[231,286,287],{"class":258},"rxjs",[231,289,262],{"class":241},[231,291,293,295,297,300,302,304,306,309],{"class":233,"line":292},3,[231,294,238],{"class":237},[231,296,242],{"class":241},[231,298,299],{"class":245}," map",[231,301,249],{"class":241},[231,303,252],{"class":237},[231,305,255],{"class":241},[231,307,308],{"class":258},"rxjs\u002Foperators",[231,310,262],{"class":241},[231,312,314],{"class":233,"line":313},4,[231,315,317],{"emptyLinePlaceholder":316},true,"\n",[231,319,321,324,328,331,334,337,339],{"class":233,"line":320},5,[231,322,323],{"class":241},"@",[231,325,327],{"class":326},"s2Zo4","Publish",[231,329,330],{"class":245},"(",[231,332,333],{"class":241},"'",[231,335,336],{"class":258},"com.example",[231,338,333],{"class":241},[231,340,341],{"class":245},")\n",[231,343,345,349,353],{"class":233,"line":344},6,[231,346,348],{"class":347},"spNyl","class",[231,350,352],{"class":351},"sBMFI"," SensorService",[231,354,355],{"class":241}," {\n",[231,357,359,363,365,369,372,375,378,380,383,386,389],{"class":233,"line":358},7,[231,360,362],{"class":361},"swJcz","    streamReadings",[231,364,330],{"class":241},[231,366,368],{"class":367},"sHdIc","sensorId",[231,370,371],{"class":241},":",[231,373,374],{"class":351}," string",[231,376,377],{"class":241},"):",[231,379,272],{"class":351},[231,381,382],{"class":241},"\u003C",[231,384,385],{"class":351},"SensorReading",[231,387,388],{"class":241},">",[231,390,355],{"class":241},[231,392,394,397,399,401,405,408,411,414],{"class":233,"line":393},8,[231,395,396],{"class":237},"        return",[231,398,278],{"class":326},[231,400,330],{"class":361},[231,402,404],{"class":403},"sbssI","1000",[231,406,407],{"class":361},")",[231,409,410],{"class":241},".",[231,412,413],{"class":326},"pipe",[231,415,416],{"class":361},"(\n",[231,418,420,423,425,428,431,434],{"class":233,"line":419},9,[231,421,422],{"class":326},"            map",[231,424,330],{"class":361},[231,426,427],{"class":241},"()",[231,429,430],{"class":347}," =>",[231,432,433],{"class":361}," (",[231,435,436],{"class":241},"{\n",[231,438,440,443],{"class":233,"line":439},10,[231,441,442],{"class":245},"                sensorId",[231,444,445],{"class":241},",\n",[231,447,449,452,454,457,459,462,465,468,471],{"class":233,"line":448},11,[231,450,451],{"class":361},"                value",[231,453,371],{"class":241},[231,455,456],{"class":245}," Math",[231,458,410],{"class":241},[231,460,461],{"class":326},"random",[231,463,464],{"class":361},"() ",[231,466,467],{"class":241},"*",[231,469,470],{"class":403}," 100",[231,472,445],{"class":241},[231,474,476,479,481,484,487],{"class":233,"line":475},12,[231,477,478],{"class":361},"                timestamp",[231,480,371],{"class":241},[231,482,483],{"class":241}," new",[231,485,486],{"class":326}," Date",[231,488,489],{"class":361},"()\n",[231,491,493,496],{"class":233,"line":492},13,[231,494,495],{"class":241},"            }",[231,497,498],{"class":361},"))\n",[231,500,502],{"class":233,"line":501},14,[231,503,504],{"class":361},"        )\n",[231,506,508],{"class":233,"line":507},15,[231,509,510],{"class":241},"    }\n",[231,512,514],{"class":233,"line":513},16,[231,515,516],{"class":241},"}\n",[211,518,520],{"id":519},"consuming-a-stream","Consuming a Stream",[202,522,523,524,526],{},"Callers receive an ",[206,525,208],{}," and subscribe to process values as they arrive.",[222,528,530],{"className":224,"code":529,"language":226,"meta":227,"style":227},"const stream$ = sensorService.streamReadings('sensor-1')\n\nconst subscription = stream$.subscribe({\n    next: (reading) => console.log('Reading:', reading.value),\n    error: (err) => console.error('Stream error:', err),\n    complete: () => console.log('Stream ended')\n})\n\n\u002F\u002F Stop listening when done\nsubscription.unsubscribe()\n",[206,531,532,562,566,587,632,671,700,707,711,717],{"__ignoreMap":227},[231,533,534,537,540,543,546,548,551,553,555,558,560],{"class":233,"line":234},[231,535,536],{"class":347},"const",[231,538,539],{"class":245}," stream$ ",[231,541,542],{"class":241},"=",[231,544,545],{"class":245}," sensorService",[231,547,410],{"class":241},[231,549,550],{"class":326},"streamReadings",[231,552,330],{"class":245},[231,554,333],{"class":241},[231,556,557],{"class":258},"sensor-1",[231,559,333],{"class":241},[231,561,341],{"class":245},[231,563,564],{"class":233,"line":265},[231,565,317],{"emptyLinePlaceholder":316},[231,567,568,570,573,575,578,580,583,585],{"class":233,"line":292},[231,569,536],{"class":347},[231,571,572],{"class":245}," subscription ",[231,574,542],{"class":241},[231,576,577],{"class":245}," stream$",[231,579,410],{"class":241},[231,581,582],{"class":326},"subscribe",[231,584,330],{"class":245},[231,586,436],{"class":241},[231,588,589,592,594,596,599,601,603,606,608,611,613,615,618,620,622,625,627,630],{"class":233,"line":313},[231,590,591],{"class":326},"    next",[231,593,371],{"class":241},[231,595,433],{"class":241},[231,597,598],{"class":367},"reading",[231,600,407],{"class":241},[231,602,430],{"class":347},[231,604,605],{"class":245}," console",[231,607,410],{"class":241},[231,609,610],{"class":326},"log",[231,612,330],{"class":245},[231,614,333],{"class":241},[231,616,617],{"class":258},"Reading:",[231,619,333],{"class":241},[231,621,275],{"class":241},[231,623,624],{"class":245}," reading",[231,626,410],{"class":241},[231,628,629],{"class":245},"value)",[231,631,445],{"class":241},[231,633,634,637,639,641,644,646,648,650,652,655,657,659,662,664,666,669],{"class":233,"line":320},[231,635,636],{"class":326},"    error",[231,638,371],{"class":241},[231,640,433],{"class":241},[231,642,643],{"class":367},"err",[231,645,407],{"class":241},[231,647,430],{"class":347},[231,649,605],{"class":245},[231,651,410],{"class":241},[231,653,654],{"class":326},"error",[231,656,330],{"class":245},[231,658,333],{"class":241},[231,660,661],{"class":258},"Stream error:",[231,663,333],{"class":241},[231,665,275],{"class":241},[231,667,668],{"class":245}," err)",[231,670,445],{"class":241},[231,672,673,676,678,681,683,685,687,689,691,693,696,698],{"class":233,"line":344},[231,674,675],{"class":326},"    complete",[231,677,371],{"class":241},[231,679,680],{"class":241}," ()",[231,682,430],{"class":347},[231,684,605],{"class":245},[231,686,410],{"class":241},[231,688,610],{"class":326},[231,690,330],{"class":245},[231,692,333],{"class":241},[231,694,695],{"class":258},"Stream ended",[231,697,333],{"class":241},[231,699,341],{"class":245},[231,701,702,705],{"class":233,"line":358},[231,703,704],{"class":241},"}",[231,706,341],{"class":245},[231,708,709],{"class":233,"line":393},[231,710,317],{"emptyLinePlaceholder":316},[231,712,713],{"class":233,"line":419},[231,714,716],{"class":715},"sHwdD","\u002F\u002F Stop listening when done\n",[231,718,719,722,724,727],{"class":233,"line":439},[231,720,721],{"class":245},"subscription",[231,723,410],{"class":241},[231,725,726],{"class":326},"unsubscribe",[231,728,489],{"class":245},[211,730,732],{"id":731},"use-cases","Use Cases",[734,735,736,744,750,756],"ul",{},[737,738,739,743],"li",{},[740,741,742],"strong",{},"Real-time data feeds"," -- IoT sensors, live metrics, dashboards",[737,745,746,749],{},[740,747,748],{},"Notifications and alerts"," -- Push updates to connected clients",[737,751,752,755],{},[740,753,754],{},"Change data capture"," -- React to data changes as they happen",[737,757,758,761],{},[740,759,760],{},"Large result sets"," -- Stream results incrementally instead of loading everything at once",[763,764,765],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":227,"searchDepth":265,"depth":265,"links":767},[768,769,770],{"id":213,"depth":265,"text":214},{"id":519,"depth":265,"text":520},{"id":731,"depth":265,"text":732},"Real-time data streaming between services and clients.","md",null,{},{"title":55,"description":771},"oxUS5L6sb43IJ-vsrziYg1oosuWyT4RbGKt1jKfKXIc",[778,780],{"title":51,"path":52,"stem":53,"description":779,"children":-1},"How to call remote services using service proxies in Kinotic.",{"title":25,"path":65,"stem":66,"description":781,"children":-1},"Kinotic's persistence layer provides declarative data management with automatic CRUD service generation from TypeScript entity definitions.",1775187764971]