[{"data":1,"prerenderedAt":923},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fv1\u002Fclient\u002Fevents":121,"\u002Fdocs\u002Fv1\u002Fclient\u002Fevents-surround":918},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Docs","\u002Fdocs","docs",[9],{"title":10,"path":11,"stem":12,"children":13,"page":44},"V1","\u002Fdocs\u002Fv1","docs\u002Fv1",[14,18,22,45,58,80,93,111],{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fv1\u002Fintroduction","docs\u002Fv1\u002F0.introduction",{"title":19,"path":20,"stem":21},"How It Works","\u002Fdocs\u002Fv1\u002Fhow-it-works","docs\u002Fv1\u002F1.how-it-works",{"title":23,"icon":24,"path":25,"stem":26,"children":27,"page":44},"Client","i-lucide-laptop","\u002Fdocs\u002Fv1\u002Fclient","docs\u002Fv1\u002F2.client",[28,32,36,40],{"title":29,"path":30,"stem":31},"Client Setup","\u002Fdocs\u002Fv1\u002Fclient\u002Fsetup","docs\u002Fv1\u002F2.client\u002F1.setup",{"title":33,"path":34,"stem":35},"Syncing","\u002Fdocs\u002Fv1\u002Fclient\u002Fsyncing","docs\u002Fv1\u002F2.client\u002F2.syncing",{"title":37,"path":38,"stem":39},"Events","\u002Fdocs\u002Fv1\u002Fclient\u002Fevents","docs\u002Fv1\u002F2.client\u002F3.events",{"title":41,"path":42,"stem":43},"Configuration","\u002Fdocs\u002Fv1\u002Fclient\u002Fconfiguration","docs\u002Fv1\u002F2.client\u002F4.configuration",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Server","i-lucide-server","\u002Fdocs\u002Fv1\u002Fserver","docs\u002Fv1\u002F3.server",[51,55],{"title":52,"path":53,"stem":54},"Server Setup","\u002Fdocs\u002Fv1\u002Fserver\u002Fsetup","docs\u002Fv1\u002F3.server\u002F1.setup",{"title":41,"path":56,"stem":57},"\u002Fdocs\u002Fv1\u002Fserver\u002Fconfiguration","docs\u002Fv1\u002F3.server\u002F2.configuration",{"title":59,"icon":60,"badge":61,"path":62,"stem":63,"children":64,"page":44},"NativePHP","i-lucide-smartphone","Commercial","\u002Fdocs\u002Fv1\u002Fnativephp","docs\u002Fv1\u002F4.nativephp",[65,69,73,76],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fv1\u002Fnativephp\u002Foverview","docs\u002Fv1\u002F4.nativephp\u002F1.overview",{"title":70,"path":71,"stem":72},"Setup","\u002Fdocs\u002Fv1\u002Fnativephp\u002Fsetup","docs\u002Fv1\u002F4.nativephp\u002F2.setup",{"title":41,"path":74,"stem":75},"\u002Fdocs\u002Fv1\u002Fnativephp\u002Fconfiguration","docs\u002Fv1\u002F4.nativephp\u002F3.configuration",{"title":77,"path":78,"stem":79},"Lifecycle & Events","\u002Fdocs\u002Fv1\u002Fnativephp\u002Flifecycle","docs\u002Fv1\u002F4.nativephp\u002F4.lifecycle",{"title":81,"icon":82,"badge":61,"path":83,"stem":84,"children":85,"page":44},"Server Pro","i-lucide-bar-chart-2","\u002Fdocs\u002Fv1\u002Fserver-pro","docs\u002Fv1\u002F5.server-pro",[86,89],{"title":66,"path":87,"stem":88},"\u002Fdocs\u002Fv1\u002Fserver-pro\u002Foverview","docs\u002Fv1\u002F5.server-pro\u002F1.overview",{"title":90,"path":91,"stem":92},"Features","\u002Fdocs\u002Fv1\u002Fserver-pro\u002Ffeatures","docs\u002Fv1\u002F5.server-pro\u002F2.features",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":44},"Advanced","i-lucide-settings-2","\u002Fdocs\u002Fv1\u002Fadvanced","docs\u002Fv1\u002F6.advanced",[99,103,107],{"title":100,"path":101,"stem":102},"Service Container","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fservice-container","docs\u002Fv1\u002F6.advanced\u002F0.service-container",{"title":104,"path":105,"stem":106},"Conflict Resolution","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fconflict-resolution","docs\u002Fv1\u002F6.advanced\u002F1.conflict-resolution",{"title":108,"path":109,"stem":110},"Payload Mapping","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fpayload-mapping","docs\u002Fv1\u002F6.advanced\u002F2.payload-mapping",{"title":112,"icon":113,"path":114,"stem":115,"children":116,"page":44},"Examples","i-lucide-book-open","\u002Fdocs\u002Fv1\u002Fexamples","docs\u002Fv1\u002F7.examples",[117],{"title":118,"path":119,"stem":120},"Task Manager","\u002Fdocs\u002Fv1\u002Fexamples\u002Ftask-manager","docs\u002Fv1\u002F7.examples\u002F1.task-manager",{"id":122,"title":37,"body":123,"description":911,"extension":912,"links":913,"meta":914,"navigation":277,"path":38,"seo":915,"stem":39,"__hash__":917},"docs\u002Fdocs\u002Fv1\u002F2.client\u002F3.events.md",{"type":124,"value":125,"toc":905},"minimark",[126,130,133,138,220,227,229,233,437,447,449,453,462,683,686,764,766,770,901],[127,128,129],"p",{},"Tether dispatches standard Laravel events around offline sync, push, pull, skipped runs, and conflict handling. Register listeners in your application where you normally handle Laravel events.",[131,132],"hr",{},[134,135,137],"h2",{"id":136},"lifecycle-events","Lifecycle events",[139,140,141,157],"table",{},[142,143,144],"thead",{},[145,146,147,151,154],"tr",{},[148,149,150],"th",{},"Started event",[148,152,153],{},"Completed event",[148,155,156],{},"Fired by",[158,159,160,179,200],"tbody",{},[145,161,162,169,174],{},[163,164,165],"td",{},[166,167,168],"code",{},"TetherSyncStarted",[163,170,171],{},[166,172,173],{},"TetherSyncCompleted",[163,175,176],{},[166,177,178],{},"TetherClient::sync()",[145,180,181,186,191],{},[163,182,183],{},[166,184,185],{},"TetherPushStarted",[163,187,188],{},[166,189,190],{},"TetherPushCompleted",[163,192,193,196,197],{},[166,194,195],{},"TetherClient::push()"," \u002F ",[166,198,199],{},"PushJob",[145,201,202,207,212],{},[163,203,204],{},[166,205,206],{},"TetherPullStarted",[163,208,209],{},[166,210,211],{},"TetherPullCompleted",[163,213,214,196,217],{},[166,215,216],{},"TetherClient::pull()",[166,218,219],{},"PullJob",[127,221,222,223,226],{},"Completed events fire even when the cycle was skipped by the concurrency lock. Check ",[166,224,225],{},"$event->result->skipped",".",[131,228],{},[134,230,232],{"id":231},"completed-event-payload","Completed event payload",[234,235,240],"pre",{"className":236,"code":237,"language":238,"meta":239,"style":239},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Tether\\Client\\Events\\TetherSyncCompleted;\n\nclass HandleSyncCompleted\n{\n    public function handle(TetherSyncCompleted $event): void\n    {\n        $event->result->pushed;\n        $event->result->pulled;\n        $event->result->failed;\n        $event->result->conflicts;\n        $event->result->skipped;\n    }\n}\n","php","",[166,241,242,272,279,290,296,326,332,353,371,389,407,425,431],{"__ignoreMap":239},[243,244,247,251,255,259,261,263,265,267,269],"span",{"class":245,"line":246},"line",1,[243,248,250],{"class":249},"sbssI","use",[243,252,254],{"class":253},"sTEyZ"," Tether",[243,256,258],{"class":257},"sMK4o","\\",[243,260,23],{"class":253},[243,262,258],{"class":257},[243,264,37],{"class":253},[243,266,258],{"class":257},[243,268,173],{"class":253},[243,270,271],{"class":257},";\n",[243,273,275],{"class":245,"line":274},2,[243,276,278],{"emptyLinePlaceholder":277},true,"\n",[243,280,282,286],{"class":245,"line":281},3,[243,283,285],{"class":284},"spNyl","class",[243,287,289],{"class":288},"sBMFI"," HandleSyncCompleted\n",[243,291,293],{"class":245,"line":292},4,[243,294,295],{"class":257},"{\n",[243,297,299,302,305,309,312,314,317,320,323],{"class":245,"line":298},5,[243,300,301],{"class":284},"    public",[243,303,304],{"class":284}," function",[243,306,308],{"class":307},"s2Zo4"," handle",[243,310,311],{"class":257},"(",[243,313,173],{"class":288},[243,315,316],{"class":257}," $",[243,318,319],{"class":253},"event",[243,321,322],{"class":257},"):",[243,324,325],{"class":249}," void\n",[243,327,329],{"class":245,"line":328},6,[243,330,331],{"class":257},"    {\n",[243,333,335,338,340,343,346,348,351],{"class":245,"line":334},7,[243,336,337],{"class":257},"        $",[243,339,319],{"class":253},[243,341,342],{"class":257},"->",[243,344,345],{"class":253},"result",[243,347,342],{"class":257},[243,349,350],{"class":253},"pushed",[243,352,271],{"class":257},[243,354,356,358,360,362,364,366,369],{"class":245,"line":355},8,[243,357,337],{"class":257},[243,359,319],{"class":253},[243,361,342],{"class":257},[243,363,345],{"class":253},[243,365,342],{"class":257},[243,367,368],{"class":253},"pulled",[243,370,271],{"class":257},[243,372,374,376,378,380,382,384,387],{"class":245,"line":373},9,[243,375,337],{"class":257},[243,377,319],{"class":253},[243,379,342],{"class":257},[243,381,345],{"class":253},[243,383,342],{"class":257},[243,385,386],{"class":253},"failed",[243,388,271],{"class":257},[243,390,392,394,396,398,400,402,405],{"class":245,"line":391},10,[243,393,337],{"class":257},[243,395,319],{"class":253},[243,397,342],{"class":257},[243,399,345],{"class":253},[243,401,342],{"class":257},[243,403,404],{"class":253},"conflicts",[243,406,271],{"class":257},[243,408,410,412,414,416,418,420,423],{"class":245,"line":409},11,[243,411,337],{"class":257},[243,413,319],{"class":253},[243,415,342],{"class":257},[243,417,345],{"class":253},[243,419,342],{"class":257},[243,421,422],{"class":253},"skipped",[243,424,271],{"class":257},[243,426,428],{"class":245,"line":427},12,[243,429,430],{"class":257},"    }\n",[243,432,434],{"class":245,"line":433},13,[243,435,436],{"class":257},"}\n",[127,438,439,440,443,444,226],{},"The push and pull completed events also expose a ",[166,441,442],{},"SyncResult"," via ",[166,445,446],{},"$event->result",[131,448],{},[134,450,452],{"id":451},"conflict-event","Conflict event",[127,454,455,458,459,461],{},[166,456,457],{},"TetherConflictDetected"," fires once for each mutation returned in the server's ",[166,460,404],{}," array, after the server state has been applied locally.",[234,463,465],{"className":236,"code":464,"language":238,"meta":239,"style":239},"use Tether\\Client\\Events\\TetherConflictDetected;\nuse Illuminate\\Support\\Facades\\Log;\n\nclass LogConflict\n{\n    public function handle(TetherConflictDetected $event): void\n    {\n        Log::warning('Tether conflict', [\n            'mutation_id' => $event->mutationId,\n            'model' => $event->model,\n            'entity_id' => $event->entityId,\n            'server_state' => $event->serverState,\n        ]);\n    }\n}\n",[166,466,467,487,511,515,522,526,546,550,578,603,624,646,668,673,678],{"__ignoreMap":239},[243,468,469,471,473,475,477,479,481,483,485],{"class":245,"line":246},[243,470,250],{"class":249},[243,472,254],{"class":253},[243,474,258],{"class":257},[243,476,23],{"class":253},[243,478,258],{"class":257},[243,480,37],{"class":253},[243,482,258],{"class":257},[243,484,457],{"class":253},[243,486,271],{"class":257},[243,488,489,491,494,496,499,501,504,506,509],{"class":245,"line":274},[243,490,250],{"class":249},[243,492,493],{"class":253}," Illuminate",[243,495,258],{"class":257},[243,497,498],{"class":253},"Support",[243,500,258],{"class":257},[243,502,503],{"class":253},"Facades",[243,505,258],{"class":257},[243,507,508],{"class":253},"Log",[243,510,271],{"class":257},[243,512,513],{"class":245,"line":281},[243,514,278],{"emptyLinePlaceholder":277},[243,516,517,519],{"class":245,"line":292},[243,518,285],{"class":284},[243,520,521],{"class":288}," LogConflict\n",[243,523,524],{"class":245,"line":298},[243,525,295],{"class":257},[243,527,528,530,532,534,536,538,540,542,544],{"class":245,"line":328},[243,529,301],{"class":284},[243,531,304],{"class":284},[243,533,308],{"class":307},[243,535,311],{"class":257},[243,537,457],{"class":288},[243,539,316],{"class":257},[243,541,319],{"class":253},[243,543,322],{"class":257},[243,545,325],{"class":249},[243,547,548],{"class":245,"line":334},[243,549,331],{"class":257},[243,551,552,555,558,561,563,566,570,572,575],{"class":245,"line":355},[243,553,554],{"class":288},"        Log",[243,556,557],{"class":257},"::",[243,559,560],{"class":307},"warning",[243,562,311],{"class":257},[243,564,565],{"class":257},"'",[243,567,569],{"class":568},"sfazB","Tether conflict",[243,571,565],{"class":257},[243,573,574],{"class":257},",",[243,576,577],{"class":257}," [\n",[243,579,580,583,586,588,591,593,595,597,600],{"class":245,"line":373},[243,581,582],{"class":257},"            '",[243,584,585],{"class":568},"mutation_id",[243,587,565],{"class":257},[243,589,590],{"class":257}," =>",[243,592,316],{"class":257},[243,594,319],{"class":253},[243,596,342],{"class":257},[243,598,599],{"class":253},"mutationId",[243,601,602],{"class":257},",\n",[243,604,605,607,610,612,614,616,618,620,622],{"class":245,"line":391},[243,606,582],{"class":257},[243,608,609],{"class":568},"model",[243,611,565],{"class":257},[243,613,590],{"class":257},[243,615,316],{"class":257},[243,617,319],{"class":253},[243,619,342],{"class":257},[243,621,609],{"class":253},[243,623,602],{"class":257},[243,625,626,628,631,633,635,637,639,641,644],{"class":245,"line":409},[243,627,582],{"class":257},[243,629,630],{"class":568},"entity_id",[243,632,565],{"class":257},[243,634,590],{"class":257},[243,636,316],{"class":257},[243,638,319],{"class":253},[243,640,342],{"class":257},[243,642,643],{"class":253},"entityId",[243,645,602],{"class":257},[243,647,648,650,653,655,657,659,661,663,666],{"class":245,"line":427},[243,649,582],{"class":257},[243,651,652],{"class":568},"server_state",[243,654,565],{"class":257},[243,656,590],{"class":257},[243,658,316],{"class":257},[243,660,319],{"class":253},[243,662,342],{"class":257},[243,664,665],{"class":253},"serverState",[243,667,602],{"class":257},[243,669,670],{"class":245,"line":433},[243,671,672],{"class":257},"        ]);\n",[243,674,676],{"class":245,"line":675},14,[243,677,430],{"class":257},[243,679,681],{"class":245,"line":680},15,[243,682,436],{"class":257},[127,684,685],{},"Properties:",[139,687,688,701],{},[142,689,690],{},[145,691,692,695,698],{},[148,693,694],{},"Property",[148,696,697],{},"Type",[148,699,700],{},"Meaning",[158,702,703,717,733,750],{},[145,704,705,709,714],{},[163,706,707],{},[166,708,599],{},[163,710,711],{},[166,712,713],{},"string",[163,715,716],{},"Local mutation rejected as a conflict",[145,718,719,723,727],{},[163,720,721],{},[166,722,609],{},[163,724,725],{},[166,726,713],{},[163,728,729,730],{},"Short model name, for example ",[166,731,732],{},"Task",[145,734,735,739,743],{},[163,736,737],{},[166,738,643],{},[163,740,741],{},[166,742,713],{},[163,744,745,746,749],{},"Sync identity (",[166,747,748],{},"tether_id"," by default)",[145,751,752,756,761],{},[163,753,754],{},[166,755,665],{},[163,757,758],{},[166,759,760],{},"array",[163,762,763],{},"Current server-side attributes already saved",[131,765],{},[134,767,769],{"id":768},"example-sync-indicator","Example: sync indicator",[234,771,773],{"className":236,"code":772,"language":238,"meta":239,"style":239},"use Tether\\Client\\Events\\TetherSyncStarted;\nuse Tether\\Client\\Events\\TetherSyncCompleted;\n\nclass BroadcastSyncState\n{\n    public function handle(TetherSyncStarted|TetherSyncCompleted $event): void\n    {\n        \u002F\u002F Broadcast to your frontend via Laravel Echo, Reverb, etc.\n        broadcast(new SyncStateChanged($event instanceof TetherSyncStarted));\n    }\n}\n",[166,774,775,795,815,819,826,830,855,859,865,893,897],{"__ignoreMap":239},[243,776,777,779,781,783,785,787,789,791,793],{"class":245,"line":246},[243,778,250],{"class":249},[243,780,254],{"class":253},[243,782,258],{"class":257},[243,784,23],{"class":253},[243,786,258],{"class":257},[243,788,37],{"class":253},[243,790,258],{"class":257},[243,792,168],{"class":253},[243,794,271],{"class":257},[243,796,797,799,801,803,805,807,809,811,813],{"class":245,"line":274},[243,798,250],{"class":249},[243,800,254],{"class":253},[243,802,258],{"class":257},[243,804,23],{"class":253},[243,806,258],{"class":257},[243,808,37],{"class":253},[243,810,258],{"class":257},[243,812,173],{"class":253},[243,814,271],{"class":257},[243,816,817],{"class":245,"line":281},[243,818,278],{"emptyLinePlaceholder":277},[243,820,821,823],{"class":245,"line":292},[243,822,285],{"class":284},[243,824,825],{"class":288}," BroadcastSyncState\n",[243,827,828],{"class":245,"line":298},[243,829,295],{"class":257},[243,831,832,834,836,838,840,842,845,847,849,851,853],{"class":245,"line":328},[243,833,301],{"class":284},[243,835,304],{"class":284},[243,837,308],{"class":307},[243,839,311],{"class":257},[243,841,168],{"class":288},[243,843,844],{"class":257},"|",[243,846,173],{"class":288},[243,848,316],{"class":257},[243,850,319],{"class":253},[243,852,322],{"class":257},[243,854,325],{"class":249},[243,856,857],{"class":245,"line":334},[243,858,331],{"class":257},[243,860,861],{"class":245,"line":355},[243,862,864],{"class":863},"sHwdD","        \u002F\u002F Broadcast to your frontend via Laravel Echo, Reverb, etc.\n",[243,866,867,870,872,875,878,881,884,887,890],{"class":245,"line":373},[243,868,869],{"class":307},"        broadcast",[243,871,311],{"class":257},[243,873,874],{"class":249},"new",[243,876,877],{"class":288}," SyncStateChanged",[243,879,880],{"class":257},"($",[243,882,883],{"class":253},"event ",[243,885,886],{"class":257},"instanceof",[243,888,889],{"class":288}," TetherSyncStarted",[243,891,892],{"class":257},"));\n",[243,894,895],{"class":245,"line":391},[243,896,430],{"class":257},[243,898,899],{"class":245,"line":409},[243,900,436],{"class":257},[902,903,904],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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":239,"searchDepth":246,"depth":274,"links":906},[907,908,909,910],{"id":136,"depth":274,"text":137},{"id":231,"depth":274,"text":232},{"id":451,"depth":274,"text":452},{"id":768,"depth":274,"text":769},"Use Laravel events from tether\u002Fclient to react to sync lifecycle changes, push and pull completion, skipped runs, and detected conflicts.","md",null,{},{"title":916,"description":911},"Laravel Sync Events - Listen to Tether Sync Outcomes","Eep30j5e3unI-7kPEgi9ojvbylRhgJITDqrCmouec3Q",[919,921],{"title":33,"path":34,"stem":35,"description":920,"children":-1},"Run Laravel Tether sync manually, from queues, or on a schedule, and understand push\u002Fpull results, conflicts, retries, and pull pagination.",{"title":41,"path":42,"stem":43,"description":922,"children":-1},"Reference every tether\u002Fclient config key for Laravel offline sync, including client identity, HTTP endpoints, queue sync, batching, retries, and cursors.",1780481013060]