{"version":3,"file":"session-native-pending-read.mjs","names":[],"sources":["../../src/internal/session-native-pending-read.ts"],"sourcesContent":["import type { SubjectId, TokenDigest } from \"@yielded/auth/Schema\";\nimport type { PendingAuthenticationKind } from \"@yielded/auth/Sessions\";\nimport * as Cause from \"effect/Cause\";\nimport * as Effect from \"effect/Effect\";\n\nimport type { NativeSqlTables } from \"./native-sql-table\";\nimport { makeNativeSessionPending } from \"./session-native-pending\";\nimport {\n  makeNativeSessionAuthorityState,\n  invalidSessionState,\n  sessionUnavailable,\n  type NativeSessionAuthorityMapping,\n} from \"./session-native-state\";\nimport { exactSqlText } from \"./sql-change\";\nimport { canJoinTextColumns } from \"./storage-validation\";\n\n/** Both ports re-read the pending row with current authority in one snapshot.\n * Discovery only selects the independently bound owner for incompatible IDs. */\nexport const makeNativeSessionPendingReader = Effect.fnUntraced(function* (\n  tables: NativeSqlTables,\n  mapping: NativeSessionAuthorityMapping & Parameters<typeof makeNativeSessionPending>[1],\n  batch = false,\n) {\n  const state = yield* makeNativeSessionAuthorityState(tables, mapping, batch);\n  const pending = yield* makeNativeSessionPending(tables, mapping, batch);\n\n  const joinedIds = yield* canJoinTextColumns([\n    pending.table.unencodedTextColumn?.(pending.p.subjectId),\n    state.subject.unencodedTextColumn?.(mapping.subject.id),\n    state.credential.unencodedTextColumn?.(mapping.credential.subjectId),\n  ]).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, sessionUnavailable))));\n\n  const read = Effect.fnUntraced(function* (kind: PendingAuthenticationKind, digest: TokenDigest) {\n    const { sql, now } = state,\n      { p, table } = pending;\n\n    let discoveredSubjectId: SubjectId | undefined;\n    let nativeId: unknown;\n\n    if (!joinedIds) {\n      const selected = yield* pending.read(kind, digest);\n\n      if (selected === undefined) return undefined;\n      discoveredSubjectId = selected.record.subjectId;\n      nativeId = yield* mapping.subjectId.toNative(discoveredSubjectId);\n    }\n\n    const pt = table.as(\"authentication_pending\"),\n      st = state.joinedSubject,\n      ct = state.joinedCredential,\n      s = mapping.subject,\n      c = mapping.credential;\n\n    const bindOwner = (table: typeof pt, key: string) =>\n      joinedIds\n        ? exactSqlText(sql, table.column(key), pt.column(p.subjectId))\n        : state.id(table, key, nativeId);\n\n    const rows =\n      yield* sql`select ${pt.fields(\"p_\")}, ${st.fields(\"s_\")}, ${ct.fields(\"c_\")}, ${now} as engine_now from ${pt.name} join ${st.name} on ${bindOwner(st, s.id)} and ${state.activeSubject(st)} left join ${ct.name} on ${bindOwner(ct, c.subjectId)} and ${state.activeCredential(ct)} where ${pending.predicate(pt, kind, digest)}${joinedIds ? sql`` : sql` and ${bindOwner(pt, p.subjectId)}`} limit 65`;\n\n    if (rows[0] === undefined) return undefined;\n    const record = yield* pending.decode(kind, pt.decode(rows[0], \"p_\"));\n\n    if (!(joinedIds || record.subjectId === discoveredSubjectId))\n      return yield* invalidSessionState();\n    const owner = yield* mapping.subjectId.toNative(record.subjectId);\n\n    const authority = yield* state.decode(\n      record.subjectId,\n      owner,\n      rows[0],\n      rows.map((row) => ct.decode(row, \"c_\")),\n      rows[0].engine_now,\n    );\n\n    return authority === undefined || authority.now >= record.expiresAtMillis\n      ? undefined\n      : { record, authority };\n  });\n\n  return { state, pending, read };\n});\n"],"mappings":";;;;;;;;;AAkBA,MAAa,iCAAiC,OAAO,WAAW,WAC9D,QACA,SACA,QAAQ,OACR;CACA,MAAM,QAAQ,OAAO,gCAAgC,QAAQ,SAAS,KAAK;CAC3E,MAAM,UAAU,OAAO,yBAAyB,QAAQ,SAAS,KAAK;CAEtE,MAAM,YAAY,OAAO,mBAAmB;EAC1C,QAAQ,MAAM,sBAAsB,QAAQ,EAAE,SAAS;EACvD,MAAM,QAAQ,sBAAsB,QAAQ,QAAQ,EAAE;EACtD,MAAM,WAAW,sBAAsB,QAAQ,WAAW,SAAS;CACrE,CAAC,CAAC,CAAC,KAAK,OAAO,YAAY,UAAU,OAAO,UAAU,MAAM,IAAI,OAAO,kBAAkB,CAAC,CAAC,CAAC;CAmD5F,OAAO;EAAE;EAAO;EAAS,MAjDZ,OAAO,WAAW,WAAW,MAAiC,QAAqB;GAC9F,MAAM,EAAE,KAAK,QAAQ,OACnB,EAAE,GAAG,UAAU;GAEjB,IAAI;GACJ,IAAI;GAEJ,IAAI,CAAC,WAAW;IACd,MAAM,WAAW,OAAO,QAAQ,KAAK,MAAM,MAAM;IAEjD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;IACnC,sBAAsB,SAAS,OAAO;IACtC,WAAW,OAAO,QAAQ,UAAU,SAAS,mBAAmB;GAClE;GAEA,MAAM,KAAK,MAAM,GAAG,wBAAwB,GAC1C,KAAK,MAAM,eACX,KAAK,MAAM,kBACX,IAAI,QAAQ,SACZ,IAAI,QAAQ;GAEd,MAAM,aAAa,OAAkB,QACnC,YACI,aAAa,KAAK,MAAM,OAAO,GAAG,GAAG,GAAG,OAAO,EAAE,SAAS,CAAC,IAC3D,MAAM,GAAG,OAAO,KAAK,QAAQ;GAEnC,MAAM,OACJ,OAAO,GAAG,UAAU,GAAG,OAAO,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,IAAI,sBAAsB,GAAG,KAAK,QAAQ,GAAG,KAAK,MAAM,UAAU,IAAI,EAAE,EAAE,EAAE,OAAO,MAAM,cAAc,EAAE,EAAE,aAAa,GAAG,KAAK,MAAM,UAAU,IAAI,EAAE,SAAS,EAAE,OAAO,MAAM,iBAAiB,EAAE,EAAE,SAAS,QAAQ,UAAU,IAAI,MAAM,MAAM,IAAI,YAAY,GAAG,KAAK,GAAG,QAAQ,UAAU,IAAI,EAAE,SAAS,IAAI;GAEhY,IAAI,KAAK,OAAO,KAAA,GAAW,OAAO,KAAA;GAClC,MAAM,SAAS,OAAO,QAAQ,OAAO,MAAM,GAAG,OAAO,KAAK,IAAI,IAAI,CAAC;GAEnE,IAAI,EAAE,aAAa,OAAO,cAAc,sBACtC,OAAO,OAAO,oBAAoB;GACpC,MAAM,QAAQ,OAAO,QAAQ,UAAU,SAAS,OAAO,SAAS;GAEhE,MAAM,YAAY,OAAO,MAAM,OAC7B,OAAO,WACP,OACA,KAAK,IACL,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC,GACtC,KAAK,EAAE,CAAC,UACV;GAEA,OAAO,cAAc,KAAA,KAAa,UAAU,OAAO,OAAO,kBACtD,KAAA,IACA;IAAE;IAAQ;GAAU;EAC1B,CAE4B;CAAE;AAChC,CAAC"}