@01.works/visual-review 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -12
- package/THIRD_PARTY_NOTICES.md +0 -4
- package/dist/active-review-mount-BEEKqerS.js +1401 -0
- package/dist/cli.js +1560 -0
- package/dist/convex-runtime-DY-himGr.js +2 -0
- package/dist/cursor-chat-repository-Dn3UVmUP.js +1 -0
- package/dist/cursor-chat-ui-Cu42FHov.js +94 -0
- package/dist/hosted-runtime-BFendO_5.js +1 -0
- package/dist/index.d.ts +67 -59
- package/dist/index.js +1 -1
- package/dist/install-BXWJcrQ8.js +2 -0
- package/dist/instant-runtime-UFycxLQ8.js +1 -0
- package/dist/react.js +1 -1
- package/dist/review-repository-xzjM-750.js +1 -0
- package/package.json +7 -2
- package/dist/active-review-mount-BW2oQDQ2.js +0 -1517
- package/dist/convex-runtime-8kViWXIL.js +0 -2
- package/dist/hosted-runtime-CP0aew_W.js +0 -1
- package/dist/install-Crgjt0uw.js +0 -2
- package/dist/instant-runtime-CTh_DTHR.js +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as e,o as t,s as n}from"./src-CjYM9---.js";for(var r=[],i=[],a=Uint8Array,o=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,s=0,c=o.length;s<c;++s)r[s]=o[s],i[o.charCodeAt(s)]=s;i[45]=62,i[95]=63;function l(e){var t=e.length;if(t%4>0)throw Error(`Invalid string. Length must be a multiple of 4`);var n=e.indexOf(`=`);n===-1&&(n=t);var r=n===t?0:4-n%4;return[n,r]}function u(e,t,n){return(t+n)*3/4-n}function d(e){var t,n=l(e),r=n[0],o=n[1],s=new a(u(e,r,o)),c=0,d=o>0?r-4:r,f;for(f=0;f<d;f+=4)t=i[e.charCodeAt(f)]<<18|i[e.charCodeAt(f+1)]<<12|i[e.charCodeAt(f+2)]<<6|i[e.charCodeAt(f+3)],s[c++]=t>>16&255,s[c++]=t>>8&255,s[c++]=t&255;return o===2&&(t=i[e.charCodeAt(f)]<<2|i[e.charCodeAt(f+1)]>>4,s[c++]=t&255),o===1&&(t=i[e.charCodeAt(f)]<<10|i[e.charCodeAt(f+1)]<<4|i[e.charCodeAt(f+2)]>>2,s[c++]=t>>8&255,s[c++]=t&255),s}function f(e){return r[e>>18&63]+r[e>>12&63]+r[e>>6&63]+r[e&63]}function ee(e,t,n){for(var r,i=[],a=t;a<n;a+=3)r=(e[a]<<16&16711680)+(e[a+1]<<8&65280)+(e[a+2]&255),i.push(f(r));return i.join(``)}function p(e){for(var t,n=e.length,i=n%3,a=[],o=16383,s=0,c=n-i;s<c;s+=o)a.push(ee(e,s,s+o>c?c:s+o));return i===1?(t=e[n-1],a.push(r[t>>2]+r[t<<4&63]+`==`)):i===2&&(t=(e[n-2]<<8)+e[n-1],a.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+`=`)),a.join(``)}function m(e){if(e===void 0)return{};if(!ne(e))throw Error(`The arguments to a Convex function must be an object. Received: ${e}`);return e}function te(e){if(e===void 0)throw Error(`Client created with undefined deployment address. If you used an environment variable, check that it's set.`);if(typeof e!=`string`)throw Error(`Invalid deployment address: found ${e}".`);if(!(e.startsWith(`http:`)||e.startsWith(`https:`)))throw Error(`Invalid deployment address: Must start with "https://" or "http://". Found "${e}".`);try{new URL(e)}catch{throw Error(`Invalid deployment address: "${e}" is not a valid URL. If you believe this URL is correct, use the \`skipConvexDeploymentUrlCheck\` option to bypass this.`)}if(e.endsWith(`.convex.site`))throw Error(`Invalid deployment address: "${e}" ends with .convex.site, which is used for HTTP Actions. Convex deployment URLs typically end with .convex.cloud? If you believe this URL is correct, use the \`skipConvexDeploymentUrlCheck\` option to bypass this.`)}function ne(e){let t=typeof e==`object`,n=Object.getPrototypeOf(e),r=n===null||n===Object.prototype||n?.constructor?.name===`Object`;return t&&r}const h=BigInt(`-9223372036854775808`),g=BigInt(`9223372036854775807`),_=BigInt(`0`),re=BigInt(`8`),ie=BigInt(`256`),v=`This commit timestamp is unresolved: its value is assigned when the mutation commits. Read the document after the mutation completes to get its value.`;var ae=class{[Symbol.toPrimitive](e){if(e===`string`)return this.toString();throw Error(v)}valueOf(){throw Error(v)}toJSON(){throw Error(v)}toString(){return`[unresolved commit timestamp]`}};const oe=new ae;function se(e){return Number.isNaN(e)||!Number.isFinite(e)||Object.is(e,-0)}function ce(e){e<_&&(e-=h+h);let t=e.toString(16);t.length%2==1&&(t=`0`+t);let n=new Uint8Array(new ArrayBuffer(8)),r=0;for(let i of t.match(/.{2}/g).reverse())n.set([parseInt(i,16)],r++),e>>=re;return p(n)}function le(e){let t=d(e);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $integer`);let n=_,r=_;for(let e of t)n+=BigInt(e)*ie**r,r++;return n>g&&(n+=h+h),n}function ue(e){if(e<h||g<e)throw Error(`BigInt ${e} does not fit into a 64-bit signed integer.`);let t=new ArrayBuffer(8);return new DataView(t).setBigInt64(0,e,!0),p(new Uint8Array(t))}function de(e){let t=d(e);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $integer`);return new DataView(t.buffer).getBigInt64(0,!0)}const fe=DataView.prototype.setBigInt64?ue:ce,pe=DataView.prototype.getBigInt64?de:le,me=1024;function y(e){if(e.length>me)throw Error(`Field name ${e} exceeds maximum field name length ${me}.`);if(e.startsWith(`$`))throw Error(`Field name ${e} starts with a '$', which is reserved.`);for(let t=0;t<e.length;t+=1){let n=e.charCodeAt(t);if(n<32||n>=127)throw Error(`Field name ${e} has invalid character '${e[t]}': Field names can only contain non-control ASCII characters`)}}function b(e){if(e===null||typeof e==`boolean`||typeof e==`number`||typeof e==`string`)return e;if(Array.isArray(e))return e.map(e=>b(e));if(typeof e!=`object`)throw Error(`Unexpected type of ${e}`);let t=Object.entries(e);if(t.length===1){let n=t[0][0];if(n===`$bytes`){if(typeof e.$bytes!=`string`)throw Error(`Malformed $bytes field on ${e}`);return d(e.$bytes).buffer}if(n===`$integer`){if(typeof e.$integer!=`string`)throw Error(`Malformed $integer field on ${e}`);return pe(e.$integer)}if(n===`$float`){if(typeof e.$float!=`string`)throw Error(`Malformed $float field on ${e}`);let t=d(e.$float);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $float`);let n=new DataView(t.buffer).getFloat64(0,!0);if(!se(n))throw Error(`Float ${n} should be encoded as a number`);return n}if(n===`$commitTs`){if(e.$commitTs!==null)throw Error(`Malformed $commitTs field on ${e}`);return oe}if(n===`$set`)throw Error(`Received a Set which is no longer supported as a Convex type.`);if(n===`$map`)throw Error(`Received a Map which is no longer supported as a Convex type.`)}let n={};for(let[t,r]of Object.entries(e))y(t),n[t]=b(r);return n}const he=16384;function x(e){let t=JSON.stringify(e,(e,t)=>t===void 0?`undefined`:typeof t==`bigint`?`${t.toString()}n`:t);if(t.length>he){let e=he-14,n=t.codePointAt(e-1);return n!==void 0&&n>65535&&--e,t.substring(0,e)+`[...truncated]`}return t}function S(e,t,n,r){if(e===void 0){let e=n&&` (present at path ${n} in original object ${x(t)})`;throw Error(`undefined is not a valid Convex value${e}. To learn about Convex's supported types, see https://docs.convex.dev/using/types.`)}if(e===null)return e;if(typeof e==`bigint`){if(e<h||g<e)throw Error(`BigInt ${e} does not fit into a 64-bit signed integer.`);return{$integer:fe(e)}}if(typeof e==`number`)if(se(e)){let t=new ArrayBuffer(8);return new DataView(t).setFloat64(0,e,!0),{$float:p(new Uint8Array(t))}}else return e;if(typeof e==`boolean`||typeof e==`string`)return e;if(e instanceof ArrayBuffer)return{$bytes:p(new Uint8Array(e))};if(e instanceof ae)return{$commitTs:null};if(Array.isArray(e))return e.map((e,r)=>S(e,t,n+`[${r}]`,!1));if(e instanceof Set)throw Error(C(n,`Set`,[...e],t));if(e instanceof Map)throw Error(C(n,`Map`,[...e],t));if(!ne(e)){let r=e?.constructor?.name,i=r?`${r} `:``;throw Error(C(n,i,e,t))}let i={},a=Object.entries(e);a.sort(([e,t],[n,r])=>e===n?0:e<n?-1:1);for(let[e,o]of a)o===void 0?r&&(y(e),i[e]=ge(o,t,n+`.${e}`)):(y(e),i[e]=S(o,t,n+`.${e}`,!1));return i}function C(e,t,n,r){return e?`${t}${x(n)} is not a supported Convex type (present at path ${e} in original object ${x(r)}). To learn about Convex's supported types, see https://docs.convex.dev/using/types.`:`${t}${x(n)} is not a supported Convex type.`}function ge(e,t,n){if(e===void 0)return{$undefined:null};if(t===void 0)throw Error(`Programming error. Current value is ${x(e)} but original value is undefined`);return S(e,t,n,!1)}function w(e){return S(e,e,``,!1)}var _e=Object.defineProperty,ve=(e,t,n)=>t in e?_e(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,T=(e,t,n)=>ve(e,typeof t==`symbol`?t:t+``,n),ye,be;const xe=Symbol.for(`ConvexError`);var E=class extends (be=Error,ye=xe,be){constructor(e){super(typeof e==`string`?e:x(e)),T(this,`name`,`ConvexError`),T(this,`data`),T(this,ye,!0),this.data=e}};const Se=`1.45.0`,D=Symbol.for(`functionName`),Ce=Symbol.for(`toReferencePath`);function we(e){return e[Ce]??null}function Te(e){return e.startsWith(`function://`)}function Ee(e){let t;if(typeof e==`string`)t=Te(e)?{functionHandle:e}:{name:e};else if(e[D])t={name:e[D]};else{let n=we(e);if(!n)throw Error(`${e} is not a functionReference`);t={reference:n}}return t}function O(e){let t=Ee(e);if(t.name===void 0)throw t.functionHandle===void 0?t.reference===void 0?Error(`Expected function reference like "api.file.func" or "internal.file.func", but received ${JSON.stringify(t)}`):Error(`Expected function reference in the current component like "api.file.func" or "internal.file.func", but received reference ${t.reference}`):Error(`Expected function reference like "api.file.func" or "internal.file.func", but received function handle ${t.functionHandle}`);if(typeof e==`string`)return e;let n=e[D];if(!n)throw Error(`${e} is not a functionReference`);return n}function k(e){return{[D]:e}}function De(e=[]){return new Proxy({},{get(t,n){if(typeof n==`string`)return De([...e,n]);if(n===D){if(e.length<2){let t=[`api`,...e].join(`.`);throw Error(`API path is expected to be of the form \`api.moduleName.functionName\`. Found: \`${t}\``)}let t=e.slice(0,-1).join(`/`),n=e[e.length-1];return n==="default"?t:t+`:`+n}else if(n===Symbol.toStringTag)return`FunctionReference`;else return}})}De();const A=Object.freeze({resolveSession:k(`reviews:resolveSession`),pageSnapshot:k(`reviews:pageSnapshot`),projectSnapshot:k(`reviews:projectSnapshot`),createComment:k(`reviews:createComment`),createReply:k(`reviews:createReply`),presenceList:k(`presence:list`),presenceUpdate:k(`presence:update`),presenceDisconnect:k(`presence:disconnect`),screenshotUploadUrl:k(`screenshots:generateUploadUrl`),screenshotCommit:k(`screenshots:commitUpload`),screenshotDiscard:k(`screenshots:discardUpload`)});Object.freeze({catalog:k(`owners:catalog`),listProjects:k(`owners:listProjects`),projectOverview:k(`owners:projectOverview`),feedbackPage:k(`owners:feedbackPage`),createProject:k(`owners:createProject`),createProjectWithOrigins:k(`owners:createProjectWithOrigins`),deleteProject:k(`owners:deleteProject`),addOrigin:k(`owners:addOrigin`),removeOrigin:k(`owners:removeOrigin`),replaceOrigins:k(`owners:replaceOrigins`),createPage:k(`owners:createPage`),deletePage:k(`owners:deletePage`),upsertPageBuild:k(`owners:upsertPageBuild`),createInvitation:k(`owners:createInvitation`),revokeInvitation:k(`owners:revokeInvitation`),revokeReviewerAccess:k(`owners:revokeReviewerAccess`),setCommentStatus:k(`owners:setCommentStatus`),createReply:k(`owners:createReply`),deleteComment:k(`owners:deleteComment`),deleteReply:k(`owners:deleteReply`),screenshotDownload:k(`screenshots:ownerDownload`)});var Oe=class{client;session;#e;#t;#n;constructor(e,t,n){this.client=e,this.session=t,this.#e=M(n.invitationId??t.invitationId,`invitationId`),this.#t=Me(n.origin),this.#n=n.fetch??globalThis.fetch.bind(globalThis)}async attachScreenshot(e,t,n){M(e,`pageId`);let r=M(t,`commentId`);if(n.bytes.byteLength===0||n.bytes.byteLength>15e5)throw Error(`Screenshot size is invalid`);let i=await this.client.mutation(A.screenshotUploadUrl,{...this.#r(),commentId:r}),a=await this.#n(i.uploadUrl,{method:`POST`,headers:{"content-type":n.contentType},body:ke(n.bytes)});if(!a.ok)throw Error(`Screenshot upload failed`);let o=await a.json();if(typeof o.storageId!=`string`||!o.storageId)throw Error(`Screenshot upload returned an invalid storage ID`);try{await this.client.mutation(A.screenshotCommit,{...this.#r(),commentId:r,grantId:i.grantId,storageId:o.storageId,contentType:n.contentType,width:n.width,height:n.height})}catch(e){throw await this.client.mutation(A.screenshotDiscard,{...this.#r(),commentId:r,grantId:i.grantId,storageId:o.storageId}).catch(()=>void 0),e}}async getSnapshot(e){return je(await this.client.query(A.pageSnapshot,{...this.#r(),pageId:M(e,`pageId`)}))}async getProjectSnapshot(e){return this.#i(e),structuredClone(await this.client.query(A.projectSnapshot,{...this.#r(),projectId:e}))}subscribe(e,t,n){return this.client.onUpdate(A.pageSnapshot,{...this.#r(),pageId:M(e,`pageId`)},e=>t(je(e)),e=>n?.(j(e)))}subscribeProject(e,t,n){return this.#i(e),this.client.onUpdate(A.projectSnapshot,{...this.#r(),projectId:e},e=>t(structuredClone(e)),e=>n?.(j(e)))}async mutate(r,i){switch(i.type){case`comment.upsert`:{let a=i.comment;if(a.pageId!==r)throw Error(`Comment page mismatch`);if(a.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);if(a.status!==`open`||a.resolvedAt!==void 0||a.resolvedById!==void 0||a.createdAt!==a.updatedAt)throw Error(`Only new open comments can be created by a reviewer`);let o=n(a.body).trim(),s=t(a.target),c=a.scope===void 0?void 0:e(a.scope);await this.client.mutation(A.createComment,{...this.#r(),pageId:r,commentId:a.id,body:o,targetJson:JSON.stringify(s.publicTarget),sourceContextJson:s.sourceContextJson,...c===void 0?{}:{scopeJson:JSON.stringify(c)}});return}case`reply.upsert`:{let e=i.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);if(e.createdAt!==e.updatedAt)throw Error(`Reply edits require an owner command`);await this.client.mutation(A.createReply,{...this.#r(),commentId:e.commentId,replyId:e.id,body:n(e.body,`Reply body`).trim()});return}case`comment.delete`:throw Error(`Comment deletion requires an owner command`);case`reply.delete`:throw Error(`Reply deletion requires an owner command`)}}#r(){return{invitationId:this.#e,origin:this.#t}}#i(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function ke(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}function j(e){let t=Ae(e);return t===`UNAUTHENTICATED`||t===`INVITATION_EXPIRED`?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`INVITATION_REVOKED`||t===`MEMBERSHIP_REVOKED`?{type:`access-lost`,code:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`ORIGIN_MISMATCH`||t===`ORIGIN_NOT_ALLOWED`||t===`INVITATION_REQUIRED`?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:e instanceof Error?`transport`:`unknown`,recovery:`retry`,clearSnapshot:!0}}function Ae(e){if(!e||typeof e!=`object`)return;let t=e.data;if(typeof t==`string`)return t;if(t&&typeof t==`object`){let e=t.code;if(typeof e==`string`)return e}}function je(e){return structuredClone(e)}function M(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function Me(e){let t=M(e,`origin`);try{let e=new URL(t);if(e.origin!==t)throw Error();return e.origin}catch{throw Error(`A valid browser origin is required`)}}var Ne=class{client;session;#e=new Map;#t;#n;#r;#i;#a;#o;constructor(e,t,n){this.client=e,this.session=t,this.#t=(n.invitationId??t.invitationId).trim(),this.#n=new URL(n.origin).origin,this.#r=Pe(n.cursorThrottleMs??80,40,1e3),this.#i=Pe(n.heartbeatMs??1e4,2e3,2e4),this.#a=n.now??Date.now,this.#o=n.sessionId??(()=>globalThis.crypto.randomUUID())}subscribe(e,t,n,r){let i=!1,a=[],o=this.#s(e,t.roomId),s=()=>{i||n({pageId:e,peers:structuredClone(a)})},c=t.cursors||t.chat?this.client.onUpdate(A.presenceList,{...this.#d(),pageId:e,roomId:t.roomId},e=>{let t=this.#a();a=e.filter(({peerId:e,expiresAt:n})=>e!==o.sessionId&&n>t).map(({expiresAt:e,...t})=>t).sort((e,t)=>e.displayName.localeCompare(t.displayName)||e.peerId.localeCompare(t.peerId)),s()},e=>r?.(j(e))):()=>void 0;return queueMicrotask(s),()=>{i||(i=!0,c(),this.#u(o))}}publishPresence(e,t,n){let r=this.#e.get(N(e,t));!r||r.stopped||(r.latest={...n,reviewerId:this.session.reviewerId,displayName:this.session.displayName},this.#c(r))}#s(e,t){let n=N(e,t),r=this.#e.get(n);r&&this.#u(r);let i={pageId:e,roomId:t,sessionId:this.#o(),stopped:!1,lastSentAt:-1/0,inFlight:!1};return i.heartbeatTimer=setInterval(()=>{i.latest&&this.#l(i)},this.#i),this.#e.set(n,i),i}#c(e){if(e.inFlight||e.flushTimer||e.stopped)return;let t=Math.max(0,this.#r-(this.#a()-e.lastSentAt));if(t===0){this.#l(e);return}e.flushTimer=setTimeout(()=>{e.flushTimer=void 0,this.#l(e)},t)}async#l(e){if(e.stopped||e.inFlight||!e.latest)return;e.inFlight=!0;let t=e.latest;e.latest=void 0;try{await this.client.mutation(A.presenceUpdate,{...this.#d(),pageId:e.pageId,roomId:e.roomId,sessionId:e.sessionId,color:t.color,active:t.active,...t.pathname===void 0?{}:{pathname:t.pathname},...t.cursorX===void 0?{}:{cursorX:t.cursorX},...t.cursorY===void 0?{}:{cursorY:t.cursorY},...t.viewportWidth===void 0?{}:{viewportWidth:t.viewportWidth},...t.viewportHeight===void 0?{}:{viewportHeight:t.viewportHeight},...t.cursorChat===void 0?{}:{cursorChat:t.cursorChat}}),e.lastSentAt=this.#a()}finally{e.inFlight=!1,e.latest&&this.#c(e)}}#u(e){e.stopped||(e.stopped=!0,e.flushTimer&&clearTimeout(e.flushTimer),e.heartbeatTimer&&clearInterval(e.heartbeatTimer),this.#e.delete(N(e.pageId,e.roomId)),this.client.mutation(A.presenceDisconnect,{...this.#d(),sessionId:e.sessionId}).catch(()=>void 0))}#d(){return{invitationId:this.#t,origin:this.#n}}};function N(e,t){return`${e}\u0000${t}`}function Pe(e,t,n){return Number.isFinite(e)?Math.min(n,Math.max(t,Math.round(e))):t}var Fe=Object.defineProperty,Ie=(e,t,n)=>t in e?Fe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Le=(e,t,n)=>Ie(e,typeof t==`symbol`?t:t+``,n);function Re(e){switch(e){case`query`:return`Q`;case`mutation`:return`M`;case`action`:return`A`;case`any`:return`?`}}var ze=class{constructor(e){Le(this,`_onLogLineFuncs`),Le(this,`_verbose`),this._onLogLineFuncs={},this._verbose=e.verbose}addLogLineListener(e){let t=Math.random().toString(36).substring(2,15);for(let e=0;e<10&&this._onLogLineFuncs[t]!==void 0;e++)t=Math.random().toString(36).substring(2,15);return this._onLogLineFuncs[t]=e,()=>{delete this._onLogLineFuncs[t]}}logVerbose(...e){if(this._verbose)for(let t of Object.values(this._onLogLineFuncs))t(`debug`,`${new Date().toISOString()}`,...e)}log(...e){for(let t of Object.values(this._onLogLineFuncs))t(`info`,...e)}warn(...e){for(let t of Object.values(this._onLogLineFuncs))t(`warn`,...e)}error(...e){for(let t of Object.values(this._onLogLineFuncs))t(`error`,...e)}};function Be(e){let t=new ze(e);return t.addLogLineListener((e,...t)=>{switch(e){case`debug`:console.debug(...t);break;case`info`:console.log(...t);break;case`warn`:console.warn(...t);break;case`error`:console.error(...t);break;default:console.log(...t)}}),t}function Ve(e){return new ze(e)}function P(e,t,n,r,i){let a=Re(n);if(typeof i==`object`&&(i=`ConvexError ${JSON.stringify(i.errorData,null,2)}`),t===`info`){let t=i.match(/^\[.*?\] /);if(t===null){e.error(`[CONVEX ${a}(${r})] Could not parse console.log`);return}let n=i.slice(1,t[0].length-2),o=i.slice(t[0].length);e.log(`%c[CONVEX ${a}(${r})] [${n}]`,`color:rgb(0, 145, 255)`,o)}else e.error(`[CONVEX ${a}(${r})] ${i}`)}function He(e,t){let n=`[CONVEX FATAL ERROR] ${t}`;return e.error(n),Error(n)}function F(e,t,n){return`[CONVEX ${Re(e)}(${t})] ${n.errorMessage}
|
|
2
|
-
Called by client`}function I(e,t){return t.data=e.errorData,t}function L(e){let t=e.split(`:`),n,r;return t.length===1?(n=t[0],r=`default`):(n=t.slice(0,t.length-1).join(`:`),r=t[t.length-1]),n.endsWith(`.js`)&&(n=n.slice(0,-3)),`${n}:${r}`}function R(e,t){return JSON.stringify({udfPath:L(e),args:w(t)})}function Ue(e,t,n){let{initialNumItems:r,id:i}=n;return JSON.stringify({type:`paginated`,udfPath:L(e),args:w(t),options:w({initialNumItems:r,id:i})})}function We(e){return JSON.parse(e).type===`paginated`}var Ge=Object.defineProperty,Ke=(e,t,n)=>t in e?Ge(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,z=(e,t,n)=>Ke(e,typeof t==`symbol`?t:t+``,n),qe=class{constructor(){z(this,`nextQueryId`),z(this,`querySetVersion`),z(this,`querySet`),z(this,`queryIdToToken`),z(this,`identityVersion`),z(this,`auth`),z(this,`outstandingQueriesOlderThanRestart`),z(this,`outstandingAuthOlderThanRestart`),z(this,`paused`),z(this,`pendingQuerySetModifications`),this.nextQueryId=0,this.querySetVersion=0,this.identityVersion=0,this.querySet=new Map,this.queryIdToToken=new Map,this.outstandingQueriesOlderThanRestart=new Set,this.outstandingAuthOlderThanRestart=!1,this.paused=!1,this.pendingQuerySetModifications=new Map}hasSyncedPastLastReconnect(){return this.outstandingQueriesOlderThanRestart.size===0&&!this.outstandingAuthOlderThanRestart}markAuthCompletion(){this.outstandingAuthOlderThanRestart=!1}subscribe(e,t,n,r){let i=L(e),a=R(i,t),o=this.querySet.get(a);if(o!==void 0)return o.numSubscribers+=1,{queryToken:a,modification:null,unsubscribe:()=>this.removeSubscriber(a)};{let e=this.nextQueryId++,o={id:e,canonicalizedUdfPath:i,args:t,numSubscribers:1,journal:n,componentPath:r};this.querySet.set(a,o),this.queryIdToToken.set(e,a);let s=this.querySetVersion,c=this.querySetVersion+1,l={type:`Add`,queryId:e,udfPath:i,args:[w(t)],journal:n,componentPath:r};return this.paused?this.pendingQuerySetModifications.set(e,l):this.querySetVersion=c,{queryToken:a,modification:{type:`ModifyQuerySet`,baseVersion:s,newVersion:c,modifications:[l]},unsubscribe:()=>this.removeSubscriber(a)}}}transition(e){for(let t of e.modifications)switch(t.type){case`QueryUpdated`:case`QueryFailed`:{this.outstandingQueriesOlderThanRestart.delete(t.queryId);let e=t.journal;if(e!==void 0){let n=this.queryIdToToken.get(t.queryId);n!==void 0&&(this.querySet.get(n).journal=e)}break}case`QueryRemoved`:this.outstandingQueriesOlderThanRestart.delete(t.queryId);break;default:throw Error(`Invalid modification ${t.type}`)}}queryId(e,t){let n=R(L(e),t),r=this.querySet.get(n);return r===void 0?null:r.id}isCurrentOrNewerAuthVersion(e){return e>=this.identityVersion}getAuth(){return this.auth}setAuth(e){this.auth={tokenType:`User`,value:e};let t=this.identityVersion;return this.paused||(this.identityVersion=t+1),{type:`Authenticate`,baseVersion:t,...this.auth}}setAdminAuth(e,t){let n={tokenType:`Admin`,value:e,impersonating:t};this.auth=n;let r=this.identityVersion;return this.paused||(this.identityVersion=r+1),{type:`Authenticate`,baseVersion:r,...n}}clearAuth(){this.auth=void 0,this.markAuthCompletion();let e=this.identityVersion;return this.paused||(this.identityVersion=e+1),{type:`Authenticate`,tokenType:`None`,baseVersion:e}}hasAuth(){return!!this.auth}isNewAuth(e){return this.auth?.value!==e}queryPath(e){let t=this.queryIdToToken.get(e);return t?this.querySet.get(t).canonicalizedUdfPath:null}queryArgs(e){let t=this.queryIdToToken.get(e);return t?this.querySet.get(t).args:null}queryToken(e){return this.queryIdToToken.get(e)??null}queryJournal(e){return this.querySet.get(e)?.journal}restart(){this.unpause(),this.outstandingQueriesOlderThanRestart.clear();let e=[];for(let t of this.querySet.values()){let n={type:`Add`,queryId:t.id,udfPath:t.canonicalizedUdfPath,args:[w(t.args)],journal:t.journal,componentPath:t.componentPath};e.push(n),this.outstandingQueriesOlderThanRestart.add(t.id)}this.querySetVersion=1;let t={type:`ModifyQuerySet`,baseVersion:0,newVersion:1,modifications:e};if(!this.auth)return this.identityVersion=0,[t,void 0];this.outstandingAuthOlderThanRestart=!0;let n={type:`Authenticate`,baseVersion:0,...this.auth};return this.identityVersion=1,[t,n]}pause(){this.paused=!0}resume(){let e=this.pendingQuerySetModifications.size>0?{type:`ModifyQuerySet`,baseVersion:this.querySetVersion,newVersion:++this.querySetVersion,modifications:Array.from(this.pendingQuerySetModifications.values())}:void 0,t=this.auth===void 0?void 0:{type:`Authenticate`,baseVersion:this.identityVersion++,...this.auth};return this.unpause(),[e,t]}unpause(){this.paused=!1,this.pendingQuerySetModifications.clear()}removeSubscriber(e){let t=this.querySet.get(e);if(t.numSubscribers>1)return--t.numSubscribers,null;{this.querySet.delete(e),this.queryIdToToken.delete(t.id),this.outstandingQueriesOlderThanRestart.delete(t.id);let n=this.querySetVersion,r=this.querySetVersion+1,i={type:`Remove`,queryId:t.id};return this.paused?this.pendingQuerySetModifications.has(t.id)?this.pendingQuerySetModifications.delete(t.id):this.pendingQuerySetModifications.set(t.id,i):this.querySetVersion=r,{type:`ModifyQuerySet`,baseVersion:n,newVersion:r,modifications:[i]}}}},Je=Object.defineProperty,Ye=(e,t,n)=>t in e?Je(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,B=(e,t,n)=>Ye(e,typeof t==`symbol`?t:t+``,n),Xe=class{constructor(e,t){this.logger=e,this.markConnectionStateDirty=t,B(this,`inflightRequests`),B(this,`requestsOlderThanRestart`),B(this,`inflightMutationsCount`,0),B(this,`inflightActionsCount`,0),this.inflightRequests=new Map,this.requestsOlderThanRestart=new Set}request(e,t){let n=new Promise(n=>{let r=t?`Requested`:`NotSent`;this.inflightRequests.set(e.requestId,{message:e,status:{status:r,requestedAt:new Date,onResult:n}}),e.type===`Mutation`?this.inflightMutationsCount++:e.type===`Action`&&this.inflightActionsCount++});return this.markConnectionStateDirty(),n}onResponse(e){let t=this.inflightRequests.get(e.requestId);if(t===void 0||t.status.status===`Completed`)return null;let n=t.message.type===`Mutation`?`mutation`:`action`,r=t.message.udfPath;for(let t of e.logLines)P(this.logger,`info`,n,r,t);let i=t.status,a,o;if(e.success)a={success:!0,logLines:e.logLines,value:b(e.result)},o=()=>i.onResult(a);else{let t=e.result,{errorData:s}=e;P(this.logger,`error`,n,r,t),a={success:!1,errorMessage:t,errorData:s===void 0?void 0:b(s),logLines:e.logLines},o=()=>i.onResult(a)}return e.type===`ActionResponse`||!e.success?(o(),this.inflightRequests.delete(e.requestId),this.requestsOlderThanRestart.delete(e.requestId),t.message.type===`Action`?this.inflightActionsCount--:t.message.type===`Mutation`&&this.inflightMutationsCount--,this.markConnectionStateDirty(),{requestId:e.requestId,result:a}):(t.status={status:`Completed`,result:a,ts:e.ts,onResolve:o},null)}removeCompleted(e){let t=new Map;for(let[n,r]of this.inflightRequests.entries()){let i=r.status;i.status===`Completed`&&i.ts.lessThanOrEqual(e)&&(i.onResolve(),t.set(n,i.result),r.message.type===`Mutation`?this.inflightMutationsCount--:r.message.type===`Action`&&this.inflightActionsCount--,this.inflightRequests.delete(n),this.requestsOlderThanRestart.delete(n))}return t.size>0&&this.markConnectionStateDirty(),t}restart(){this.requestsOlderThanRestart=new Set(this.inflightRequests.keys());let e=[];for(let[t,n]of this.inflightRequests){if(n.status.status===`NotSent`){n.status.status=`Requested`,e.push(n.message);continue}if(n.message.type===`Mutation`)e.push(n.message);else if(n.message.type===`Action`){if(this.inflightRequests.delete(t),this.requestsOlderThanRestart.delete(t),this.inflightActionsCount--,n.status.status===`Completed`)throw Error(`Action should never be in 'Completed' state`);n.status.onResult({success:!1,errorMessage:`Connection lost while action was in flight`,logLines:[]})}}return this.markConnectionStateDirty(),e}resume(){let e=[];for(let[,t]of this.inflightRequests)if(t.status.status===`NotSent`){t.status.status=`Requested`,e.push(t.message);continue}return e}hasIncompleteRequests(){for(let e of this.inflightRequests.values())if(e.status.status===`Requested`)return!0;return!1}hasInflightRequests(){return this.inflightRequests.size>0}hasSyncedPastLastReconnect(){return this.requestsOlderThanRestart.size===0}timeOfOldestInflightRequest(){if(this.inflightRequests.size===0)return null;let e=Date.now();for(let t of this.inflightRequests.values())t.status.status!==`Completed`&&t.status.requestedAt.getTime()<e&&(e=t.status.requestedAt.getTime());return new Date(e)}inflightMutations(){return this.inflightMutationsCount}inflightActions(){return this.inflightActionsCount}},Ze=Object.defineProperty,Qe=(e,t,n)=>t in e?Ze(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,V=(e,t,n)=>Qe(e,typeof t==`symbol`?t:t+``,n),$e=class e{constructor(e){V(this,`queryResults`),V(this,`modifiedQueries`),this.queryResults=e,this.modifiedQueries=[]}getQuery(t,...n){let r=m(n[0]),i=O(t),a=this.queryResults.get(R(i,r));if(a!==void 0)return e.queryValue(a.result)}getAllQueries(t){let n=[],r=O(t);for(let t of this.queryResults.values())t.udfPath===L(r)&&n.push({args:t.args,value:e.queryValue(t.result)});return n}setQuery(e,t,n){let r=m(t),i=O(e),a=R(i,r),o;o=n===void 0?void 0:{success:!0,value:n,logLines:[]};let s={udfPath:i,args:r,result:o};this.queryResults.set(a,s),this.modifiedQueries.push(a)}static queryValue(e){if(e!==void 0&&e.success)return e.value}},et=class{constructor(){V(this,`queryResults`),V(this,`optimisticUpdates`),this.queryResults=new Map,this.optimisticUpdates=[]}ingestQueryResultsFromServer(e,t){this.optimisticUpdates=this.optimisticUpdates.filter(e=>!t.has(e.mutationId));let n=this.queryResults;this.queryResults=new Map(e);let r=new $e(this.queryResults);for(let e of this.optimisticUpdates)e.update(r);let i=[];for(let[e,t]of this.queryResults){let r=n.get(e);(r===void 0||r.result!==t.result)&&i.push(e)}return i}applyOptimisticUpdate(e,t){this.optimisticUpdates.push({update:e,mutationId:t});let n=new $e(this.queryResults);return e(n),n.modifiedQueries}rawQueryResult(e){let t=this.queryResults.get(e);if(t!==void 0)return t.result}queryResult(e){let t=this.queryResults.get(e);if(t===void 0)return;let n=t.result;if(n!==void 0){if(n.success)return n.value;throw n.errorData===void 0?Error(F(`query`,t.udfPath,n)):I(n,new E(F(`query`,t.udfPath,n)))}}hasQueryResult(e){return this.queryResults.get(e)!==void 0}queryLogs(e){return this.queryResults.get(e)?.result?.logLines}},tt=Object.defineProperty,nt=(e,t,n)=>t in e?tt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,H=(e,t,n)=>nt(e,typeof t==`symbol`?t:t+``,n),U=class e{constructor(e,t){H(this,`low`),H(this,`high`),H(this,`__isUnsignedLong__`),this.low=e|0,this.high=t|0,this.__isUnsignedLong__=!0}static isLong(e){return(e&&e.__isUnsignedLong__)===!0}static fromBytesLE(t){return new e(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24)}toBytesLE(){let e=this.high,t=this.low;return[t&255,t>>>8&255,t>>>16&255,t>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]}static fromNumber(t){return isNaN(t)||t<0?rt:t>=at?ot:new e(t%W|0,t/W|0)}toString(){return(BigInt(this.high)*BigInt(W)+BigInt(this.low)).toString()}equals(t){return e.isLong(t)||(t=e.fromValue(t)),this.high>>>31==1&&t.high>>>31==1?!1:this.high===t.high&&this.low===t.low}notEquals(e){return!this.equals(e)}comp(t){return e.isLong(t)||(t=e.fromValue(t)),this.equals(t)?0:t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1}lessThanOrEqual(e){return this.comp(e)<=0}static fromValue(t){return typeof t==`number`?e.fromNumber(t):new e(t.low,t.high)}};const rt=new U(0,0),it=65536,W=it*it,at=W*W,ot=new U(-1,-1);var st=Object.defineProperty,ct=(e,t,n)=>t in e?st(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,G=(e,t,n)=>ct(e,typeof t==`symbol`?t:t+``,n),lt=class{constructor(e,t){G(this,`version`),G(this,`remoteQuerySet`),G(this,`queryPath`),G(this,`logger`),this.version={querySet:0,ts:U.fromNumber(0),identity:0},this.remoteQuerySet=new Map,this.queryPath=e,this.logger=t}transition(e){let t=e.startVersion;if(this.version.querySet!==t.querySet||this.version.ts.notEquals(t.ts)||this.version.identity!==t.identity)throw Error(`Invalid start version: ${t.ts.toString()}:${t.querySet}:${t.identity}, transitioning from ${this.version.ts.toString()}:${this.version.querySet}:${this.version.identity}`);for(let t of e.modifications)switch(t.type){case`QueryUpdated`:{let e=this.queryPath(t.queryId);if(e)for(let n of t.logLines)P(this.logger,`info`,`query`,e,n);let n=b(t.value??null);this.remoteQuerySet.set(t.queryId,{success:!0,value:n,logLines:t.logLines});break}case`QueryFailed`:{let e=this.queryPath(t.queryId);if(e)for(let n of t.logLines)P(this.logger,`info`,`query`,e,n);let{errorData:n}=t;this.remoteQuerySet.set(t.queryId,{success:!1,errorMessage:t.errorMessage,errorData:n===void 0?void 0:b(n),logLines:t.logLines});break}case`QueryRemoved`:this.remoteQuerySet.delete(t.queryId);break;default:throw Error(`Invalid modification ${t.type}`)}this.version=e.endVersion}remoteQueryResults(){return this.remoteQuerySet}timestamp(){return this.version.ts}};function K(e){let t=d(e);return U.fromBytesLE(Array.from(t))}function ut(e){return p(new Uint8Array(e.toBytesLE()))}function dt(e){switch(e.type){case`FatalError`:case`AuthError`:case`ActionResponse`:case`TransitionChunk`:case`Ping`:return{...e};case`MutationResponse`:return e.success?{...e,ts:K(e.ts)}:{...e};case`Transition`:return{...e,startVersion:{...e.startVersion,ts:K(e.startVersion.ts)},endVersion:{...e.endVersion,ts:K(e.endVersion.ts)}};default:}}function ft(e){switch(e.type){case`Authenticate`:case`ModifyQuerySet`:case`Mutation`:case`Action`:case`Event`:return{...e};case`Connect`:return e.maxObservedTimestamp===void 0?{...e,maxObservedTimestamp:void 0}:{...e,maxObservedTimestamp:ut(e.maxObservedTimestamp)};default:}}var pt=Object.defineProperty,mt=(e,t,n)=>t in e?pt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,q=(e,t,n)=>mt(e,typeof t==`symbol`?t:t+``,n);let J;function Y(){return J===void 0&&(J=Date.now()),typeof performance>`u`||!performance.now?Date.now():Math.round(J+performance.now())}function ht(){return`t=${Math.round((Y()-J)/100)/10}s`}const gt={InternalServerError:{timeout:1e3},SubscriptionsWorkerFullError:{timeout:3e3},TooManyConcurrentRequests:{timeout:3e3},CommitterFullError:{timeout:3e3},AwsTooManyRequestsException:{timeout:3e3},ExecuteFullError:{timeout:3e3},SystemTimeoutError:{timeout:3e3},ExpiredInQueue:{timeout:3e3},VectorIndexesUnavailable:{timeout:1e3},SearchIndexesUnavailable:{timeout:1e3},TableSummariesUnavailable:{timeout:1e3},VectorIndexTooLarge:{timeout:3e3},SearchIndexTooLarge:{timeout:3e3},TooManyWritesInTimePeriod:{timeout:3e3}};function _t(e){if(e===void 0)return`Unknown`;for(let t of Object.keys(gt))if(e.startsWith(t))return t;return`Unknown`}var vt=class{constructor(e,t,n,r,i,a){this.markConnectionStateDirty=i,this.debug=a,q(this,`socket`),q(this,`connectionCount`),q(this,`_hasEverConnected`,!1),q(this,`lastCloseReason`),q(this,`transitionChunkBuffer`,null),q(this,`defaultInitialBackoff`),q(this,`maxBackoff`),q(this,`retries`),q(this,`serverInactivityThreshold`),q(this,`reconnectDueToServerInactivityTimeout`),q(this,`scheduledReconnect`,null),q(this,`networkOnlineHandler`,null),q(this,`pendingNetworkRecoveryInfo`,null),q(this,`uri`),q(this,`onOpen`),q(this,`onResume`),q(this,`onMessage`),q(this,`webSocketConstructor`),q(this,`logger`),q(this,`onServerDisconnectError`),this.webSocketConstructor=n,this.socket={state:`disconnected`},this.connectionCount=0,this.lastCloseReason=`InitialConnect`,this.defaultInitialBackoff=1e3,this.maxBackoff=16e3,this.retries=0,this.serverInactivityThreshold=6e4,this.reconnectDueToServerInactivityTimeout=null,this.uri=e,this.onOpen=t.onOpen,this.onResume=t.onResume,this.onMessage=t.onMessage,this.onServerDisconnectError=t.onServerDisconnectError,this.logger=r,this.setupNetworkListener(),this.connect()}setSocketState(e){this.socket=e,this._logVerbose(`socket state changed: ${this.socket.state}, paused: ${`paused`in this.socket?this.socket.paused:void 0}`),this.markConnectionStateDirty()}setupNetworkListener(){typeof window>`u`||typeof window.addEventListener!=`function`||this.networkOnlineHandler===null&&(this.networkOnlineHandler=()=>{this._logVerbose(`network online event detected`),this.tryReconnectImmediately()},window.addEventListener(`online`,this.networkOnlineHandler),this._logVerbose(`network online event listener registered`))}cleanupNetworkListener(){this.networkOnlineHandler&&typeof window<`u`&&typeof window.removeEventListener==`function`&&(window.removeEventListener(`online`,this.networkOnlineHandler),this.networkOnlineHandler=null,this._logVerbose(`network online event listener removed`))}assembleTransition(e){if(e.partNumber<0||e.partNumber>=e.totalParts||e.totalParts===0||this.transitionChunkBuffer&&(this.transitionChunkBuffer.totalParts!==e.totalParts||this.transitionChunkBuffer.transitionId!==e.transitionId))throw this.transitionChunkBuffer=null,Error(`Invalid TransitionChunk`);if(this.transitionChunkBuffer===null&&(this.transitionChunkBuffer={chunks:[],totalParts:e.totalParts,transitionId:e.transitionId}),e.partNumber!==this.transitionChunkBuffer.chunks.length){let t=this.transitionChunkBuffer.chunks.length;throw this.transitionChunkBuffer=null,Error(`TransitionChunk received out of order: expected part ${t}, got ${e.partNumber}`)}if(this.transitionChunkBuffer.chunks.push(e.chunk),this.transitionChunkBuffer.chunks.length===e.totalParts){let e=this.transitionChunkBuffer.chunks.join(``);this.transitionChunkBuffer=null;let t=dt(JSON.parse(e));if(t.type!==`Transition`)throw Error(`Expected Transition, got ${t.type} after assembling chunks`);return t}return null}connect(){if(this.socket.state===`terminated`)return;if(this.socket.state!==`disconnected`&&this.socket.state!==`stopped`)throw Error(`Didn't start connection from disconnected state: `+this.socket.state);let e=new this.webSocketConstructor(this.uri);this._logVerbose(`constructed WebSocket`),this.setSocketState({state:`connecting`,ws:e,paused:`no`}),this.resetServerInactivityTimeout(),e.onopen=()=>{if(this.logger.logVerbose(`begin ws.onopen`),this.socket.state!==`connecting`)throw Error(`onopen called with socket not in connecting state`);if(this.setSocketState({state:`ready`,ws:e,paused:this.socket.paused===`yes`?`uninitialized`:`no`}),this.resetServerInactivityTimeout(),this.socket.paused===`no`&&(this._hasEverConnected=!0,this.onOpen({connectionCount:this.connectionCount,lastCloseReason:this.lastCloseReason,clientTs:Y()})),this.lastCloseReason!==`InitialConnect`&&(this.lastCloseReason?this.logger.log(`WebSocket reconnected at`,ht(),`after disconnect due to`,this.lastCloseReason):this.logger.log(`WebSocket reconnected at`,ht())),this.connectionCount+=1,this.lastCloseReason=null,this.pendingNetworkRecoveryInfo!==null){let{timeSavedMs:e}=this.pendingNetworkRecoveryInfo;this.pendingNetworkRecoveryInfo=null,this.sendMessage({type:`Event`,eventType:`NetworkRecoveryReconnect`,event:{timeSavedMs:e}}),this.logger.log(`Network recovery reconnect saved ~${Math.round(e/1e3)}s of waiting`)}},e.onerror=e=>{this.transitionChunkBuffer=null;let t=e.message;t&&this.logger.log(`WebSocket error message: ${t}`)},e.onmessage=e=>{this.resetServerInactivityTimeout();let t=e.data.length,n=dt(JSON.parse(e.data));if(this._logVerbose(`received ws message with type ${n.type}`),n.type!==`Ping`){if(n.type===`TransitionChunk`){let e=this.assembleTransition(n);if(!e)return;n=e,this._logVerbose(`assembled full ws message of type ${n.type}`)}this.transitionChunkBuffer!==null&&(this.transitionChunkBuffer=null,this.logger.log(`Received unexpected ${n.type} while buffering TransitionChunks`)),n.type===`Transition`&&this.reportLargeTransition({messageLength:t,transition:n}),this.onMessage(n).hasSyncedPastLastReconnect&&(this.retries=0,this.markConnectionStateDirty())}},e.onclose=e=>{if(this._logVerbose(`begin ws.onclose`),this.transitionChunkBuffer=null,this.lastCloseReason===null&&(this.lastCloseReason=e.reason||`closed with code ${e.code}`),e.code!==1e3&&e.code!==1001&&e.code!==1005&&e.code!==4040){let t=`WebSocket closed with code ${e.code}`;e.reason&&(t+=`: ${e.reason}`),this.logger.log(t),this.onServerDisconnectError&&e.reason&&this.onServerDisconnectError(t)}let t=_t(e.reason);this.scheduleReconnect(t)}}socketState(){return this.socket.state}sendMessage(e){let t={type:e.type,...e.type===`Authenticate`&&e.tokenType===`User`?{value:`...${e.value.slice(-7)}`}:{}};if(this.socket.state===`ready`&&this.socket.paused===`no`){let n=ft(e),r=JSON.stringify(n),i=!1;try{this.socket.ws.send(r),i=!0}catch(e){this.logger.log(`Failed to send message on WebSocket, reconnecting: ${e}`),this.closeAndReconnect(`FailedToSendMessage`)}return this._logVerbose(`${i?`sent`:`failed to send`} message with type ${e.type}: ${JSON.stringify(t)}`),!0}return this._logVerbose(`message not sent (socket state: ${this.socket.state}, paused: ${`paused`in this.socket?this.socket.paused:void 0}): ${JSON.stringify(t)}`),!1}resetServerInactivityTimeout(){this.socket.state!==`terminated`&&(this.reconnectDueToServerInactivityTimeout!==null&&(clearTimeout(this.reconnectDueToServerInactivityTimeout),this.reconnectDueToServerInactivityTimeout=null),this.reconnectDueToServerInactivityTimeout=setTimeout(()=>{this.closeAndReconnect(`InactiveServer`)},this.serverInactivityThreshold))}scheduleReconnect(e){this.scheduledReconnect&&=(clearTimeout(this.scheduledReconnect.timeout),null),this.socket={state:`disconnected`};let t=this.nextBackoff(e);this.markConnectionStateDirty(),this.logger.log(`Attempting reconnect in ${Math.round(t)}ms`);let n=Y(),r=setTimeout(()=>{this.scheduledReconnect?.timeout===r&&(this.scheduledReconnect=null,this.connect())},t);this.scheduledReconnect={timeout:r,scheduledAt:n,backoffMs:t}}closeAndReconnect(e){switch(this._logVerbose(`begin closeAndReconnect with reason ${e}`),this.socket.state){case`disconnected`:case`terminated`:case`stopped`:return;case`connecting`:case`ready`:this.lastCloseReason=e,this.close(),this.scheduleReconnect(`client`);return;default:this.socket}}close(){switch(this.transitionChunkBuffer=null,this.socket.state){case`disconnected`:case`terminated`:case`stopped`:return Promise.resolve();case`connecting`:{let e=this.socket.ws;return e.onmessage=e=>{this._logVerbose(`Ignoring message received after close`)},new Promise(t=>{e.onclose=()=>{this._logVerbose(`Closed after connecting`),t()},e.onopen=()=>{this._logVerbose(`Opened after connecting`),e.close()}})}case`ready`:{this._logVerbose(`ws.close called`);let e=this.socket.ws;e.onmessage=e=>{this._logVerbose(`Ignoring message received after close`)};let t=new Promise(t=>{e.onclose=()=>{t()}});return e.close(),t}default:return this.socket,Promise.resolve()}}terminate(){switch(this.reconnectDueToServerInactivityTimeout&&clearTimeout(this.reconnectDueToServerInactivityTimeout),this.scheduledReconnect&&=(clearTimeout(this.scheduledReconnect.timeout),null),this.cleanupNetworkListener(),this.socket.state){case`terminated`:case`stopped`:case`disconnected`:case`connecting`:case`ready`:{let e=this.close();return this.setSocketState({state:`terminated`}),e}default:throw this.socket,Error(`Invalid websocket state: ${this.socket.state}`)}}stop(){switch(this.socket.state){case`terminated`:return Promise.resolve();case`connecting`:case`stopped`:case`disconnected`:case`ready`:{this.cleanupNetworkListener();let e=this.close();return this.socket={state:`stopped`},e}default:return this.socket,Promise.resolve()}}tryRestart(){switch(this.socket.state){case`stopped`:break;case`terminated`:case`connecting`:case`ready`:case`disconnected`:this.logger.logVerbose(`Restart called without stopping first`);return;default:this.socket}this.setupNetworkListener(),this.connect()}pause(){switch(this.socket.state){case`disconnected`:case`stopped`:case`terminated`:return;case`connecting`:case`ready`:this.socket={...this.socket,paused:`yes`};return;default:this.socket;return}}tryReconnectImmediately(){if(this._logVerbose(`tryReconnectImmediately called`),this.socket.state!==`disconnected`){this._logVerbose(`tryReconnectImmediately called but socket state is ${this.socket.state}, no action taken`);return}let e=null;if(this.scheduledReconnect){let t=Y()-this.scheduledReconnect.scheduledAt;e=Math.max(0,this.scheduledReconnect.backoffMs-t),this._logVerbose(`would have waited ${Math.round(e)}ms more (backoff was ${Math.round(this.scheduledReconnect.backoffMs)}ms, elapsed ${Math.round(t)}ms)`),clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null,this._logVerbose(`canceled scheduled reconnect`)}this.logger.log(`Network recovery detected, reconnecting immediately`),this.pendingNetworkRecoveryInfo=e===null?null:{timeSavedMs:e},this.connect()}resume(){switch(this.socket.state){case`connecting`:this.socket={...this.socket,paused:`no`};return;case`ready`:this.socket.paused===`uninitialized`?(this.socket={...this.socket,paused:`no`},this._hasEverConnected=!0,this.onOpen({connectionCount:this.connectionCount,lastCloseReason:this.lastCloseReason,clientTs:Y()})):this.socket.paused===`yes`&&(this.socket={...this.socket,paused:`no`},this.onResume());return;case`terminated`:case`stopped`:case`disconnected`:return;default:this.socket}this.connect()}connectionState(){return{isConnected:this.socket.state===`ready`,hasEverConnected:this._hasEverConnected,connectionCount:this.connectionCount,connectionRetries:this.retries}}_logVerbose(e){this.logger.logVerbose(e)}nextBackoff(e){let t=(e===`client`?100:e===`Unknown`?this.defaultInitialBackoff:gt[e].timeout)*2**this.retries;this.retries+=1;let n=Math.min(t,this.maxBackoff);return n+n*(Math.random()-.5)}reportLargeTransition({transition:e,messageLength:t}){if(e.clientClockSkew===void 0||e.serverTs===void 0)return;let n=Y()-e.clientClockSkew-e.serverTs/1e6,r=`${Math.round(n)}ms`,i=`${Math.round(t/1e4)/100}MB`,a=t/(n/1e3),o=`${Math.round(a/1e4)/100}MB per second`;this._logVerbose(`received ${i} transition in ${r} at ${o}`),t>2e7?this.logger.log(`received query results totaling more that 20MB (${i}) which will take a long time to download on slower connections`):n>2e4&&this.logger.log(`received query results totaling ${i} which took more than 20s to arrive (${r})`),this.debug&&this.sendMessage({type:`Event`,eventType:`ClientReceivedTransition`,event:{transitionTransitTime:n,messageLength:t}})}};function yt(){return bt()}function bt(){return`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}var X=class extends Error{};X.prototype.name=`InvalidTokenError`;function xt(e){return decodeURIComponent(atob(e).replace(/(.)/g,(e,t)=>{let n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n=`0`+n),`%`+n}))}function St(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);switch(t.length%4){case 0:break;case 2:t+=`==`;break;case 3:t+=`=`;break;default:throw Error(`base64 string is not of the correct length`)}try{return xt(t)}catch{return atob(t)}}function Ct(e,t){if(typeof e!=`string`)throw new X(`Invalid token specified: must be a string`);t||={};let n=t.header===!0?0:1,r=e.split(`.`)[n];if(typeof r!=`string`)throw new X(`Invalid token specified: missing part #${n+1}`);let i;try{i=St(r)}catch(e){throw new X(`Invalid token specified: invalid base64 for part #${n+1} (${e.message})`)}try{return JSON.parse(i)}catch(e){throw new X(`Invalid token specified: invalid json for part #${n+1} (${e.message})`)}}var wt=Object.defineProperty,Tt=(e,t,n)=>t in e?wt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Z=(e,t,n)=>Tt(e,typeof t==`symbol`?t:t+``,n),Et=class{constructor(e,t,n){Z(this,`authState`,{state:`noAuth`}),Z(this,`configVersion`,0),Z(this,`syncState`),Z(this,`authenticate`),Z(this,`stopSocket`),Z(this,`tryRestartSocket`),Z(this,`pauseSocket`),Z(this,`resumeSocket`),Z(this,`clearAuth`),Z(this,`logger`),Z(this,`refreshTokenLeewaySeconds`),Z(this,`initialAuthTokenReuse`),Z(this,`lastRefreshChange`),Z(this,`tokenConfirmationAttempts`,0),this.syncState=e,this.authenticate=t.authenticate,this.stopSocket=t.stopSocket,this.tryRestartSocket=t.tryRestartSocket,this.pauseSocket=t.pauseSocket,this.resumeSocket=t.resumeSocket,this.clearAuth=t.clearAuth,this.logger=n.logger,this.refreshTokenLeewaySeconds=n.refreshTokenLeewaySeconds,this.initialAuthTokenReuse=n.initialAuthTokenReuse,this.lastRefreshChange=!1}notifyRefreshChange(e){this.authState.state!==`noAuth`&&this.authState.state!==`initialRefetch`&&this.authState.config.onRefreshChange&&this.lastRefreshChange!==e&&(this.lastRefreshChange=e,this.authState.config.onRefreshChange(e))}async setConfig(e,t,n){this.resetAuthState(),this._logVerbose(`pausing WS for auth token fetch`),this.pauseSocket();let r=await this.fetchTokenAndGuardAgainstRace(e,{forceRefreshToken:!1});if(r.isFromOutdatedConfig)return;let i={fetchToken:e,onAuthChange:t,onRefreshChange:n};r.value?(this.setAuthState({state:`waitingForServerConfirmationOfCachedToken`,config:i,hasRetried:!1}),this.authenticate(r.value)):(this.setAuthState({state:`initialRefetch`,config:i}),await this.refetchToken()),this._logVerbose(`resuming WS after auth token fetch`),this.resumeSocket()}onTransition(e){if(this.syncState.isCurrentOrNewerAuthVersion(e.endVersion.identity)&&!(e.endVersion.identity<=e.startVersion.identity)){if(this._logVerbose(`auth state is ${this.authState.state} when handling transition`),this.syncState.markAuthCompletion(),this.authState.state===`waitingForServerConfirmationOfCachedToken`){this._logVerbose(`server confirmed auth token is valid`);let t=this.syncState.getAuth()?.value;this.initialAuthTokenReuse&&t?this.scheduleTokenRefetch(t,e.clientClockSkew):this.refetchToken(),this.authState.config.onAuthChange(!0);return}this.authState.state===`waitingForServerConfirmationOfFreshToken`&&(this._logVerbose(`server confirmed new auth token is valid`),this.notifyRefreshChange(!1),this.scheduleTokenRefetch(this.authState.token),this.tokenConfirmationAttempts=0,this.authState.hadAuth||this.authState.config.onAuthChange(!0))}}onAuthError(e){if(e.authUpdateAttempted===!1&&(this.authState.state===`waitingForServerConfirmationOfFreshToken`||this.authState.state===`waitingForServerConfirmationOfCachedToken`)){this._logVerbose(`ignoring non-auth token expired error`);return}let{baseVersion:t}=e;if(!this.syncState.isCurrentOrNewerAuthVersion(t+1)){this._logVerbose(`ignoring auth error for previous auth attempt`);return}this.tryToReauthenticate(e)}async tryToReauthenticate(e){if(this._logVerbose(`attempting to reauthenticate: ${e.error}`),this.authState.state===`noAuth`||this.authState.state===`waitingForServerConfirmationOfFreshToken`&&this.tokenConfirmationAttempts>=2){this.logger.error(`Failed to authenticate: "${e.error}", check your server auth config`),this.syncState.hasAuth()&&this.syncState.clearAuth(),this.authState.state!==`noAuth`&&this.setAndReportAuthFailed(this.authState.config.onAuthChange);return}if(this.authState.state===`waitingForServerConfirmationOfFreshToken`&&(this.tokenConfirmationAttempts++,this._logVerbose(`retrying reauthentication, ${2-this.tokenConfirmationAttempts} attempts remaining`)),this.notifyRefreshChange(!0),await this.stopSocket(),this.authState.state===`noAuth`)return;let t=await this.fetchTokenAndGuardAgainstRace(this.authState.config.fetchToken,{forceRefreshToken:!0});t.isFromOutdatedConfig||(t.value&&this.syncState.isNewAuth(t.value)?(this.authenticate(t.value),this.setAuthState({state:`waitingForServerConfirmationOfFreshToken`,config:this.authState.config,token:t.value,hadAuth:this.authState.state===`notRefetching`||this.authState.state===`waitingForScheduledRefetch`})):(this._logVerbose(`reauthentication failed, could not fetch a new token`),this.syncState.hasAuth()&&this.syncState.clearAuth(),this.setAndReportAuthFailed(this.authState.config.onAuthChange)),this.tryRestartSocket())}async refetchToken(){if(this.authState.state===`noAuth`)return;this._logVerbose(`refetching auth token`);let e=await this.fetchTokenAndGuardAgainstRace(this.authState.config.fetchToken,{forceRefreshToken:!0});e.isFromOutdatedConfig||(e.value?this.syncState.isNewAuth(e.value)?(this.setAuthState({state:`waitingForServerConfirmationOfFreshToken`,hadAuth:this.syncState.hasAuth(),token:e.value,config:this.authState.config}),this.authenticate(e.value)):this.setAuthState({state:`notRefetching`,config:this.authState.config}):(this._logVerbose(`refetching token failed`),this.syncState.hasAuth()&&this.clearAuth(),this.setAndReportAuthFailed(this.authState.config.onAuthChange)),this._logVerbose(`restarting WS after auth token fetch (if currently stopped)`),this.tryRestartSocket())}scheduleTokenRefetch(e,t){if(this.authState.state===`noAuth`)return;let n=this.decodeToken(e);if(!n){this.logger.error(`Auth token is not a valid JWT, cannot refetch the token`);return}let{iat:r,exp:i}=n;if(!r||!i){this.logger.error(`Auth token does not have required fields, cannot refetch the token`);return}let a=i-r;if(a<=2){this.logger.error(`Auth token does not live long enough, cannot refetch the token`);return}let o;t===void 0?o=a:(o=i-(Date.now()-t)/1e3,o<=0&&(o=0));let s=Math.min(1728e6,(o-this.refreshTokenLeewaySeconds)*1e3);s<=0&&(this.logger.warn(`Refetching auth token immediately, configured leeway ${this.refreshTokenLeewaySeconds}s is larger than the token's lifetime ${o}s`),s=0);let c=setTimeout(()=>{this._logVerbose(`running scheduled token refetch`),this.refetchToken()},s);this.setAuthState({state:`waitingForScheduledRefetch`,refetchTokenTimeoutId:c,config:this.authState.config}),this._logVerbose(`scheduled preemptive auth token refetching in ${s}ms`)}async fetchTokenAndGuardAgainstRace(e,t){let n=++this.configVersion;this._logVerbose(`fetching token with config version ${n}`);let r=await e(t);return this.configVersion===n?{isFromOutdatedConfig:!1,value:r}:(this._logVerbose(`stale config version, expected ${n}, got ${this.configVersion}`),{isFromOutdatedConfig:!0})}stop(){this.resetAuthState(),this.configVersion++,this._logVerbose(`config version bumped to ${this.configVersion}`)}setAndReportAuthFailed(e){e(!1),this.resetAuthState()}resetAuthState(){this.notifyRefreshChange(!1),this.setAuthState({state:`noAuth`})}setAuthState(e){let t=e.state===`waitingForServerConfirmationOfFreshToken`?{hadAuth:e.hadAuth,state:e.state,token:`...${e.token.slice(-7)}`}:{state:e.state};switch(this._logVerbose(`setting auth state to ${JSON.stringify(t)}`),e.state){case`waitingForScheduledRefetch`:case`notRefetching`:case`noAuth`:this.tokenConfirmationAttempts=0;break;case`waitingForServerConfirmationOfFreshToken`:case`waitingForServerConfirmationOfCachedToken`:case`initialRefetch`:break;default:}this.authState.state===`waitingForScheduledRefetch`&&clearTimeout(this.authState.refetchTokenTimeoutId),this.authState=e}decodeToken(e){try{return Ct(e)}catch(e){return this._logVerbose(`Error decoding token: ${e instanceof Error?e.message:`Unknown error`}`),null}}_logVerbose(e){this.logger.logVerbose(`${e} [v${this.configVersion}]`)}};const Dt=[`convexClientConstructed`,`convexWebSocketOpen`,`convexFirstMessageReceived`];function Ot(e,t){let n={sessionId:t};typeof performance>`u`||!performance.mark||performance.mark(e,{detail:n})}function kt(e){let t=e.name.slice(6);return t=t.charAt(0).toLowerCase()+t.slice(1),{name:t,startTime:e.startTime}}function At(e){if(typeof performance>`u`||!performance.getEntriesByName)return[];let t=[];for(let n of Dt){let r=performance.getEntriesByName(n).filter(e=>e.entryType===`mark`).filter(t=>t.detail.sessionId===e);t.push(...r)}return t.map(kt)}var jt=Object.defineProperty,Mt=(e,t,n)=>t in e?jt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Q=(e,t,n)=>Mt(e,typeof t==`symbol`?t:t+``,n),Nt=class{constructor(e,t,n){if(Q(this,`address`),Q(this,`state`),Q(this,`requestManager`),Q(this,`webSocketManager`),Q(this,`authenticationManager`),Q(this,`remoteQuerySet`),Q(this,`optimisticQueryResults`),Q(this,`_transitionHandlerCounter`,0),Q(this,`_nextRequestId`),Q(this,`_onTransitionFns`,new Map),Q(this,`_sessionId`),Q(this,`firstMessageReceived`,!1),Q(this,`debug`),Q(this,`logger`),Q(this,`maxObservedTimestamp`),Q(this,`connectionStateSubscribers`,new Map),Q(this,`nextConnectionStateSubscriberId`,0),Q(this,`_lastPublishedConnectionState`),Q(this,`markConnectionStateDirty`,()=>{Promise.resolve().then(()=>{let e=this.connectionState();if(JSON.stringify(e)!==JSON.stringify(this._lastPublishedConnectionState)){this._lastPublishedConnectionState=e;for(let t of this.connectionStateSubscribers.values())t(e)}})}),Q(this,`mark`,e=>{this.debug&&Ot(e,this.sessionId)}),typeof e==`object`)throw Error(`Passing a ClientConfig object is no longer supported. Pass the URL of the Convex deployment as a string directly.`);n?.skipConvexDeploymentUrlCheck!==!0&&te(e),n={...n};let r=n.authRefreshTokenLeewaySeconds??10,i=n.webSocketConstructor;if(!i&&typeof WebSocket>`u`)throw Error(`No WebSocket global variable defined! To use Convex in an environment without WebSocket try the HTTP client: https://docs.convex.dev/api/classes/browser.ConvexHttpClient`);i||=WebSocket,this.debug=n.reportDebugInfoToConvex??!1,this.address=e,this.logger=n.logger===!1?Ve({verbose:n.verbose??!1}):n.logger!==!0&&n.logger?n.logger:Be({verbose:n.verbose??!1});let a=e.search(`://`);if(a===-1)throw Error(`Provided address was not an absolute URL.`);let o=e.substring(a+3),s=e.substring(0,a),c;if(s===`http`)c=`ws`;else if(s===`https`)c=`wss`;else throw Error(`Unknown parent protocol ${s}`);let l=`${c}://${o}/api/${Se}/sync`;this.state=new qe,this.remoteQuerySet=new lt(e=>this.state.queryPath(e),this.logger),this.requestManager=new Xe(this.logger,this.markConnectionStateDirty);let u=()=>{this.webSocketManager.pause(),this.state.pause()};this.authenticationManager=new Et(this.state,{authenticate:e=>{let t=this.state.setAuth(e);return this.webSocketManager.sendMessage(t),t.baseVersion},stopSocket:()=>this.webSocketManager.stop(),tryRestartSocket:()=>this.webSocketManager.tryRestart(),pauseSocket:u,resumeSocket:()=>this.webSocketManager.resume(),clearAuth:()=>{this.clearAuth()}},{logger:this.logger,refreshTokenLeewaySeconds:r,initialAuthTokenReuse:n.initialAuthTokenReuse??!1}),this.optimisticQueryResults=new et,this.addOnTransitionHandler(e=>{t(e.queries.map(e=>e.token))}),this._nextRequestId=0,this._sessionId=yt();let{unsavedChangesWarning:d}=n;if(typeof window>`u`||window.addEventListener===void 0){if(d===!0)throw Error(`unsavedChangesWarning requested, but window.addEventListener not found! Remove {unsavedChangesWarning: true} from Convex client options.`)}else d!==!1&&window.addEventListener(`beforeunload`,e=>{if(this.requestManager.hasIncompleteRequests()){e.preventDefault();let t=`Are you sure you want to leave? Your changes may not be saved.`;return(e||window.event).returnValue=t,t}});this.webSocketManager=new vt(l,{onOpen:e=>{this.mark(`convexWebSocketOpen`),this.webSocketManager.sendMessage({...e,type:`Connect`,sessionId:this._sessionId,maxObservedTimestamp:this.maxObservedTimestamp}),this.remoteQuerySet=new lt(e=>this.state.queryPath(e),this.logger);let[t,n]=this.state.restart();n&&this.webSocketManager.sendMessage(n),this.webSocketManager.sendMessage(t);for(let e of this.requestManager.restart())this.webSocketManager.sendMessage(e)},onResume:()=>{let[e,t]=this.state.resume();t&&this.webSocketManager.sendMessage(t),e&&this.webSocketManager.sendMessage(e);for(let e of this.requestManager.resume())this.webSocketManager.sendMessage(e)},onMessage:e=>{switch(this.firstMessageReceived||(this.firstMessageReceived=!0,this.mark(`convexFirstMessageReceived`),this.reportMarks()),e.type){case`Transition`:{this.observedTimestamp(e.endVersion.ts),this.authenticationManager.onTransition(e),this.remoteQuerySet.transition(e),this.state.transition(e);let t=this.requestManager.removeCompleted(this.remoteQuerySet.timestamp());this.notifyOnQueryResultChanges(t);break}case`MutationResponse`:{e.success&&this.observedTimestamp(e.ts);let t=this.requestManager.onResponse(e);t!==null&&this.notifyOnQueryResultChanges(new Map([[t.requestId,t.result]]));break}case`ActionResponse`:this.requestManager.onResponse(e);break;case`AuthError`:this.authenticationManager.onAuthError(e);break;case`FatalError`:{let t=He(this.logger,e.error);throw this.webSocketManager.terminate(),t}default:}return{hasSyncedPastLastReconnect:this.hasSyncedPastLastReconnect()}},onServerDisconnectError:n.onServerDisconnectError},i,this.logger,this.markConnectionStateDirty,this.debug),this.mark(`convexClientConstructed`),n.expectAuth&&u()}hasSyncedPastLastReconnect(){return this.requestManager.hasSyncedPastLastReconnect()&&this.state.hasSyncedPastLastReconnect()}observedTimestamp(e){(this.maxObservedTimestamp===void 0||this.maxObservedTimestamp.lessThanOrEqual(e))&&(this.maxObservedTimestamp=e)}getMaxObservedTimestamp(){return this.maxObservedTimestamp}notifyOnQueryResultChanges(e){let t=this.remoteQuerySet.remoteQueryResults(),n=new Map;for(let[e,r]of t){let t=this.state.queryToken(e);if(t!==null){let i={result:r,udfPath:this.state.queryPath(e),args:this.state.queryArgs(e)};n.set(t,i)}}let r=this.optimisticQueryResults.ingestQueryResultsFromServer(n,new Set(e.keys()));this.handleTransition({queries:r.map(e=>({token:e,modification:{kind:`Updated`,result:this.optimisticQueryResults.rawQueryResult(e)}})),reflectedMutations:Array.from(e).map(([e,t])=>({requestId:e,result:t})),timestamp:this.remoteQuerySet.timestamp()})}handleTransition(e){for(let t of this._onTransitionFns.values())t(e)}addOnTransitionHandler(e){let t=this._transitionHandlerCounter++;return this._onTransitionFns.set(t,e),()=>this._onTransitionFns.delete(t)}getCurrentAuthClaims(){let e=this.state.getAuth(),t={};if(e&&e.tokenType===`User`)try{t=e?Ct(e.value):{}}catch{t={}}else return;return{token:e.value,decoded:t}}setAuth(e,t,n){this.authenticationManager.setConfig(e,t,n)}hasAuth(){return this.state.hasAuth()}setAdminAuth(e,t){let n=this.state.setAdminAuth(e,t);this.webSocketManager.sendMessage(n)}clearAuth(){let e=this.state.clearAuth();this.webSocketManager.sendMessage(e)}subscribe(e,t,n){let r=m(t),{modification:i,queryToken:a,unsubscribe:o}=this.state.subscribe(e,r,n?.journal,n?.componentPath);return i!==null&&this.webSocketManager.sendMessage(i),{queryToken:a,unsubscribe:()=>{let e=o();e&&this.webSocketManager.sendMessage(e)}}}localQueryResult(e,t){let n=R(e,m(t));return this.optimisticQueryResults.queryResult(n)}localQueryResultByToken(e){return this.optimisticQueryResults.queryResult(e)}hasLocalQueryResultByToken(e){return this.optimisticQueryResults.hasQueryResult(e)}localQueryLogs(e,t){let n=R(e,m(t));return this.optimisticQueryResults.queryLogs(n)}queryJournal(e,t){let n=R(e,m(t));return this.state.queryJournal(n)}connectionState(){let e=this.webSocketManager.connectionState();return{hasInflightRequests:this.requestManager.hasInflightRequests(),isWebSocketConnected:e.isConnected,hasEverConnected:e.hasEverConnected,connectionCount:e.connectionCount,connectionRetries:e.connectionRetries,timeOfOldestInflightRequest:this.requestManager.timeOfOldestInflightRequest(),inflightMutations:this.requestManager.inflightMutations(),inflightActions:this.requestManager.inflightActions()}}subscribeToConnectionState(e){let t=this.nextConnectionStateSubscriberId++;return this.connectionStateSubscribers.set(t,e),()=>{this.connectionStateSubscribers.delete(t)}}async mutation(e,t,n){let r=await this.mutationInternal(e,t,n);if(!r.success)throw r.errorData===void 0?Error(F(`mutation`,e,r)):I(r,new E(F(`mutation`,e,r)));return r.value}async mutationInternal(e,t,n,r){let{mutationPromise:i}=this.enqueueMutation(e,t,n,r);return i}enqueueMutation(e,t,n,r){let i=m(t);this.tryReportLongDisconnect();let a=this.nextRequestId;if(this._nextRequestId++,n!==void 0){let e=n.optimisticUpdate;if(e!==void 0){let t=this.optimisticQueryResults.applyOptimisticUpdate(t=>{e(t,i)instanceof Promise&&this.logger.warn(`Optimistic update handler returned a Promise. Optimistic updates should be synchronous.`)},a).map(e=>{let t=this.localQueryResultByToken(e);return{token:e,modification:{kind:`Updated`,result:t===void 0?void 0:{success:!0,value:t,logLines:[]}}}});this.handleTransition({queries:t,reflectedMutations:[],timestamp:this.remoteQuerySet.timestamp()})}}let o={type:`Mutation`,requestId:a,udfPath:e,componentPath:r,args:[w(i)]},s=this.webSocketManager.sendMessage(o);return{requestId:a,mutationPromise:this.requestManager.request(o,s)}}async action(e,t){let n=await this.actionInternal(e,t);if(!n.success)throw n.errorData===void 0?Error(F(`action`,e,n)):I(n,new E(F(`action`,e,n)));return n.value}async actionInternal(e,t,n){let r=m(t),i=this.nextRequestId;this._nextRequestId++,this.tryReportLongDisconnect();let a={type:`Action`,requestId:i,udfPath:e,componentPath:n,args:[w(r)]},o=this.webSocketManager.sendMessage(a);return this.requestManager.request(a,o)}async close(){return this.authenticationManager.stop(),this.webSocketManager.terminate()}get url(){return this.address}get nextRequestId(){return this._nextRequestId}get sessionId(){return this._sessionId}reportMarks(){if(this.debug){let e=At(this.sessionId);this.webSocketManager.sendMessage({type:`Event`,eventType:`ClientConnect`,event:e})}}tryReportLongDisconnect(){if(!this.debug)return;let e=this.connectionState().timeOfOldestInflightRequest;if(e===null||Date.now()-e.getTime()<=60*1e3)return;let t=`${this.address}/api/debug_event`;fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,"Convex-Client":`npm-${Se}`},body:JSON.stringify({event:`LongWebsocketDisconnect`})}).then(e=>{e.ok||this.logger.warn(`Analytics request failed with response:`,e.body)}).catch(e=>{this.logger.warn(`Analytics response failed with error:`,e)})}};function Pt(e){if(typeof e!=`object`||!e||!Array.isArray(e.page)||typeof e.isDone!=`boolean`||typeof e.continueCursor!=`string`)throw Error(`Not a valid paginated query result: ${e?.toString()}`);return e}var Ft=Object.defineProperty,It=(e,t,n)=>t in e?Ft(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Lt=(e,t,n)=>It(e,typeof t==`symbol`?t:t+``,n),Rt=class{constructor(e,t){this.client=e,this.onTransition=t,Lt(this,`paginatedQuerySet`,new Map),Lt(this,`lastTransitionTs`),this.lastTransitionTs=U.fromNumber(0),this.client.addOnTransitionHandler(e=>this.onBaseTransition(e))}subscribe(e,t,n){let r=L(e),i=Ue(r,t,n),a=()=>this.removePaginatedQuerySubscriber(i),o=this.paginatedQuerySet.get(i);return o?(o.numSubscribers+=1,{paginatedQueryToken:i,unsubscribe:a}):(this.paginatedQuerySet.set(i,{token:i,canonicalizedUdfPath:r,args:t,numSubscribers:1,options:{initialNumItems:n.initialNumItems},nextPageKey:0,pageKeys:[],pageKeyToQuery:new Map,ongoingSplits:new Map,skip:!1,id:n.id}),this.addPageToPaginatedQuery(i,null,n.initialNumItems),{paginatedQueryToken:i,unsubscribe:a})}localQueryResult(e,t,n){let r=Ue(L(e),t,n);return this.localQueryResultByToken(r)}localQueryResultByToken(e){let t=this.paginatedQuerySet.get(e);if(!t)return;let n=this.activePageQueryTokens(t);if(n.length===0)return{results:[],status:`LoadingFirstPage`,loadMore:t=>this.loadMoreOfPaginatedQuery(e,t)};let r=[],i=!1,a=!1;for(let e of n){let t=this.client.localQueryResultByToken(e);if(t===void 0){i=!0,a=!1;continue}let n=Pt(t);r=r.concat(n.page),a=!!n.isDone}let o;return o=i?r.length===0?`LoadingFirstPage`:`LoadingMore`:a?`Exhausted`:`CanLoadMore`,{results:r,status:o,loadMore:t=>this.loadMoreOfPaginatedQuery(e,t)}}onBaseTransition(e){let t=e.queries.map(e=>e.token),n=this.queriesContainingTokens(t),r=[];n.length>0&&(this.processPaginatedQuerySplits(n,e=>this.client.localQueryResultByToken(e)),r=n.map(e=>({token:e,modification:{kind:`Updated`,result:this.localQueryResultByToken(e)}})));let i={...e,paginatedQueries:r};this.onTransition(i)}loadMoreOfPaginatedQuery(e,t){this.mustGetPaginatedQuery(e);let n=this.queryTokenForLastPageOfPaginatedQuery(e),r=this.client.localQueryResultByToken(n);if(!r)return!1;let i=Pt(r);if(i.isDone)return!1;this.addPageToPaginatedQuery(e,i.continueCursor,t);let a={timestamp:this.lastTransitionTs,reflectedMutations:[],queries:[],paginatedQueries:[{token:e,modification:{kind:`Updated`,result:this.localQueryResultByToken(e)}}]};return this.onTransition(a),!0}queriesContainingTokens(e){if(e.length===0)return[];let t=[],n=new Set(e);for(let[e,r]of this.paginatedQuerySet)for(let i of this.allQueryTokens(r))if(n.has(i)){t.push(e);break}return t}processPaginatedQuerySplits(e,t){for(let n of e){let e=this.mustGetPaginatedQuery(n),{ongoingSplits:r,pageKeyToQuery:i,pageKeys:a}=e;for(let[n,[a,o]]of r)t(i.get(a).queryToken)!==void 0&&t(i.get(o).queryToken)!==void 0&&this.completePaginatedQuerySplit(e,n,a,o);for(let n of a){if(r.has(n))continue;let a=i.get(n);if(!a)throw Error(`No page query for active pageKey ${n}`);let o=t(a.queryToken);if(!o)continue;let s=Pt(o);s.splitCursor&&(s.pageStatus===`SplitRecommended`||s.pageStatus===`SplitRequired`||s.page.length>e.options.initialNumItems*2)&&this.splitPaginatedQueryPage(e,n,a.cursor,s.splitCursor,s.continueCursor)}}}splitPaginatedQueryPage(e,t,n,r,i){let a=e.nextPageKey++,o=e.nextPageKey++,s={numItems:e.options.initialNumItems,id:e.id},c=this.client.subscribe(e.canonicalizedUdfPath,{...e.args,paginationOpts:{...s,cursor:n,endCursor:r}});e.pageKeyToQuery.set(a,{...c,cursor:n});let l=this.client.subscribe(e.canonicalizedUdfPath,{...e.args,paginationOpts:{...s,cursor:r,endCursor:i}});e.pageKeyToQuery.set(o,{...l,cursor:r}),e.ongoingSplits.set(t,[a,o])}addPageToPaginatedQuery(e,t,n){let r=this.mustGetPaginatedQuery(e),i=r.nextPageKey++,a={cursor:t,numItems:n,id:r.id},o={...r.args,paginationOpts:a},s=this.client.subscribe(r.canonicalizedUdfPath,o);return r.pageKeys.push(i),r.pageKeyToQuery.set(i,{...s,cursor:t}),s}removePaginatedQuerySubscriber(e){let t=this.paginatedQuerySet.get(e);if(t&&(--t.numSubscribers,!(t.numSubscribers>0))){for(let e of t.pageKeyToQuery.values())e.unsubscribe();this.paginatedQuerySet.delete(e)}}completePaginatedQuerySplit(e,t,n,r){let i=e.pageKeyToQuery.get(t);e.pageKeyToQuery.delete(t);let a=e.pageKeys.indexOf(t);e.pageKeys.splice(a,1,n,r),e.ongoingSplits.delete(t),i.unsubscribe()}activePageQueryTokens(e){return e.pageKeys.map(t=>e.pageKeyToQuery.get(t).queryToken)}allQueryTokens(e){return Array.from(e.pageKeyToQuery.values()).map(e=>e.queryToken)}queryTokenForLastPageOfPaginatedQuery(e){let t=this.mustGetPaginatedQuery(e),n=t.pageKeys[t.pageKeys.length-1];if(n===void 0)throw Error(`No pages for paginated query ${e}`);return t.pageKeyToQuery.get(n).queryToken}mustGetPaginatedQuery(e){let t=this.paginatedQuerySet.get(e);if(!t)throw Error(`paginated query no longer exists for token `+e);return t}},zt=Object.defineProperty,Bt=(e,t,n)=>t in e?zt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$=(e,t,n)=>Bt(e,typeof t==`symbol`?t:t+``,n),Vt=class{constructor(e,t={}){$(this,`listeners`),$(this,`_client`),$(this,`_paginatedClient`),$(this,`callNewListenersWithCurrentValuesTimer`),$(this,`_closed`),$(this,`_disabled`),t.skipConvexDeploymentUrlCheck!==!0&&te(e);let{disabled:n,...r}=t;this._closed=!1,this._disabled=!!n,typeof window>`u`&&!(`unsavedChangesWarning`in r)&&(r.unsavedChangesWarning=!1),this.disabled||(this._client=new Nt(e,()=>{},r),this._paginatedClient=new Rt(this._client,e=>this._transition(e))),this.listeners=new Set}get closed(){return this._closed}get client(){if(this._client)return this._client;throw Error(`ConvexClient is disabled`)}get paginatedClient(){if(this._paginatedClient)return this._paginatedClient;throw Error(`ConvexClient is disabled`)}get disabled(){return this._disabled}onUpdate(e,t,n,r){if(this.disabled)return this.createDisabledUnsubscribe();let{queryToken:i,unsubscribe:a}=this.client.subscribe(O(e),t),o={queryToken:i,callback:n,onError:r,unsubscribe:a,hasEverRun:!1,query:e,args:t,paginationOptions:void 0};this.listeners.add(o),this.queryResultReady(i)&&this.callNewListenersWithCurrentValuesTimer===void 0&&(this.callNewListenersWithCurrentValuesTimer=setTimeout(()=>this.callNewListenersWithCurrentValues(),0));let s={unsubscribe:()=>{this.closed||(this.listeners.delete(o),a())},getCurrentValue:()=>this.client.localQueryResultByToken(i),getQueryLogs:()=>this.client.localQueryLogs(i)},c=s.unsubscribe;return Object.assign(c,s),c}onPaginatedUpdate_experimental(e,t,n,r,i){if(this.disabled)return this.createDisabledUnsubscribe();let a={initialNumItems:n.initialNumItems,id:-1},{paginatedQueryToken:o,unsubscribe:s}=this.paginatedClient.subscribe(O(e),t,a),c={queryToken:o,callback:r,onError:i,unsubscribe:s,hasEverRun:!1,query:e,args:t,paginationOptions:a};this.listeners.add(c),this.paginatedClient.localQueryResultByToken(o)&&this.callNewListenersWithCurrentValuesTimer===void 0&&(this.callNewListenersWithCurrentValuesTimer=setTimeout(()=>this.callNewListenersWithCurrentValues(),0));let l={unsubscribe:()=>{this.closed||(this.listeners.delete(c),s())},getCurrentValue:()=>this.paginatedClient.localQueryResult(O(e),t,a),getQueryLogs:()=>[]},u=l.unsubscribe;return Object.assign(u,l),u}callNewListenersWithCurrentValues(){this.callNewListenersWithCurrentValuesTimer=void 0,this._transition({queries:[],paginatedQueries:[]},!0)}queryResultReady(e){return this.client.hasLocalQueryResultByToken(e)}createDisabledUnsubscribe(){let e=(()=>{});return Object.assign(e,{unsubscribe:e,getCurrentValue:()=>void 0,getQueryLogs:()=>void 0}),e}async close(){if(!this.disabled)return this.listeners.clear(),this._closed=!0,this._paginatedClient&&=void 0,this.client.close()}getAuth(){if(!this.disabled)return this.client.getCurrentAuthClaims()}setAuth(e,t){this.disabled||this.client.setAuth(e,t??(()=>{}))}setAdminAuth(e,t){if(this.closed)throw Error(`ConvexClient has already been closed.`);this.disabled||this.client.setAdminAuth(e,t)}_transition({queries:e,paginatedQueries:t},n=!1){let r=[...e.map(e=>e.token),...t.map(e=>e.token)];for(let e of this.listeners){let{callback:t,queryToken:i,onError:a,hasEverRun:o}=e,s=We(i),c=s?!!this.paginatedClient.localQueryResultByToken(i):this.client.hasLocalQueryResultByToken(i);if(r.includes(i)||n&&!o&&c){e.hasEverRun=!0;let n;try{n=s?this.paginatedClient.localQueryResultByToken(i):this.client.localQueryResultByToken(i)}catch(e){if(!(e instanceof Error))throw e;a?a(e,`Second argument to onUpdate onError is reserved for later use`):Promise.reject(e);continue}t(n,`Second argument to onUpdate callback is reserved for later use`)}}}async mutation(e,t,n){if(this.disabled)throw Error(`ConvexClient is disabled`);return await this.client.mutation(O(e),t,n)}async action(e,t){if(this.disabled)throw Error(`ConvexClient is disabled`);return await this.client.action(O(e),t)}async query(e,t){if(this.disabled)throw Error(`ConvexClient is disabled`);let n=this.client.localQueryResult(O(e),t);return n===void 0?new Promise((n,r)=>{let{unsubscribe:i}=this.onUpdate(e,t,e=>{i(),n(e)},e=>{i(),r(e)})}):Promise.resolve(n)}connectionState(){if(this.disabled)throw Error(`ConvexClient is disabled`);return this.client.connectionState()}subscribeToConnectionState(e){return this.disabled?()=>{}:this.client.subscribeToConnectionState(e)}};function Ht(e,t){let n=e.trim();if(!/^https:\/\/[^/]+$/.test(n))throw Error(`A valid HTTPS Convex deployment URL is required`);let r=new Vt(n);return r.setAuth(t),r}function Ut(e,t){let n=e.trim();if(!n)throw Error(`Convex deployment URL is required`);return{async resolve(e){let r=await t.fetchAccessToken(Gt(e,!1));if(!r)throw Error(`Convex review authentication is required`);let i=r,a=(t.clientFactory??Ht)(n,async({forceRefreshToken:n})=>{if(!n&&i){let e=i;return i=null,e}return t.fetchAccessToken({...Gt(e,n),signal:new AbortController().signal})}),o=await a.mutation(A.resolveSession,{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,...e.routeKey===void 0?{}:{routeKey:e.routeKey}}),s=qt(o.session,e.invitationId),c=o.pageId,l=e.collaboration?await Kt(t,e,c,e.collaboration.scopeId):void 0,u=0;return Wt({client:a,session:s,request:e,pageId:c,roomId:l,resolvePage:async n=>{if(n.location.origin!==e.location.origin)throw Error(`Convex review session cannot move to another origin`);let r=++u,i=await a.mutation(A.resolveSession,{invitationId:e.invitationId,origin:n.location.origin,pathname:n.location.pathname,...n.routeKey===void 0?{}:{routeKey:n.routeKey}});if(n.signal.aborted||r!==u)throw Jt();let o=n.collaboration?await Kt(t,e,i.pageId,n.collaboration.scopeId,n.signal):void 0;if(n.signal.aborted||r!==u)throw Jt();return{pageId:i.pageId,...o===void 0?{}:{collaborationRoomId:o},commit:()=>{n.signal.aborted||r!==u||(c=i.pageId,l=o)}}}})}}}function Wt(e){let t=new Oe(e.client,e.session,{origin:e.request.location.origin}),n=e.request.collaboration?.cursors===!0||e.request.collaboration?.chat===!0;return{pageId:e.pageId,session:e.session,repository:t,...n?{collaborationRepository:new Ne(e.client,e.session,{origin:e.request.location.origin})}:{},...e.roomId===void 0?{}:{collaborationRoomId:e.roomId},resolvePage:e.resolvePage,allowedStagingHosts:[e.request.location.hostname]}}function Gt(e,t){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,...e.emailToken===void 0?{}:{emailToken:e.emailToken},forceRefreshToken:t,signal:e.signal}}async function Kt(e,t,n,r,i=t.signal){return e.resolveCollaborationRoom?e.resolveCollaborationRoom({invitationId:t.invitationId,pageId:n,scopeId:r,origin:t.location.origin,signal:i}):`${n}:${r}`.slice(0,512)}function qt(e,t){if(!e||e.invitationId!==t||!e.authUserId||!e.reviewerId||!e.projectId)throw Error(`Convex returned an invalid reviewer session`);return structuredClone(e)}function Jt(){return Object.assign(Error(`Review page resolution was superseded`),{code:`PAGE_SWAP_SUPERSEDED`})}export{Ut as createConvexReviewRuntime};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./install-Crgjt0uw.js";import{i as t,r as n,t as r}from"./reviewer-auth-presentation-CAm-YbaR.js";function i(e){let t=[`01works-reviewer-device-proof-v1`,e.purpose,e.deviceSessionId,e.challengeId,e.challenge,String(e.counter),String(e.expiresAt),e.invitationId,e.origin,e.pathname];return new TextEncoder().encode(t.map(e=>`${e.length}:${e}`).join(``))}const a=`reviewer-device-credentials-v1`;function o(){try{return globalThis.indexedDB?new l(globalThis.indexedDB):null}catch{return null}}async function s(e=globalThis.crypto){if(!e?.subtle||typeof e.randomUUID!=`function`)throw Error(`Visual Review device authentication requires Web Crypto`);let t=await e.subtle.generateKey({name:`ECDSA`,namedCurve:`P-256`},!1,[`sign`,`verify`]);if(!(t instanceof Object)||!(`privateKey`in t)||!(`publicKey`in t)||t.privateKey.extractable)throw Error(`Visual Review could not create a non-extractable device key`);let n=await e.subtle.exportKey(`jwk`,t.publicKey);if(n.kty!==`EC`||n.crv!==`P-256`||typeof n.x!=`string`||typeof n.y!=`string`)throw Error(`Visual Review received an invalid device public key`);return{deviceSessionId:e.randomUUID(),privateKey:t.privateKey,publicKey:{kty:`EC`,crv:`P-256`,x:n.x,y:n.y}}}async function c(e,t,n=globalThis.crypto){if(e.extractable||e.type!==`private`||e.algorithm.name!==`ECDSA`||!e.usages.includes(`sign`))throw Error(`Visual Review device key is invalid`);let r=await n.subtle.sign({name:`ECDSA`,hash:`SHA-256`},e,i(t));return p(new Uint8Array(r))}var l=class{factory;constructor(e){this.factory=e}async get(e){let t=await this.open();try{return u(await d(t.transaction(a,`readonly`).objectStore(a).get(e)))}finally{t.close()}}async set(e,t){let n=await this.open();try{await f(n.transaction(a,`readwrite`),n=>{n.put(t,e)})}finally{n.close()}}async delete(e){let t=await this.open();try{await f(t.transaction(a,`readwrite`),t=>{t.delete(e)})}finally{t.close()}}open(){return new Promise((e,t)=>{let n=this.factory.open(`01works-visual-review`,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(a)||n.result.createObjectStore(a)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error??Error(`IndexedDB open failed`)),n.onblocked=()=>t(Error(`IndexedDB upgrade blocked`))})}};function u(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return typeof t.deviceSessionId!=`string`||!Number.isSafeInteger(t.expiresAt)||(t.expiresAt??0)<=Date.now()||t.invitationId!==void 0&&typeof t.invitationId!=`string`||!t.privateKey||t.privateKey.type!==`private`||t.privateKey.extractable||t.privateKey.algorithm.name!==`ECDSA`||!t.privateKey.usages.includes(`sign`)?null:t}function d(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error??Error(`IndexedDB request failed`))})}function f(e,t){return new Promise((n,r)=>{e.oncomplete=()=>n(),e.onerror=()=>r(e.error??Error(`IndexedDB transaction failed`)),e.onabort=()=>r(e.error??Error(`IndexedDB transaction aborted`)),t(e.objectStore(a))})}function p(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll(`+`,`-`).replaceAll(`/`,`_`).replace(/=+$/u,``)}var m=class extends Error{code;status;constructor(e,t,n){super(t),this.code=e,this.status=n,this.name=`HostedBootstrapError`}};function h(e={}){return g(e)}function g(t={},n={}){let r=e(t.serviceUrl??`https://review.01.works`),i=t.fetch??globalThis.fetch,a=n.now??Date.now,s=new Map,c=n.reviewerDeviceStore===void 0?o():n.reviewerDeviceStore,l=n.crypto??globalThis.crypto,u=n.reviewerSessionStorage===void 0?V(H(),U()):V(n.reviewerSessionStorage);if(typeof i!=`function`)throw Error(`Visual Review bootstrap requires the Fetch API`);return{async resolve(e){let t=M(e),o=await F(r,i,t,e.signal),d=a(),f={serviceUrl:r,...n.instantAuthDatabaseFactory===void 0?{}:{databaseFactory:n.instantAuthDatabaseFactory},redeemEmailInvitation:async e=>(await w(r,i,e)).refreshToken,acceptInvitation:async e=>{let t=await i(`${r}/v1/invitations/accept`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${e.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:e.invitationId,...e.displayName===void 0?{}:{displayName:e.displayName}}),cache:`no-store`,credentials:`omit`,signal:e.signal}),n=await Y(t);if(!t.ok)throw new m(X(n,`error`)??`INVITATION_ACCEPT_FAILED`,X(n,`message`)??`리뷰 초대 수락에 실패했습니다.`,t.status)},resolveReviewPage:e=>P(r,i,e),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{resolveCollaborationRoom:e=>N(r,i,e)}:{}},p=o.apiVersion===2?await _({config:o,convexRuntimeFactory:n.convexRuntimeFactory??(await import(`./convex-runtime-8kViWXIL.js`)).createConvexReviewRuntime,fetcher:i,memorySessions:s,reviewerDeviceStore:c,cryptoProvider:l,request:e,legacySessionStorages:u,serviceUrl:r}):{...await(n.instantRuntimeFactory??(await import(`./instant-runtime-CTh_DTHR.js`)).createInstantReviewRuntime)(o.instantAppId,f).resolve(e),sessionScope:`browser`,sessionExpiresAt:o.invitationExpiresAt},h=p.resolvePage;if(!h)return p;let g=async t=>{await F(r,i,{invitationId:e.invitationId,origin:t.location.origin,pathname:t.location.pathname},t.signal),d=a()};return{...p,resolvePage:async e=>(a()-d>=3e5&&await g(e),h(e))}}}}async function _(e){let t=e.config.accessScope?.kind===`project`?e.config.accessScope:null,n=B(e.serviceUrl,e.request.location.origin,t?.locator??e.config.sessionLocator??e.request.invitationId),i=B(e.serviceUrl,e.request.location.origin,e.request.invitationId);q(e.legacySessionStorages,n),i!==n&&q(e.legacySessionStorages,i);let a;if(t)a=await W(e.reviewerDeviceStore,e.memorySessions,n),a&&!a.invitationId&&(await K(e.reviewerDeviceStore,e.memorySessions,n),a=null),a||=await v(e,t.locator,await s(e.cryptoProvider));else if(e.request.emailToken){await r(e.request.authHost,e.request.signal,e.request.styleNonce);let t=await s(e.cryptoProvider);try{a=await C(e.serviceUrl,e.fetcher,{invitationId:e.request.invitationId,emailToken:e.request.emailToken,origin:e.request.location.origin,pathname:e.request.location.pathname,signal:e.request.signal,device:t})}catch(n){if(!(n instanceof m)||n.code!==`INVITATION_TOKEN_USED`)throw n;a=await y(e,t)}}else a=await W(e.reviewerDeviceStore,e.memorySessions,n),!a&&i!==n&&(a=await W(e.reviewerDeviceStore,e.memorySessions,i),a&&await K(e.reviewerDeviceStore,e.memorySessions,i));a||=await y(e,await s(e.cryptoProvider));let o=t?a.invitationId:e.request.invitationId;if(!o)throw new m(`INVALID_PROJECT_ACCESS_RESPONSE`,`프로젝트 리뷰 인증 응답이 올바르지 않습니다.`,502);a={...a,invitationId:o},await G(e.reviewerDeviceStore,e.memorySessions,n,a);let{expiresAt:c}=a,l={...e.request,invitationId:o,emailToken:void 0};return{...await e.convexRuntimeFactory(e.config.convexUrl,{fetchAccessToken:t=>b(e.serviceUrl,e.fetcher,a,t,e.cryptoProvider,()=>K(e.reviewerDeviceStore,e.memorySessions,n))}).resolve(l),sessionScope:`browser`,sessionExpiresAt:c??e.config.invitationExpiresAt,clearLocalSession:()=>{K(e.reviewerDeviceStore,e.memorySessions,n);let t=new AbortController,r=setTimeout(()=>t.abort(),5e3);S(e.serviceUrl,e.fetcher,a,{invitationId:o,origin:e.request.location.origin,pathname:e.request.location.pathname,forceRefreshToken:!1,signal:t.signal},e.cryptoProvider).catch(()=>void 0).finally(()=>clearTimeout(r))}}}async function v(e,t,r){let i={reviewLocator:t,pathname:e.request.location.pathname,signal:e.request.signal};return n(e.request.authHost,e.request.signal,{requestCode:t=>E(e.serviceUrl,e.fetcher,{...i,email:t}),verifyCode:(t,n,a,o)=>D(e.serviceUrl,e.fetcher,{...i,challengeId:t,attemptId:n,email:a,code:o,device:r})},e.request.styleNonce)}async function y(e,n){let r={invitationId:e.request.invitationId,pathname:e.request.location.pathname,signal:e.request.signal};return t(e.request.authHost,e.request.signal,{requestCode:()=>T(e.serviceUrl,e.fetcher,r),verifyCode:(t,i)=>O(e.serviceUrl,e.fetcher,{...r,challengeId:t,code:i,device:n})},e.request.styleNonce)}async function b(e,t,n,r,i,a){let o;try{o=await x(e,t,n.deviceSessionId,r)}catch(e){throw e instanceof m&&[401,403,409,410].includes(e.status)&&await a(),e}let s=await c(n.privateKey,{purpose:`token`,deviceSessionId:n.deviceSessionId,...o,invitationId:r.invitationId,origin:r.origin,pathname:r.pathname},i),l=await t(`${e}/v1/convex/token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({invitationId:r.invitationId,origin:r.origin,pathname:r.pathname,deviceSessionId:n.deviceSessionId,proof:{deviceSessionId:n.deviceSessionId,...o,signature:s}}),cache:`no-store`,credentials:`omit`,signal:r.signal}),u=await Y(l),d=X(u,`token`);if(!l.ok||!d||d.length>16e3)throw[401,403,409,410].includes(l.status)&&await a(),new m(X(u,`error`)??`CONVEX_AUTH_FAILED`,X(u,`message`)??`리뷰 인증을 갱신하지 못했습니다.`,l.status);return d}async function x(e,t,n,r,i=`token`){let a=await t(`${e}/v1/convex/token/challenge`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({deviceSessionId:n,invitationId:r.invitationId,origin:r.origin,pathname:r.pathname,purpose:i}),cache:`no-store`,credentials:`omit`,signal:r.signal}),o=await Y(a),s=X(o,`challengeId`),c=X(o,`challenge`),l=Z(o,`counter`),u=z(Z(o,`expiresAt`));if(!a.ok||!s||!c||!Number.isSafeInteger(l)||l<1||u==null)throw new m(X(o,`error`)??`DEVICE_CHALLENGE_FAILED`,X(o,`message`)??`리뷰 기기 인증을 시작하지 못했습니다.`,a.status);return{challengeId:s,challenge:c,counter:l,expiresAt:u}}async function S(e,t,n,r,i){let a=await x(e,t,n.deviceSessionId,r,`revoke`),o=await c(n.privateKey,{purpose:`revoke`,deviceSessionId:n.deviceSessionId,...a,invitationId:r.invitationId,origin:r.origin,pathname:r.pathname},i);if(!(await t(`${e}/v1/convex/session/revoke`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({deviceSessionId:n.deviceSessionId,invitationId:r.invitationId,origin:r.origin,pathname:r.pathname,proof:{deviceSessionId:n.deviceSessionId,...a,signature:o}}),cache:`no-store`,credentials:`omit`,keepalive:!0,signal:r.signal})).ok)throw Error(`Reviewer device revocation failed`)}async function C(e,t,n){let r=await t(`${e}/v1/invitations/redeem-email`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,emailToken:n.emailToken,pathname:n.pathname,deviceSessionId:n.device.deviceSessionId,devicePublicKey:n.device.publicKey}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Y(r);if(!r.ok)throw new m(X(i,`error`)??`INVITATION_REDEEM_FAILED`,X(i,`message`)??`리뷰 초대를 시작하지 못했습니다.`,r.status);let a=X(i,`deviceSessionId`);if(!a||a!==n.device.deviceSessionId)throw new m(`INVALID_INVITATION_REDEEM_RESPONSE`,`잘못된 초대 인증 응답입니다.`,502);let o=z(Z(i,`expiresAt`));if(o===null)throw new m(`INVALID_INVITATION_REDEEM_RESPONSE`,`잘못된 초대 인증 응답입니다.`,502);if(o===void 0)throw new m(`INVALID_INVITATION_REDEEM_RESPONSE`,`device session 만료 시각이 필요합니다.`,502);return{deviceSessionId:a,privateKey:n.device.privateKey,expiresAt:o}}async function w(e,t,n){let r=await t(`${e}/v1/invitations/redeem-email`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,emailToken:n.emailToken,pathname:n.pathname}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Y(r),a=X(i,`refreshToken`);if(!r.ok||!a||a.length>4096)throw new m(X(i,`error`)??`INVITATION_REDEEM_FAILED`,X(i,`message`)??`리뷰 초대를 시작하지 못했습니다.`,r.status);return{refreshToken:a}}async function T(e,t,n){let r=await k(e,t,`start`,n),i=X(r,`challengeId`),a=X(r,`emailHint`);if(!i||!a)throw new m(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);return{challengeId:i,emailHint:a}}async function E(e,t,n){let r=await A(e,t,`start`,n),i=X(r,`challengeId`),a=X(r,`attemptId`),o=X(r,`emailHint`);if(!i||!a||!o)throw new m(`INVALID_PROJECT_ACCESS_RESPONSE`,`프로젝트 리뷰 인증 응답이 올바르지 않습니다.`,502);return{challengeId:i,attemptId:a,emailHint:o}}async function D(e,t,n){let r=await A(e,t,`verify`,n),i=X(r,`deviceSessionId`),a=X(r,`invitationId`),o=z(Z(r,`expiresAt`));if(i!==n.device.deviceSessionId||!a||o==null)throw new m(`INVALID_PROJECT_ACCESS_RESPONSE`,`프로젝트 리뷰 인증 응답이 올바르지 않습니다.`,502);return{deviceSessionId:i,privateKey:n.device.privateKey,invitationId:a,expiresAt:o}}async function O(e,t,n){let r=await k(e,t,`verify`,n),i=X(r,`deviceSessionId`);if(!i||i!==n.device.deviceSessionId)throw new m(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);let a=z(Z(r,`expiresAt`));if(a===null)throw new m(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);if(a===void 0)throw new m(`INVALID_RECOVERY_RESPONSE`,`device session 만료 시각이 필요합니다.`,502);return{deviceSessionId:i,privateKey:n.device.privateKey,expiresAt:a}}async function k(e,t,n,r){let{signal:i,...a}=r,o=a;if(`device`in a&&j(a.device)){let{device:e,...t}=a;o={...t,deviceSessionId:e.deviceSessionId,devicePublicKey:e.publicKey}}let s=await t(`${e}/v1/invitations/recovery/${n}`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify(o),cache:`no-store`,credentials:`omit`,signal:i}),c=await Y(s);if(!s.ok)throw new m(X(c,`error`)??`RECOVERY_FAILED`,X(c,`message`)??`리뷰 접속을 복구하지 못했습니다.`,s.status);if(!c||typeof c!=`object`||Array.isArray(c))throw new m(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);return c}async function A(e,t,n,r){let{signal:i,...a}=r,o=a;if(`device`in a&&j(a.device)){let{device:e,...t}=a;o={...t,deviceSessionId:e.deviceSessionId,devicePublicKey:e.publicKey}}let s=await t(`${e}/v1/reviewer/access/${n}`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify(o),cache:`no-store`,credentials:`omit`,signal:i}),c=await Y(s);if(!s.ok)throw new m(X(c,`error`)??`PROJECT_ACCESS_FAILED`,X(c,`message`)??`프로젝트 리뷰에 로그인하지 못했습니다.`,s.status);if(!c||typeof c!=`object`||Array.isArray(c))throw new m(`INVALID_PROJECT_ACCESS_RESPONSE`,`프로젝트 리뷰 인증 응답이 올바르지 않습니다.`,502);return c}function j(e){return!!(e&&typeof e==`object`&&`deviceSessionId`in e&&`privateKey`in e&&`publicKey`in e)}function M(e){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}}async function N(e,t,n){let r=await t(`${e}/v1/collaboration/room`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,pageId:n.pageId,scopeId:n.scopeId}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Y(r);if(!r.ok)throw new m(X(i,`error`)??`COLLABORATION_ROOM_FAILED`,X(i,`message`)??`실시간 협업 연결에 실패했습니다.`,r.status);if(!i||typeof i!=`object`||Array.isArray(i))throw new m(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);let a=i,o=X(a,`id`);if(!o||!/^vr_[A-Za-z0-9_-]{43}$/u.test(o)||!Number.isSafeInteger(a.expiresAt))throw new m(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);return{id:o,expiresAt:a.expiresAt}}async function P(e,t,n){let r=await t(`${e}/v1/pages/resolve`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,origin:n.origin,pathname:n.pathname}),cache:`no-store`,credentials:`omit`,signal:n.signal});if(r.ok)return;let i=await Y(r);throw new m(X(i,`error`)??`PAGE_RESOLVE_FAILED`,X(i,`message`)??`리뷰 페이지를 준비하지 못했습니다.`,r.status)}async function F(e,t,n,r){let i=await t(`${e}/v1/bootstrap`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify(n),cache:`no-store`,credentials:`omit`,signal:r}),a=await Y(i);if(!i.ok)throw new m(X(a,`error`)??`BOOTSTRAP_FAILED`,X(a,`message`)??`Visual Review bootstrap에 실패했습니다.`,i.status);return I(a)}function I(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let t=e;if(typeof t.apiVersion==`number`&&t.apiVersion!==1&&t.apiVersion!==2)throw new m(`UNSUPPORTED_SERVICE_VERSION`,`이 Visual Review 위젯 버전은 더 이상 지원되지 않습니다. 사이트의 @01.works/visual-review를 업데이트해 주세요.`,502);if(t.apiVersion===2){let e=J(t.convexUrl),n=z(t.invitationExpiresAt),r=L(t.accessScope),i=R(t.sessionLocator);if(t.provider!==`convex`||!e||n===null)throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:2,provider:`convex`,convexUrl:e,...n===void 0?{}:{invitationExpiresAt:n},...r===void 0?{}:{accessScope:r},...i===void 0?{}:{sessionLocator:i}}}let n=X(t,`instantAppId`),r=z(t.invitationExpiresAt),i=L(t.accessScope),a=R(t.sessionLocator);if(t.apiVersion!==1||!n||!Q(n)||r===null)throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:1,instantAppId:n,...r===void 0?{}:{invitationExpiresAt:r},...i===void 0?{}:{accessScope:i},...a===void 0?{}:{sessionLocator:a}}}function L(e){if(e===void 0)return;if(!e||typeof e!=`object`||Array.isArray(e))throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let t=e,n=X(t,`locator`);if(t.kind!==`project`||!n||n.length>200)throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{kind:`project`,locator:n}}function R(e){if(e!==void 0){if(typeof e!=`string`||!e.trim()||e.length>200)throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return e.trim()}}function z(e){if(e!==void 0)return Number.isSafeInteger(e)&&e>0?e:null}function B(e,t,n){return`01works.visual-review.convex-session.v1:${JSON.stringify([e,t,n])}`}function V(...e){return e.filter(e=>e!==null)}function H(){try{return globalThis.localStorage??null}catch{return null}}function U(){try{return globalThis.sessionStorage??null}catch{return null}}async function W(e,t,n){try{let t=await e?.get(n);if(t)return t}catch{}let r=t.get(n)??null;return r&&r.expiresAt<=Date.now()?(t.delete(n),null):r}async function G(e,t,n,r){t.set(n,r);try{await e?.set(n,r)}catch{}}async function K(e,t,n){t.delete(n);try{await e?.delete(n)}catch{}}function q(e,t){for(let n of e)try{n.removeItem(t)}catch{}}function J(e){if(typeof e!=`string`||!e.trim())return null;try{let t=new URL(e.trim());return t.origin!==e.trim()||t.protocol!==`https:`||!t.hostname.endsWith(`.convex.cloud`)?null:t.origin}catch{return null}}async function Y(e){try{return await e.json()}catch{throw new m(`INVALID_BOOTSTRAP_RESPONSE`,`JSON bootstrap 응답이 필요합니다.`,502)}}function X(e,t){let n=Z(e,t);return typeof n==`string`&&n.trim()?n.trim():null}function Z(e,t){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e[t]}function Q(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}export{h as createHostedReviewRuntime};
|
package/dist/install-Crgjt0uw.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`https://review.01.works`;function t(e){let t=new URL(e),n=t.hostname===`localhost`||t.hostname===`127.0.0.1`||t.hostname.endsWith(`.test`)||t.hostname.endsWith(`.local`);if(t.protocol!==`https:`&&!(n&&t.protocol===`http:`))throw Error(`Visual Review serviceUrl must use HTTPS outside local development`);if(t.username||t.password||t.search||t.hash)throw Error(`Visual Review serviceUrl must be a plain origin or base path`);return t.toString().replace(/\/+$/,``)}const n=()=>{let e=Promise.resolve(null);return{ready:e,refresh:()=>e,dispose(){}}},r=new Map,i=6e4,a=1e4,o=new WeakMap;function s(e={}){if(e.enabled===!1||typeof window>`u`||typeof document>`u`)return n();let r=!1,i=0,a=null,o=null,s=null,_=null,v=!1,y=!1,b=null,x=null,E=null,k=t(e.serviceUrl??`https://review.01.works`),j=e.activationParam??`visual-review`,M=ue(window),N=de(window),F=w(window.location);if(!(ie(k,j,F,N,M,e.runtime!==void 0)??T(D(k,F.origin)))){let t={reason:`missing-activation`,origin:F.origin};return P(e.build).mode===`development`&&c(document,t.origin),l(e.onInactive,t),n()}let I=new WeakMap,L=new Map,R=pe(e.styleNonce,document),z=S(window.location,j,e.pageIdentity),B=te(window,t=>{let n=S(t,j,e.pageIdentity);if(n===z)return;let r=A(j,t.href);r&&(y=!1,L.set(t.origin,r)),z=n,V(t)}),ce=t=>{if(!(r||!_)){if(t===`membership-revoked`){let e=w(window.location),t=L.get(e.origin);t&&(O(k,e.origin,t),L.delete(e.origin),q(k,e.origin,N,M,t));return}z=S(window.location,j,e.pageIdentity),W()}};return{ready:W(),refresh(){return r?Promise.resolve(null):(z=S(window.location,j,e.pageIdentity),V(w(window.location),!0))},dispose(){r||(r=!0,i+=1,U(),_?.remove(),_=null,E=null,x?.remove(),x=null,L.clear(),b?.dispose(),b=null,B.unsubscribe())}};function V(e,t=!1){return!_||!E||E.origin!==e.origin||A(j,e.href)?W():H(_,E,e,t)}function H(t,n,r,c){let l=++i;a!==o&&a?.abort();let d=new AbortController;a=d;let f=u(e.build,r);t.beginPageTransition();let p=(async()=>{try{let i=await oe(n.resolvePage({location:r,...e.pageIdentity===`url`?{routeKey:C(r)}:{},signal:d.signal,collaboration:{cursors:e.collaboration?.cursors===!0,chat:e.collaboration?.chat===!0,scopeId:f}}),d.signal);return Q(l,d)?(i.commit?.(),t.setPage({pageId:i.pageId,collaboration:{roomId:i.collaborationRoomId,scopeId:f}},{reload:c}),t.isConnected||document.body?.append(t),t):$(l)}catch{return Q(l,d)?W():$(l)}})();return s=p,p}function U(){a?.abort(),o?.abort(),a=null,o=null}function W(){if(y&&!A(j,w(window.location).href))return Promise.resolve(null);let t=++i;U(),b?.suspendSession(),_?.remove(),_=null,E=null,x?.remove();let n=new AbortController,r=document.createElement(`div`);r.dataset.agencyReviewRoot=``,a=n,o=n,x=r;let c=G(t,n,r);return s=c,c.then(r=>{r&&Q(t,n)&&_===r&&e.onReady?.(r)}),c}async function G(t,n,i){try{let e=document.body??await se(document,n.signal);if(!Q(t,n))return $(t);e.append(i);let r=await J(t,n,i);return Q(t,n)?r:(i.remove(),$(t))}catch(a){if(!Q(t,n))return i.remove(),$(t);if(m(a,`AUTH_CANCELLED`))return i.remove(),x===i&&(x=null),null;let o=I.get(i),s=o?.[3];if(X(a,i),h(s)&&m(a,`INVITATION_EMAIL_REQUIRED`)&&!v){let e=o?.[1]??w(window.location).origin,t=o?.[2];return t&&(L.delete(e),q(k,e,N,M,t)),i.remove(),x===i&&(x=null),null}let c=fe(a,o?.[2]),u=o?.[1]??w(window.location).origin,d=m(a,`ORIGIN_NOT_ALLOWED`);if(d&&l(e.onInactive,{reason:`origin-not-allowed`,origin:u}),!h(s)||v||!g(a)){let{originNotAllowedMessage:o,renderBootstrapError:s}=await import(`./bootstrap-error-B30Je5Pg.js`);if(!Q(t,n))return i.remove(),$(t);let l=ee(a)?void 0:()=>{r||x!==i||(z=S(window.location,j,e.pageIdentity),W())};s(i,d?o(u):c.message,R,l)}else i.remove(),x===i&&(x=null);return e.onError?.(c),window.dispatchEvent(new CustomEvent(`visual-review:error`,{detail:c})),null}}async function J(t,n,r){let i=w(window.location),a=ie(k,j,i,N,M,e.runtime!==void 0),o=ne(L.get(i.origin)),s=T(D(k,i.origin)),c=a?.source===`url`?a:s??o??a;if(!c)return I.delete(r),r.remove(),x===r&&(x=null),null;let l=c.invitationId;I.set(r,[k,i.origin,l,c.source,c.emailToken]),c.source===`url`?(q(k,i.origin,N,M),L.set(i.origin,l),re(k,i.origin,l,c.emailToken),B.suppress(()=>ae(j))):c.source===`handoff`&&L.set(i.origin,l),z=S(window.location,j,e.pageIdentity);let m=w(window.location),h=await oe((e.runtime??await d(k)).resolve({invitationId:l,emailToken:c.emailToken,location:m,...e.pageIdentity===`url`?{routeKey:C(m)}:{},signal:n.signal,authHost:r,styleNonce:R,collaboration:{cursors:e.collaboration?.cursors===!0,chat:e.collaboration?.chat===!0,scopeId:u(e.build,m)}}),n.signal);if(!Q(t,n))return null;O(k,i.origin,l),le(k,l,i,N,M,h.sessionScope??`browser`,h.sessionExpiresAt),c.source===`url`&&K(M,Z(k,i.origin)),L.set(i.origin,l);let g=e.sourceContextResolver??await p(e.build,n.signal);if(!Q(t,n))return null;let{createActiveReviewSessionLifecycle:ee,createReviewNavigationHandler:te,mountReviewWidget:y}=await f(n.signal);if(!Q(t,n))return null;b??=ee({window,document,storage:M,onExit:Y,onReauthenticationRequired:ce});let A=b.bindSession(l,Z(k,i.origin),h.clearLocalSession);return Q(t,n)?(_=y({...h,collaboration:{cursors:e.collaboration?.cursors===!0&&!!(h.collaborationRepository&&h.collaborationRoomId),chat:e.collaboration?.chat===!0&&!!h.collaborationRepository,repository:h.collaborationRepository,roomId:h.collaborationRoomId,scopeId:u(e.build,i)},developerTools:e.developerTools?.codeContextCopy===!0||e.developerTools?.reactGrab===!0?{codeContextCopy:!0}:void 0,offset:e.offset,onExitReview:A,onNavigateToFeedback:te(window,e.navigateToFeedback),sourceContextResolver:g,styleNonce:R,position:e.position}),b.attachWidget(_),E=h.resolvePage?{origin:i.origin,resolvePage:e=>h.resolvePage(e)}:null,r.remove(),x===r&&(x=null),v=!0,window.dispatchEvent(new CustomEvent(`visual-review:ready`,{detail:_})),_):null}function Y(e){let t=w(window.location).origin;y=!0,O(k,t,e),L.delete(t),q(k,t,N,M,e),i+=1,U(),_?.remove(),_=null,E=null,x?.remove(),x=null}function X(e,t){if(!g(e))return;let n=I.get(t);if(!n)return;let[r,i,a]=n;O(r,i,a),L.get(i)===a&&L.delete(i),q(r,i,N,M,a)}function Q(e,t){return!r&&i===e&&a===t&&!t.signal.aborted}function $(e){return!r&&i!==e?s:null}}function c(e,t){let n=o.get(e);n||(n=new Set,o.set(e,n)),!n.has(t)&&(n.add(t),console.info([`[VisualReview] Inactive: no invitation or resume marker was found.`,`Open this page using a Visual Review invitation URL.`,`Current origin: ${t}`].join(`
|
|
2
|
-
`)))}function l(e,t){if(e)try{e(t)}catch(e){console.error(`[VisualReview] onInactive callback failed.`,e)}}function u(e,t){return JSON.stringify([P(e).buildId,t.pathname,t.search])}async function d(e){let{createHostedReviewRuntime:t}=await import(`./hosted-runtime-CP0aew_W.js`);return t({serviceUrl:e})}async function f(e){return N(import(`./active-review-mount-BW2oQDQ2.js`),e,a,`리뷰 위젯을 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`)}async function p(e,t){let n=P(e),{createEmbeddedSourceContextResolver:r}=await N(import(`./embedded-source-context-BTB3pFqv.js`),t,a,`리뷰 소스 정보를 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`);return r({build:n})}function m(e,t){return e instanceof Error&&`code`in e&&e.code===t}function h(e){return e===`tab-storage`||e===`browser-storage`||e===`legacy-storage`}function g(e){let t=_(e);return typeof t==`string`&&/^INVITATION_(?:EXPIRED|NOT_FOUND|REVOKED)$/.test(t)}function ee(e){return g(e)||_(e)===`UNSUPPORTED_SERVICE_VERSION`}function _(e){return e instanceof Error&&`code`in e?e.code:void 0}const v=new WeakMap;function te(e,t){let n=v.get(e);if(!n){let t=e.history,r=t.pushState,i=t.replaceState,a=new Set;n={history:t,originalPushStateDescriptor:Object.getOwnPropertyDescriptor(t,`pushState`),originalReplaceStateDescriptor:Object.getOwnPropertyDescriptor(t,`replaceState`),patchedPushState:function(t,n,i){r.call(this,t,n,i),y(e)},patchedReplaceState:function(t,n,r){i.call(this,t,n,r),y(e)},popstateListener:()=>y(e),subscribers:a,suppressionDepth:0},v.set(e,n),b(t,`pushState`,n.patchedPushState),b(t,`replaceState`,n.patchedReplaceState),e.addEventListener(`popstate`,n.popstateListener)}n.subscribers.add(t);let r=!0;return{suppress(e){n.suppressionDepth+=1;try{return e()}finally{--n.suppressionDepth}},unsubscribe(){r&&(r=!1,n.subscribers.delete(t),!(n.subscribers.size>0)&&(e.removeEventListener(`popstate`,n.popstateListener),x(n.history,`pushState`,n.patchedPushState,n.originalPushStateDescriptor),x(n.history,`replaceState`,n.patchedReplaceState,n.originalReplaceStateDescriptor),v.delete(e)))}}}function y(e){let t=v.get(e);if(!t||t.suppressionDepth>0)return;let n=w(e.location);[...t.subscribers].forEach(e=>e(n))}function b(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:!0,value:n})}function x(e,t,n,r){if(Object.getOwnPropertyDescriptor(e,t)?.value===n){if(r){Object.defineProperty(e,t,r);return}delete e[t]}}function S(e,t,n){return`${e.origin}\n${n===`url`?C(e):e.pathname}\n${A(t,e.href)??``}`}function C(e){let t=new URL(e.href);return`${t.pathname}${t.search}${t.hash}`}function w(e){return new URL(e.href)}function ne(e){return e?{invitationId:e,source:`memory`}:null}function T(e){return e?{invitationId:e.invitationId,emailToken:e.emailToken,source:`handoff`}:null}function E(e,t){return JSON.stringify([e,t])}function D(e,t,n=Date.now()){let i=E(e,t),a=r.get(i);if(a){if(a.expiresAt>n)return a;clearTimeout(a.timeout),r.delete(i)}}function re(e,t,n,a,o=Date.now()){k(o);let s=E(e,t),c=r.get(s);for(c&&(clearTimeout(c.timeout),r.delete(s));r.size>=32;){let e=r.keys().next().value;if(!e)break;let t=r.get(e);t&&clearTimeout(t.timeout),r.delete(e)}let l=o+i,u=setTimeout(()=>{r.get(s)?.expiresAt===l&&r.delete(s)},i);r.set(s,{invitationId:n,emailToken:a,expiresAt:l,timeout:u})}function O(e,t,n){let i=E(e,t),a=r.get(i);a?.invitationId===n&&(clearTimeout(a.timeout),r.delete(i))}function k(e){for(let[t,n]of r)n.expiresAt>e||(clearTimeout(n.timeout),r.delete(t))}function ie(e,t,n,r,i,a){let o=A(t,n.href);if(o)return{invitationId:o,emailToken:j(n.href)??void 0,source:`url`};let s=W(i,Z(e,n.origin)),c=W(r,Y(e,n.origin));if(c&&c!==s)return{invitationId:c,source:`tab-storage`};let l=U(i,X(e,n.origin));if(l&&l.invitationId!==s)return{invitationId:l.invitationId,source:`browser-storage`};let u=W(i,J(e,n.origin));return u&&u!==s?{invitationId:u,source:`legacy-storage`}:a&&Q(n.hostname)?{invitationId:`local-preview`,source:`local-preview`}:null}function A(e,t){let n=new URL(t),r=M(n.hash);return(r?.get(e)??r?.get(`visual-review`)??r?.get(`agency-review`)??r?.get(`agency-review-invite`)??n.searchParams.get(e)??n.searchParams.get(`agency-review`)??n.searchParams.get(`agency-review-invite`))?.trim()||null}function j(e){let t=(M(new URL(e).hash)?.get(`visual-review-token`))?.trim();return t&&/^[A-Za-z0-9_-]{43}$/u.test(t)?t:null}function M(e){let t=e.startsWith(`#`)?e.slice(1):e,n=t.startsWith(`?`)?t.slice(1):t;return n.includes(`=`)?new URLSearchParams(n):null}function ae(e){let t=new URL(window.location.href),n=new Set([e,`visual-review`,`agency-review`,`agency-review-invite`,`visual-review-token`]),r=!1;n.forEach(e=>{t.searchParams.has(e)&&(t.searchParams.delete(e),r=!0)});let i=M(t.hash);if(i){n.forEach(e=>{i.has(e)&&(i.delete(e),r=!0)});let e=i.toString();t.hash=e?`#${e}`:``}r&&window.history.replaceState(window.history.state,``,`${t.pathname}${t.search}${t.hash}`)}function oe(e,t){return new Promise((n,r)=>{let i=()=>r(new DOMException(`Aborted`,`AbortError`));if(t.aborted){i();return}t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function N(e,t,n,r){return new Promise((i,a)=>{let o=!1,s=e=>{o||(o=!0,clearTimeout(l),t.removeEventListener(`abort`,c),e())},c=()=>{s(()=>a(new DOMException(`Aborted`,`AbortError`)))},l=setTimeout(()=>{s(()=>a(Error(r)))},n);if(t.aborted){c();return}t.addEventListener(`abort`,c,{once:!0}),e.then(e=>s(()=>i(e)),e=>s(()=>a(e)))})}function se(e,t){return e.body?Promise.resolve(e.body):t.aborted?Promise.reject(new DOMException(`Aborted`,`AbortError`)):new Promise((n,r)=>{let i=!1,a=new MutationObserver(()=>c()),o=()=>{e.removeEventListener(`DOMContentLoaded`,c),t.removeEventListener(`abort`,l),a.disconnect()},s=e=>{i||(i=!0,o(),e())},c=()=>{let t=e.body;t&&s(()=>n(t))},l=()=>{s(()=>r(new DOMException(`Aborted`,`AbortError`)))};e.addEventListener(`DOMContentLoaded`,c),t.addEventListener(`abort`,l,{once:!0}),a.observe(e,{childList:!0,subtree:!0}),c()})}function P(e){let t=document.querySelector(`meta[name="visual-review-build"]`),n=document.querySelector(`meta[name="visual-review-commit"]`),r=H(L()),i=H(R());return{buildId:V(e?.buildId)??ce(t)??r??`unversioned`,gitCommit:z(e,n,i),generatedAt:e?.generatedAt,mode:e?.mode??I(F())??(Q(window.location.hostname)?`development`:`production`)}}function F(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_MODE}catch{return}}function I(e){return e===`development`||e===`preview`||e===`production`?e:void 0}function L(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_ID}catch{return}}function R(){try{return process.env.VISUAL_REVIEW_PUBLIC_GIT_COMMIT}catch{return}}function z(e,t,n){return e?.gitCommit===null?null:typeof e?.gitCommit==`string`?B(e.gitCommit):B(t?.content)??B(n)}function B(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(t)?t:null}function ce(e){return H(e?.content)}function V(e){let t=typeof e==`string`?e.trim():``;return t.length>0?t:null}function H(e){return typeof e==`string`&&e.length>0?e:null}function le(e,t,n,r,i,a,o){if(a===`tab`){try{r?.setItem(Y(e,n.origin),t)}catch{}K(i,X(e,n.origin))}else{let a=Number.isSafeInteger(o)&&o>Date.now()?o:Date.now()+1440*6e4;try{i?.setItem(X(e,n.origin),JSON.stringify({version:2,invitationId:t,expiresAt:a}))}catch{}K(r,Y(e,n.origin))}G(e,n.origin,i,t)}function U(e,t){let n=W(e,t);if(!n)return null;let r=()=>{try{e?.removeItem?.(t)}catch{}};try{let e=JSON.parse(n),t=e.expiresAt;return e.version!==2||typeof e.invitationId!=`string`||!e.invitationId.trim()||!Number.isSafeInteger(t)||t<=Date.now()?(r(),null):{version:2,invitationId:e.invitationId,expiresAt:t}}catch{return r(),null}}function W(e,t){try{return e?.getItem(t)??null}catch{return null}}function ue(e){try{return e.localStorage}catch{return null}}function de(e){try{return e.sessionStorage}catch{return null}}function G(e,t,n,r){try{if(!n)return;let i=J(e,t),a=n.getItem(i);if(a===null||r!==void 0&&a!==r)return;n.removeItem(i)}catch{}}function K(e,t){try{e?.removeItem(t)}catch{}}function q(e,t,n,r,i){G(e,t,r,i);let a=Y(e,t),o=X(e,t);if(i===void 0){K(n,a),K(r,o);return}W(n,a)===i&&K(n,a),U(r,o)?.invitationId===i&&K(r,o)}function J(e,t){return`visual-review:${e}:${t}:invitation`}function Y(e,t){return`visual-review:${e}:${t}:invitation:tab:v2`}function X(e,t){return`visual-review:${e}:${t}:invitation:browser:v2`}function Z(e,t){return`visual-review:${e}:${t}:exit:v1`}function Q(e){return e===`localhost`||e===`127.0.0.1`||e.endsWith(`.test`)||e.endsWith(`.local`)}function fe(e,t){let n=e instanceof Error?e.message:String(e),r=Error($(n,t));if(e&&typeof e==`object`){let n=`code`in e?e.code:void 0,i=`status`in e?e.status:void 0;typeof n==`string`&&Object.defineProperty(r,"code",{configurable:!0,enumerable:!0,value:$(n,t)}),typeof i==`number`&&Number.isFinite(i)&&Object.defineProperty(r,"status",{configurable:!0,enumerable:!0,value:i})}return r}function $(e,t){if(!t)return e;let n=new Set([t,encodeURIComponent(t)]),r=e;for(let e of n)e&&(r=r.split(e).join(`[redacted]`));return r}function pe(e,t){if(e!==void 0)return he(e);let n=t.currentScript,r=n?me(n):void 0;if(r)return r;try{for(let e of t.querySelectorAll(`script[nonce],style[nonce]`)){let t=me(e);if(t)return t}}catch{}}function me(e){let t=`nonce`in e?e.nonce:void 0;return typeof t==`string`?he(t):void 0}function he(e){return e.trim()||void 0}export{e as n,t as r,s as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,o as r,r as i,s as a,t as o}from"./src-CjYM9---.js";import{a as s,n as c,t as l}from"./reviewer-auth-presentation-CAm-YbaR.js";import{i as u,init as d}from"@instantdb/core";new Uint8Array([107,167,184,17,157,173,17,209,128,180,0,192,79,212,48,200]);const f=u.schema({entities:{$files:u.entity({path:u.string().unique().indexed(),url:u.string()}),$users:u.entity({email:u.string().unique().indexed()}),projects:u.entity({name:u.string(),slug:u.string().unique().indexed(),allowedOrigin:u.string().optional(),originDisconnectedAt:u.number().optional(),originModelVersion:u.number().optional(),createdAt:u.number().indexed(),updatedAt:u.number()}),projectOrigins:u.entity({projectId:u.string().indexed(),originKey:u.string().unique().indexed(),origin:u.string().indexed(),label:u.string().optional(),createdAt:u.number().indexed(),updatedAt:u.number()}),reviewPages:u.entity({projectId:u.string().indexed(),autoRegistrationSlot:u.string().unique().indexed().optional(),name:u.string(),pathname:u.string(),stagingOrigin:u.string(),createdAt:u.number().indexed(),updatedAt:u.number()}),reviewPageBuilds:u.entity({projectId:u.string().indexed(),pageId:u.string().unique().indexed(),buildId:u.string(),gitCommit:u.string().optional(),generatedAt:u.number().optional(),mode:u.string(),updatedAt:u.number().indexed()}),reviewers:u.entity({authUserId:u.string().indexed(),projectId:u.string().indexed(),email:u.string().indexed(),displayName:u.string(),role:u.string(),createdAt:u.number()}),reviewerIdentityClaims:u.entity({reviewerId:u.string().unique().indexed(),projectId:u.string().indexed(),authUserId:u.string().indexed(),email:u.string(),displayName:u.string(),role:u.string(),createdAt:u.number()}),invitations:u.entity({projectId:u.string().indexed(),reviewerId:u.string().indexed().optional(),email:u.string().indexed(),status:u.string().indexed(),claimRevision:u.number(),claimedByAuthUserId:u.string().indexed().optional(),expiresAt:u.number().indexed(),createdAt:u.number(),acceptedAt:u.number().optional(),revokedAt:u.number().optional(),emailTokenHash:u.string().optional(),emailSentAt:u.number().optional(),reviewUrl:u.string().optional()}),comments:u.entity({pageId:u.string().indexed(),pageNumber:u.number().optional(),authorId:u.string().indexed(),authorAuthUserId:u.string().indexed(),authorName:u.string(),body:u.string(),bodyContentMarker:u.string().optional(),anchorSelector:u.string().optional(),anchorOffsetX:u.number().optional(),anchorOffsetY:u.number().optional(),anchorViewportX:u.number().optional(),anchorViewportY:u.number().optional(),targetKind:u.string().optional(),targetPageX:u.number().optional(),targetPageY:u.number().optional(),targetWidth:u.number().optional(),targetHeight:u.number().optional(),targetViewportX:u.number().optional(),targetViewportY:u.number().optional(),targetViewportWidth:u.number().optional(),targetViewportHeight:u.number().optional(),targetPageOrigin:u.string().optional(),targetPagePathname:u.string().optional(),targetPageSearch:u.string().optional(),targetPageHash:u.string().optional(),targetPageTitle:u.string().optional(),targetCapturedAt:u.number().optional(),environmentBrowser:u.string().optional(),environmentOperatingSystem:u.string().optional(),environmentDeviceType:u.string().optional(),environmentScreenWidth:u.number().optional(),environmentScreenHeight:u.number().optional(),environmentDevicePixelRatio:u.number().optional(),status:u.string().indexed(),workflowRevision:u.number(),createdAt:u.number().indexed(),updatedAt:u.number().indexed(),resolvedAt:u.number().optional(),resolvedById:u.string().optional(),deletingAt:u.number().optional()}),commentWorkflowClaims:u.entity({claimKey:u.string().unique().indexed(),commentId:u.string().indexed(),expectedWorkflowRevision:u.number(),createdAt:u.number().indexed()}),commentPageNumberClaims:u.entity({claimKey:u.string().unique().indexed(),pageId:u.string().indexed(),pageNumber:u.number(),commentId:u.string().indexed(),createdAt:u.number().indexed()}),commentTargetElements:u.entity({commentId:u.string().indexed(),slotKey:u.string().unique().indexed().optional(),ordinal:u.number(),selector:u.string(),tagName:u.string(),textPreview:u.string(),pageX:u.number(),pageY:u.number(),width:u.number(),height:u.number(),viewportX:u.number(),viewportY:u.number(),viewportWidth:u.number(),viewportHeight:u.number(),authorAuthUserId:u.string().indexed()}),commentScopeEntries:u.entity({commentId:u.string().indexed(),slotKey:u.string().unique().indexed().optional(),ordinal:u.number(),key:u.string(),valueType:u.string(),stringValue:u.string().optional(),numberValue:u.number().optional(),booleanValue:u.boolean().optional(),authorAuthUserId:u.string().indexed()}),commentSourceContexts:u.entity({commentId:u.string().unique().indexed(),pageId:u.string().indexed(),authorAuthUserId:u.string().indexed(),contextJson:u.string(),requestPayloadHash:u.string().optional(),createdAt:u.number().indexed()}),replies:u.entity({pageId:u.string().indexed(),commentId:u.string().indexed(),authorId:u.string().indexed(),authorAuthUserId:u.string().indexed(),authorName:u.string(),body:u.string(),bodyContentMarker:u.string().optional(),requestPayloadHash:u.string().optional(),createdAt:u.number().indexed(),updatedAt:u.number().indexed()}),reviewMessages:u.entity({pageId:u.string().indexed(),pathname:u.string().indexed(),authorId:u.string().indexed(),authorAuthUserId:u.string().indexed(),authorName:u.string(),body:u.string(),bodyContentMarker:u.string(),createdAt:u.number().indexed(),updatedAt:u.number().indexed()})},links:{projectOwners:{forward:{on:`projects`,has:`many`,label:`owners`},reverse:{on:`$users`,has:`many`,label:`ownedProjects`}},projectPages:{forward:{on:`projects`,has:`many`,label:`pages`},reverse:{on:`reviewPages`,has:`one`,label:`project`}},projectOriginProject:{forward:{on:`projects`,has:`many`,label:`origins`},reverse:{on:`projectOrigins`,has:`one`,label:`project`}},pageCurrentBuild:{forward:{on:`reviewPageBuilds`,has:`one`,label:`page`,required:!0,onDelete:`cascade`},reverse:{on:`reviewPages`,has:`one`,label:`currentBuild`}},projectReviewers:{forward:{on:`projects`,has:`many`,label:`reviewers`},reverse:{on:`reviewers`,has:`one`,label:`project`}},reviewerUser:{forward:{on:`reviewers`,has:`one`,label:`$user`},reverse:{on:`$users`,has:`many`,label:`reviewerMemberships`}},projectInvitations:{forward:{on:`projects`,has:`many`,label:`invitations`},reverse:{on:`invitations`,has:`one`,label:`project`}},invitationReviewer:{forward:{on:`invitations`,has:`one`,label:`reviewer`},reverse:{on:`reviewers`,has:`many`,label:`acceptedInvitations`}},invitationActiveUser:{forward:{on:`invitations`,has:`one`,label:`activeUser`},reverse:{on:`$users`,has:`many`,label:`activeReviewInvitations`}},pageComments:{forward:{on:`reviewPages`,has:`many`,label:`comments`},reverse:{on:`comments`,has:`one`,label:`page`}},pageReviewMessages:{forward:{on:`reviewPages`,has:`many`,label:`reviewMessages`},reverse:{on:`reviewMessages`,has:`one`,label:`page`}},commentReplies:{forward:{on:`comments`,has:`many`,label:`replies`},reverse:{on:`replies`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`}},commentTargetElements:{forward:{on:`commentTargetElements`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`many`,label:`targetElements`}},commentScopeEntries:{forward:{on:`commentScopeEntries`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`many`,label:`scopeEntries`}},commentSourceContext:{forward:{on:`commentSourceContexts`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`one`,label:`sourceContext`}},pageSourceContexts:{forward:{on:`commentSourceContexts`,has:`one`,label:`page`,required:!0},reverse:{on:`reviewPages`,has:`many`,label:`sourceContexts`}},sourceContextAuthor:{forward:{on:`commentSourceContexts`,has:`one`,label:`author`,required:!0},reverse:{on:`reviewers`,has:`many`,label:`sourceContexts`}},commentAuthor:{forward:{on:`comments`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`comments`}},replyAuthor:{forward:{on:`replies`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`replies`}},reviewMessageAuthor:{forward:{on:`reviewMessages`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`reviewMessages`}}},rooms:{visualReview:{presence:u.entity({reviewerId:u.string(),displayName:u.string(),color:u.string(),active:u.boolean(),pathname:u.string().optional(),cursorX:u.number().optional(),cursorY:u.number().optional(),viewportWidth:u.number().optional(),viewportHeight:u.number().optional(),cursorChat:u.string().optional()})}}}),p={$default:`false`},m={$default:`false`},h=`$user.activeReviewInvitations`,g=`${h}.project.id`;function _(e){return[`auth.id != null`,`size(auth.ref('${h}.id')) > 0`,`size(auth.ref('${g}')) == size(auth.ref('${h}.id'))`,`size(auth.ref('${h}.status')) == size(auth.ref('${h}.id'))`,`size(auth.ref('${h}.expiresAt')) == size(auth.ref('${h}.id'))`,`size(auth.ref('${h}.revokedAt')) == 0`,`auth.ref('${h}.status').all(status, status == 'accepted')`,`auth.ref('${h}.expiresAt').all(expiresAt, request.time < timestamp(expiresAt))`,e].join(` && `)}function v(...e){return e.map(e=>`(${e})`).join(` && `)}function y(...e){return e.map(e=>`(${e})`).join(` || `)}function b(e){let t=`data.ref('${e}project.origins.origin')`,n=`data.ref('${e}project.allowedOrigin')`,r=`data.ref('${e}project.originModelVersion')`;return y(`request.origin in ${t}`,v(`size(${r}) == 0`,`request.origin in ${n}`))}_(`data.ref('project.id')[0] in auth.ref('${g}')`),y(`request.origin in data.ref('project.origins.origin')`,v(`size(data.ref('project.originModelVersion')) == 0`,`request.origin in data.ref('project.allowedOrigin')`)),y(`request.origin in data.ref('origins.origin')`,v(`size(data.ref('originModelVersion')) == 0`,`request.origin in data.ref('allowedOrigin')`)),_(`data.ref('page.project.id')[0] in auth.ref('${g}')`),b(`page.`),y(`auth.id != null && auth.id in data.ref('comment.page.project.owners.id')`,v(_(`data.ref('comment.page.project.id')[0] in auth.ref('${g}')`),b(`comment.page.`))),_(`data.ref('comment.page.project.id')[0] in auth.ref('${g}')`),b(`comment.page.`),b(``);const x=v(`data.reviewerId != null`,`data.projectId in data.ref('project.id')`,`data.reviewerId in data.ref('reviewer.id')`,`data.projectId in data.ref('reviewer.project.id')`,`auth.id in data.ref('reviewer.$user.id')`,`auth.email in data.ref('reviewer.email')`);v(`auth.id != null`,`data.revokedAt == null`,`data.status in ['pending', 'accepted']`,`data.status == 'pending' || data.claimedByAuthUserId == auth.id`,`request.time < timestamp(data.expiresAt)`,`request.modifiedFields.all(field, field in ['status', 'claimedByAuthUserId', 'acceptedAt', 'claimRevision', 'activeUser'])`,`'status' in request.modifiedFields`,`'claimedByAuthUserId' in request.modifiedFields`,`'acceptedAt' in request.modifiedFields`,`'claimRevision' in request.modifiedFields`,`'activeUser' in request.modifiedFields`,`newData.status == 'accepted'`,`newData.claimedByAuthUserId == auth.id`,`newData.claimRevision == data.claimRevision + 1`,`math.abs((request.time - timestamp(newData.acceptedAt)).getMinutes()) <= 1`,x),v(`actions.data == 'update'`,`actions.linkedData == 'update'`,`auth.id != null`,`auth.email != null`,`linkedData.id == auth.id`,`linkedData.email == auth.email`,`data.email == auth.email`,`data.revokedAt == null`,`data.status in ['pending', 'accepted']`,`data.status == 'pending' || data.claimedByAuthUserId == auth.id`,`request.time < timestamp(data.expiresAt)`,`newData.status == 'accepted'`,`newData.claimedByAuthUserId == auth.id`,`newData.claimRevision == data.claimRevision + 1`,`math.abs((request.time - timestamp(newData.acceptedAt)).getMinutes()) <= 1`,x),v(`actions.data == 'update'`,`actions.linkedData == 'update'`,`auth.id != null`,`auth.email != null`,`data.id == auth.id`,`data.email == auth.email`,`linkedData.email == auth.email`,`linkedData.revokedAt == null`,`linkedData.status == 'accepted'`,`linkedData.claimedByAuthUserId == auth.id`,`request.time < timestamp(linkedData.expiresAt)`,`math.abs((request.time - timestamp(linkedData.acceptedAt)).getMinutes()) <= 1`,`linkedData.projectId in linkedData.ref('project.id')`,`linkedData.reviewerId in linkedData.ref('reviewer.id')`,`linkedData.projectId in linkedData.ref('reviewer.project.id')`,`auth.id in linkedData.ref('reviewer.$user.id')`,`auth.email in linkedData.ref('reviewer.email')`),v(`auth.id != null`,`auth.email != null`,`linkedData.id == auth.id`,`linkedData.email == auth.email`,`data.email == auth.email`,`data.claimedByAuthUserId == auth.id`,`auth.id in data.ref('activeUser.id')`),v(`auth.id != null`,`auth.email != null`,`data.id == auth.id`,`data.email == auth.email`,`linkedData.email == auth.email`,`linkedData.claimedByAuthUserId == auth.id`,`auth.id in linkedData.ref('activeUser.id')`),{...p},{...p},{...m},{...m},_(`data.id in auth.ref('${g}')`),{...p},{...m},{...p},{...p},{...m},{...p},{...m},_(`data.ref('project.id')[0] in auth.ref('${g}')`),{...p},{...m},{...p},{...p},{...m},{...m},{...p},{...m},{...p},{...p},{...p},{...p},{...p},{...p},{...p};function ee(e){if(!e.trim())throw Error(`InstantDB app ID is required`);return d({appId:e,schema:f,devtool:!1})}var te=class{db;session;#e;attachScreenshot;constructor(e,t,n={}){this.db=e,this.session=t,this.#e=n.commentTransport,this.#e&&(this.attachScreenshot=(e,t,n)=>this.#e.uploadScreenshot({pageId:e,commentId:t,screenshot:n}))}async getSnapshot(e){let{data:t}=await this.db.queryOnce(S(e,this.session.authUserId));return w(e,t.comments,t.replies)}async getProjectSnapshot(e){this.#t(e);let{data:t}=await this.db.queryOnce(C(e,this.session.authUserId));return T(e,t.comments,t.replies)}subscribe(e,t,n){return this.db.subscribeQuery(S(e,this.session.authUserId),r=>{if(r.error){n?.(j(r.error));return}if(r.data)try{t(w(e,r.data.comments,r.data.replies))}catch{n?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})}subscribeProject(e,t,n){return this.#t(e),this.db.subscribeQuery(C(e,this.session.authUserId),r=>{if(r.error){n?.(j(r.error));return}if(r.data)try{t(T(e,r.data.comments,r.data.replies))}catch{n?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})}async mutate(e,t){switch(t.type){case`comment.upsert`:{if(t.comment.pageId!==e)throw Error(`Comment page mismatch`);let n=t.comment;if(n.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);let i=a(n.body).trim(),s=I(n.createdAt,`Comment createdAt`);if(I(n.updatedAt,`Comment updatedAt`)<s)throw new o(`Comment updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new o(`Comment edits must go through the review service`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0)throw new o(`New comments must start open`);let c=r(n.target);if(!k(n.anchor,c.publicTarget.anchor))throw new o(`Comment anchor does not match its target`);if(!this.#e)throw new o(`Comment creation requires the review service transport`);await this.#e.createComment({pageId:e,commentId:n.id,body:i,target:n.target,...n.scope===void 0?{}:{scope:n.scope}});return}case`comment.delete`:throw new o(`Comment deletion must go through the review service`);case`reply.upsert`:{let e=t.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);let n=a(e.body,`Reply body`).trim(),r=I(e.createdAt,`Reply createdAt`);if(I(e.updatedAt,`Reply updatedAt`)<r)throw new o(`Reply updatedAt precedes createdAt`);if(e.createdAt!==e.updatedAt)throw new o(`Reply edits must go through the review service`);if(!this.#e)throw new o(`Reply creation requires the review service transport`);await this.#e.createReply({commentId:e.commentId,replyId:e.id,body:n});return}case`reply.delete`:throw new o(`Reply deletion must go through the review service`)}}#t(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function S(e,t){return{comments:{$:{where:{pageId:e},order:{createdAt:`asc`}},targetElements:{},scopeEntries:{}},replies:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function C(e,t){return{comments:{$:{where:{"page.project.id":e},order:{createdAt:`asc`}},page:{project:{}},targetElements:{},scopeEntries:{}},replies:{$:{where:{"comment.page.project.id":e},order:{createdAt:`asc`}},comment:{page:{project:{}}}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function w(e,t,n){let r=t.map(t=>D(t,e));A(r,`comment`);let i=new Set(r.map(({id:e})=>e)),a=n.map(t=>O(t,e));A(a,`reply`);for(let e of a)if(!i.has(e.commentId))throw new o(`Reply ${e.id} references a comment outside the page snapshot`);return{pageId:e,comments:r,replies:a}}function T(e,t,n){let r=new Map,i=t.map(t=>{let n=P(t.pageId,`comment pageId`);E(t.page,n,e,`comment ${String(t.id)}`);let i=M(t.page,`comment ${String(t.id)} page`),a=D(t,n),o=`/`;try{o=new URL(a.target.pageUrl).pathname||`/`}catch{}return r.set(n,{id:n,name:typeof i.name==`string`&&i.name.trim()?i.name.trim():a.target.pageTitle.trim()||o,pathname:typeof i.pathname==`string`&&i.pathname.trim()?i.pathname.trim():o}),a});A(i,`comment`);let a=new Map(i.map(e=>[e.id,e])),s=n.map(t=>{let n=P(t.pageId,`reply pageId`),r=M(t.comment,`reply ${String(t.id)} comment`),i=P(t.commentId,`reply ${String(t.id)} commentId`);if(P(r.id,`reply ${String(t.id)} comment relation id`)!==i)throw new o(`Reply ${String(t.id)} has an inconsistent comment relation`);E(r.page,n,e,`reply ${String(t.id)}`);let s=O(t,n),c=a.get(s.commentId);if(!c||c.pageId!==n)throw new o(`Reply ${s.id} references a comment outside the project snapshot`);return s});return A(s,`reply`),{projectId:e,pages:[...r.values()].sort((e,t)=>e.pathname.localeCompare(t.pathname)||e.id.localeCompare(t.id)),comments:i,replies:s}}function E(e,t,n,r){let i=M(e,`${r} page`);if(P(i.id,`${r} page id`)!==t)throw new o(`${r} escaped its page relation`);if(P(M(i.project,`${r} project`).id,`${r} project id`)!==n)throw new o(`${r} escaped its project scope`)}function D(r,s){let c=M(r,`comment`),l=P(c.id,`comment id`);if(P(c.pageId,`comment ${l} pageId`)!==s)throw new o(`Comment ${l} escaped its page scope`);P(c.authorAuthUserId,`comment ${l} authorAuthUserId`);let u=!(Object.hasOwn(c,`anchor`)&&Object.hasOwn(c,`target`)),d=u?n(c,c.targetElements,`comment ${l} target`):e(c.target,`comment ${l} target`),f=u?{...d.anchor}:ne(c.anchor,`comment ${l} anchor`);if(!k(f,d.anchor))throw new o(`Comment ${l} has inconsistent anchors`);let p=c.status;if(p!==`open`&&p!==`resolved`)throw new o(`Comment ${l} has an invalid status`);let m=I(c.createdAt,`comment ${l} createdAt`),h=I(c.updatedAt,`comment ${l} updatedAt`);if(h<m)throw new o(`Comment ${l} updatedAt precedes createdAt`);let g=ae(c.resolvedAt,`comment ${l} resolvedAt`),_=oe(c.resolvedById,`comment ${l} resolvedById`);if(p===`open`&&(g!==void 0||_!==void 0))throw new o(`Open comment ${l} contains resolution metadata`);if(p===`resolved`&&(g===void 0||_===void 0||g!==h))throw new o(`Resolved comment ${l} has invalid workflow metadata`);return{id:l,pageId:s,...se(c.pageNumber,`comment ${l} pageNumber`),authorId:P(c.authorId,`comment ${l} authorId`),authorName:P(c.authorName,`comment ${l} authorName`),body:a(c.body,`comment ${l} body`),anchor:f,target:d,...u?re(i(c.scopeEntries)):c.scope==null?{}:{scope:t(c.scope)},status:p,workflowRevision:L(c.workflowRevision,`comment ${l} workflowRevision`),createdAt:m,updatedAt:h,...g===void 0?{}:{resolvedAt:g},..._===void 0?{}:{resolvedById:_}}}function O(e,t){let n=M(e,`reply`),r=P(n.id,`reply id`);if(P(n.pageId,`reply ${r} pageId`)!==t)throw new o(`Reply ${r} escaped its page scope`);P(n.authorAuthUserId,`reply ${r} authorAuthUserId`);let i=I(n.createdAt,`reply ${r} createdAt`),s=I(n.updatedAt,`reply ${r} updatedAt`);if(s<i)throw new o(`Reply ${r} updatedAt precedes createdAt`);return{id:r,commentId:P(n.commentId,`reply ${r} commentId`),authorId:P(n.authorId,`reply ${r} authorId`),authorName:P(n.authorName,`reply ${r} authorName`),body:a(n.body,`reply ${r} body`),createdAt:i,updatedAt:s}}function ne(e,t){let n=M(e,t);if(Object.keys(n).length!==5||!Object.hasOwn(n,`selector`)||!Object.hasOwn(n,`offsetX`)||!Object.hasOwn(n,`offsetY`)||!Object.hasOwn(n,`viewportX`)||!Object.hasOwn(n,`viewportY`))throw new o(`${t} has invalid fields`);return{selector:N(n.selector,`${t} selector`),offsetX:F(n.offsetX,`${t} offsetX`),offsetY:F(n.offsetY,`${t} offsetY`),viewportX:F(n.viewportX,`${t} viewportX`),viewportY:F(n.viewportY,`${t} viewportY`)}}function k(e,t){return e.selector===t.selector&&e.offsetX===t.offsetX&&e.offsetY===t.offsetY&&e.viewportX===t.viewportX&&e.viewportY===t.viewportY}function re(e){return e===void 0?{}:{scope:e}}function A(e,t){let n=new Set;for(let r of e){if(n.has(r.id))throw new o(`Duplicate ${t} ${r.id}`);n.add(r.id)}}function j(e){let t=ie(e).toLowerCase();return t.includes(`expired`)||t.includes(`token`)?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t.includes(`permission`)||t.includes(`forbidden`)||t.includes(`unauthorized`)?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:`transport`,recovery:`retry`,clearSnapshot:!0}}function ie(e){return e instanceof Error?e.message:e&&typeof e==`object`&&`message`in e?String(e.message):``}function M(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new o(`${t} is missing or invalid`);return e}function N(e,t){if(typeof e!=`string`)throw new o(`${t} is invalid`);return e}function P(e,t){let n=N(e,t);if(!n.trim())throw new o(`${t} is empty`);return n}function F(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw new o(`${t} is invalid`);return e}function I(e,t){if(!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw new o(`${t} is invalid`);return e}function L(e,t){if(!Number.isSafeInteger(e)||e<0)throw new o(`${t} is invalid`);return e}function ae(e,t){return e==null?void 0:I(e,t)}function oe(e,t){return e==null?void 0:P(e,t)}function se(e,t){if(e==null)return{};let n=L(e,t);if(n<1)throw new o(`${t} is invalid`);return{pageNumber:n}}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`}),Object.freeze({comments:200,replies:1e3,sourceContexts:200});var ce=class{db;session;roomCredential;#e=new Map;constructor(e,t,n){this.db=e,this.session=t,this.roomCredential=n}subscribe(e,t,n,r){let i=[],a=!1,o=[],s=()=>{a||n({pageId:e,peers:structuredClone(i)})};if(t.cursors||t.chat){let n=U(e,t.roomId),c,l,u=this.roomCredential?.id===t.roomId?this.roomCredential:void 0,d=u??{id:t.roomId,expiresAt:2**53-1,refresh:async()=>void 0},f=t=>{let a=this.db.joinRoom(`visualReview`,t),o=a.subscribePresence({},e=>{if(e.error){r?.(ue(e.error));return}i=Object.values(e.peers).map(e=>le(e)).filter(e=>e!==null).sort((e,t)=>e.displayName.localeCompare(t.displayName)||e.peerId.localeCompare(t.peerId)),s()}),l=c;c=()=>{o(),a.leaveRoom()},this.#e.set(n,{pageId:e,roomId:t,publishPresence:e=>a.publishPresence(e)}),l?.()},p=()=>{if(!u||a)return;let e=Math.max(1e3,d.expiresAt-Date.now()+250);l=setTimeout(()=>{m()},e)},m=async()=>{try{let e=await d.refresh();if(a||!e)return;d={...e,refresh:d.refresh},u&&(u.id=e.id,u.expiresAt=e.expiresAt),f(e.id),p()}catch(e){if(a)return;r?.(ue(e)),a||(l=setTimeout(()=>{m()},5e3))}};f(d.id),p(),o.push(()=>{l&&clearTimeout(l),this.#e.delete(n),c?.()})}return queueMicrotask(s),()=>{if(!a){a=!0;for(let e of o.reverse())try{e()}catch{}}}}publishPresence(e,t,n){let r=this.#e.get(U(e,t));r&&r.publishPresence({reviewerId:this.session.reviewerId,displayName:this.session.displayName,color:n.color,active:n.active,pathname:z(n.pathname),...n.cursorX===void 0?{}:{cursorX:n.cursorX},...n.cursorY===void 0?{}:{cursorY:n.cursorY},...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.viewportHeight===void 0?{}:{viewportHeight:n.viewportHeight},cursorChat:R(n.cursorChat)})}};function le(e){let t=B(e.reviewerId,128),n=B(e.displayName,512),r=typeof e.color==`string`&&/^#[0-9a-f]{6}$/iu.test(e.color)?e.color:null;if(!t||!n||!r||typeof e.active!=`boolean`)return null;let i=V(e.cursorX),a=V(e.cursorY),o=H(e.viewportWidth),s=H(e.viewportHeight),c=R(e.cursorChat),l=z(e.pathname);return{peerId:e.peerId,reviewerId:t,displayName:n,color:r,active:e.active,pathname:l,...i===void 0?{}:{cursorX:i},...a===void 0?{}:{cursorY:a},...o===void 0?{}:{viewportWidth:o},...s===void 0?{}:{viewportHeight:s},...c?{cursorChat:c}:{}}}function R(e){return typeof e==`string`?e.trim().slice(0,280):``}function z(e){if(typeof e!=`string`)return`/`;let t=e.trim();return t.startsWith(`/`)?t.slice(0,2e3):`/`}function B(e,t){if(typeof e!=`string`)return null;let n=e.trim();return n&&n.length<=t?n:null}function V(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function H(e){let t=V(e);return t!==void 0&&t>0?t:void 0}function U(e,t){return JSON.stringify([e,t])}function ue(e){let t=e&&typeof e==`object`&&`code`in e?String(e.code):``;if(/^INVITATION_(?:EXPIRED|NOT_FOUND|REQUIRED|REVOKED)$/u.test(t))return{type:`access-lost`,code:t===`INVITATION_EXPIRED`?`session-expired`:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0};let n=String(e instanceof Error||e&&typeof e==`object`&&`message`in e?e.message:e).toLowerCase();return n.includes(`expired`)||n.includes(`token`)?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:n.includes(`permission`)||n.includes(`forbidden`)||n.includes(`unauthorized`)?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:`transport`,recovery:`retry`,clearSnapshot:!0}}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`});var W=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewerCommentSaveError`}};function de(e,t){let n=e.replace(/\/+$/,``),r=async(e,r)=>{let i=await t();if(!i)throw new W(`AUTH_REQUIRED`,`로그인 세션이 만료되었습니다. 새로고침 후 다시 시도해 주세요.`);let a;try{a=await fetch(`${n}${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:JSON.stringify(r)})}catch{throw new W(`NETWORK`,`리뷰 서버에 연결하지 못했습니다. 연결을 확인하고 다시 시도해 주세요.`)}if(!a.ok)throw new W(...await G(a))};return{createComment:({target:e,...t})=>{let{environment:n,...i}=e;return r(`/v1/comments`,{...t,target:i,...n?{environment:n}:{}})},createReply:e=>r(`/v1/replies`,e),uploadScreenshot:async({pageId:e,commentId:r,screenshot:i})=>{let a=await t();if(!a)throw new W(`AUTH_REQUIRED`,`로그인 세션이 만료되어 위치 캡처를 저장하지 못했습니다.`);let o;try{o=await fetch(`${n}/v1/comments/${encodeURIComponent(r)}/screenshot`,{method:`PUT`,headers:{authorization:`Bearer ${a}`,"content-type":i.contentType,"x-review-page-id":e,"x-review-image-width":String(i.width),"x-review-image-height":String(i.height)},body:fe(i.bytes)})}catch{throw new W(`NETWORK`,`리뷰 서버에 연결하지 못해 위치 캡처를 저장하지 못했습니다.`)}if(!o.ok)throw new W(...await G(o))}}}function fe(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}async function G(e){let t=e.status>=500?`리뷰 서버가 코멘트를 저장하지 못했습니다. 잠시 후 다시 시도해 주세요.`:`코멘트를 저장하지 못했습니다.`;try{let n=await e.json();if(!n||typeof n!=`object`)return[`UNKNOWN`,t];let r=n;return[typeof r.error==`string`?r.error:`UNKNOWN`,typeof r.message==`string`&&r.message.trim()?r.message:t]}catch{return[`UNKNOWN`,t]}}function pe(e,t={}){let n=e.trim();if(!n)throw Error(`InstantDB app ID is required`);return{async resolve(e){K(e.routeKey,e.location.pathname);let{db:r,user:i}=await me(n,e,t);t.resolveReviewPage&&await t.resolveReviewPage({refreshToken:i.refresh_token,invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,signal:e.signal});let{data:a}=await r.queryOnce({reviewers:{$:{where:{authUserId:i.id}}},reviewPages:{},invitations:{}}),o=ge(a.invitations,a.reviewers,a.reviewPages,{invitationId:e.invitationId,authUserId:i.id,email:i.email??``,location:e.location,now:Date.now()});if(!o.ok)throw new s(o.code,$(o.code));let c={authUserId:i.id,reviewerId:o.reviewer.id,projectId:o.reviewer.projectId,invitationId:e.invitationId,email:o.reviewer.email||i.email||``,displayName:o.reviewer.displayName||i.email||`Reviewer`,role:o.reviewer.role===`agency`?`agency`:`reviewer`},l=o.page.id,u=e.collaboration?.scopeId,d=(e.collaboration?.cursors===!0||e.collaboration?.chat===!0)&&t.resolveCollaborationRoom?await t.resolveCollaborationRoom({refreshToken:i.refresh_token,invitationId:e.invitationId,pageId:o.page.id,scopeId:e.collaboration.scopeId,signal:e.signal}):void 0,f=d&&t.resolveCollaborationRoom?{...d,refresh:async()=>{let n=await r.getAuth();if(!(!n?.refresh_token||u===void 0))return t.resolveCollaborationRoom?.({refreshToken:n.refresh_token,invitationId:e.invitationId,pageId:l,scopeId:u,signal:new AbortController().signal})}}:void 0,p=0;return{pageId:o.page.id,resolvePage:async n=>{let i=++p,a=()=>i!==p||n.signal.aborted,o=(e,t,n)=>({pageId:e,...n&&f?{collaborationRoomId:n.id}:{},commit:()=>{a()||(l=e,t!==void 0&&(u=t),!(!n||!f)&&(f.id=n.id,f.expiresAt=n.expiresAt))}});if(n.location.origin!==e.location.origin)throw new s(`PAGE_NOT_FOUND`,$(`PAGE_NOT_FOUND`));K(n.routeKey,n.location.pathname);let{data:d}=await r.queryOnce({reviewPages:{$:{where:{projectId:c.projectId}}}});if(a())throw Z();let m=Q(n.location.pathname),h=q(d.reviewPages,c.projectId,n.location.origin,m);if(!h&&t.resolveReviewPage){let i=await r.getAuth();if(a())throw Z();if(!i?.refresh_token)throw Error(`리뷰 세션이 만료되어 페이지를 등록할 수 없습니다.`);if(await t.resolveReviewPage({refreshToken:i.refresh_token,invitationId:e.invitationId,origin:n.location.origin,pathname:m,signal:n.signal}),a()||({data:d}=await r.queryOnce({reviewPages:{$:{where:{projectId:c.projectId}}}}),a()))throw Z();h=q(d.reviewPages,c.projectId,n.location.origin,m)}if(!h)throw new s(`PAGE_NOT_FOUND`,$(`PAGE_NOT_FOUND`));if(n.collaboration?.cursors!==!0&&n.collaboration?.chat!==!0||f===void 0||t.resolveCollaborationRoom===void 0||!n.collaboration)return o(h.id,n.collaboration?.scopeId);let g=await r.getAuth();if(a())throw Z();if(!g?.refresh_token)throw Error(`리뷰 세션이 만료되어 실시간 협업 연결을 갱신할 수 없습니다.`);let _=await t.resolveCollaborationRoom({refreshToken:g.refresh_token,invitationId:e.invitationId,pageId:h.id,scopeId:n.collaboration.scopeId,signal:n.signal});if(a())throw Z();return o(h.id,n.collaboration.scopeId,_)},session:c,repository:new te(r,c,{...t.serviceUrl===void 0?{}:{commentTransport:de(t.serviceUrl,async()=>(await r.getAuth())?.refresh_token??null)}}),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{collaborationRepository:new ce(r,c,f)}:{},...(e.collaboration?.cursors===!0||e.collaboration?.chat===!0)&&f?{collaborationRoomId:f.id}:{},allowedStagingHosts:[e.location.hostname],sessionScope:`browser`}}}}function K(e,t){if(e!==void 0&&e!==Q(t))throw Error(`Query/hash page identity requires the Convex review runtime.`)}async function me(e,t,n){let r=(n.databaseFactory??ee)(e),i=!!t.emailToken,a;if(t.emailToken){if(!n.redeemEmailInvitation)throw new s(`INVITATION_EMAIL_REQUIRED`,`이 리뷰는 이메일 초대 링크에서만 시작할 수 있습니다.`);await l(t.authHost,t.signal,t.styleNonce);let e=await n.redeemEmailInvitation({invitationId:t.invitationId,emailToken:t.emailToken,origin:t.location.origin,pathname:t.location.pathname,signal:t.signal});await J(t.signal,()=>r.getAuth())&&await J(t.signal,async()=>r.auth.signOut()),await J(t.signal,async()=>r.auth.signInWithToken(e));let i=await J(t.signal,()=>r.getAuth());if(!i)throw Error(`인증 세션을 확인할 수 없습니다.`);a=i}else a=await _e(r,t.signal);if(!i)try{await he(n.acceptInvitation,{refreshToken:a.refresh_token,invitationId:t.invitationId,suggestedDisplayName:ve(a.email),authHost:t.authHost,signal:t.signal,styleNonce:t.styleNonce})}catch(e){throw X(e,`INVITATION_EMAIL_MISMATCH`)?new s(`INVITATION_EMAIL_REQUIRED`,`초대받은 이메일의 링크를 다시 열어 주세요.`):e}return{db:r,user:a}}async function he(e,t){if(!e)return;let n={refreshToken:t.refreshToken,invitationId:t.invitationId,signal:t.signal};try{await e(n);return}catch(e){if(!X(e,`DISPLAY_NAME_REQUIRED`))throw e}let r=await c(t.authHost,t.signal,t.suggestedDisplayName,t.styleNonce);await e({...n,displayName:r})}function ge(e,t,n,r){let i=e.find(({id:e})=>e===r.invitationId);if(!i||be(i.email)!==be(r.email))return{ok:!1,code:`INVITATION_REQUIRED`};if(i.status===`revoked`)return{ok:!1,code:`INVITATION_REVOKED`};if(i.status===`expired`||i.expiresAt<=r.now)return{ok:!1,code:`INVITATION_EXPIRED`};if(i.status!==`accepted`)return{ok:!1,code:`INVITATION_NOT_ACCEPTED`};let a=t.find(e=>e.authUserId===r.authUserId&&e.projectId===i.projectId);if(!a)return{ok:!1,code:`MEMBERSHIP_REQUIRED`};let o=Q(r.location.pathname),s=q(n,i.projectId,r.location.origin,o);return s?{ok:!0,invitation:i,reviewer:a,page:s}:{ok:!1,code:`PAGE_NOT_FOUND`}}function q(e,t,n,r){let i=e.filter(e=>e.projectId===t&&Q(e.pathname)===r),a=i.filter(({stagingOrigin:e})=>e===n);return(a.length>0?a:i).sort((e,t)=>(e.createdAt??2**53-1)-(t.createdAt??2**53-1)||e.id.localeCompare(t.id))[0]}async function _e(e,t){let n=await J(t,()=>e.getAuth());if(n)return n;throw new s(`INVITATION_EMAIL_REQUIRED`,`초대받은 이메일의 링크를 열어 주세요.`)}async function J(e,t){Y(e);let n=await t();return Y(e),n}function Y(e){if(e.aborted)throw ye()}function ve(e){return e?.split(`@`)[0]?.trim().slice(0,120)??``}function X(e,t){return!!(e&&typeof e==`object`&&`code`in e&&e.code===t)}function Z(){return new DOMException(`Aborted`,`AbortError`)}function ye(){return new s(`AUTH_CANCELLED`,`리뷰 로그인이 취소되었습니다.`)}function Q(e){return e.replace(/\/+$/,``)||`/`}function be(e){return e.trim().toLowerCase()}function $(e){switch(e){case`INVITATION_REQUIRED`:return`현재 계정과 일치하는 리뷰 초대를 찾을 수 없습니다.`;case`INVITATION_NOT_ACCEPTED`:return`아직 수락되지 않은 리뷰 초대입니다.`;case`INVITATION_REVOKED`:return`취소된 리뷰 초대입니다. 계속 검토하려면 담당자에게 다시 요청하세요.`;case`INVITATION_EXPIRED`:return`만료된 리뷰 초대입니다. 담당자에게 새 링크를 요청하세요.`;case`MEMBERSHIP_REQUIRED`:return`이 프로젝트의 reviewer membership이 없습니다.`;case`PAGE_NOT_FOUND`:return`이 페이지는 아직 리뷰 대상이 아닙니다. 담당자에게 문의하세요.`}}export{pe as createInstantReviewRuntime};
|