{"version":3,"file":"storage-clock.mjs","names":[],"sources":["../../src/internal/storage-clock.ts"],"sourcesContent":["import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/sql/SqlClient\";\n\nimport type { MappingInput } from \"./configuration\";\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { ProofClock } from \"./models/proof-model\";\nimport { compileSqlExpression } from \"./sql-expression\";\nimport type { SqlExpression } from \"./table-model\";\n\n/** Managed storage supports epoch milliseconds or canonical ISO text. */\nexport const makeStorageClock = Effect.fnUntraced(function* (storage: MappingInput) {\n  const sql = (yield* SqlClient.SqlClient).withoutTransforms();\n  const encoded = storage.encodeInstant(0);\n  const numeric = typeof encoded === \"number\";\n\n  if (!numeric && encoded !== \"1970-01-01T00:00:00.000Z\")\n    return yield* PersistenceMappingError.make({\n      operation: \"mapping\",\n      cause: \"Unsupported managed timestamp representation\",\n    });\n\n  const clock: ProofClock<SqlExpression> = {\n    encodeInstant: storage.encodeInstant,\n    decodeInstant: storage.decodeInstantSync,\n    engineNowMillis: sql.onDialectOrElse({\n      pg: () => sql`cast(extract(epoch from clock_timestamp()) * 1000 as bigint)`,\n      mysql: () => sql`cast(unix_timestamp(current_timestamp(3)) * 1000 as signed)`,\n      orElse: () => sql`cast(round((julianday('now') - 2440587.5) * 86400000) as integer)`,\n    }),\n    toMillis: (expression) => {\n      const value = compileSqlExpression(sql, expression);\n\n      return numeric\n        ? value\n        : sql.onDialectOrElse({\n            pg: () => sql`cast(extract(epoch from cast(${value} as timestamptz)) * 1000 as bigint)`,\n            mysql: () =>\n              sql`cast(unix_timestamp(str_to_date(${value}, '%Y-%m-%dT%H:%i:%s.%fZ')) * 1000 as signed)`,\n            orElse: () => sql`cast(round((julianday(${value}) - 2440587.5) * 86400000) as integer)`,\n          });\n    },\n    fromMillis: (expression) => {\n      const value = compileSqlExpression(sql, expression);\n\n      return numeric\n        ? value\n        : sql.onDialectOrElse({\n            pg: () =>\n              sql`to_char(to_timestamp((${value}) / 1000.0) at time zone 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`,\n            mysql: () =>\n              sql`concat(date_format(from_unixtime((${value}) / 1000.0), '%Y-%m-%dT%H:%i:%s.'), lpad(mod(${value}, 1000), 3, '0'), 'Z')`,\n            orElse: () => sql`strftime('%Y-%m-%dT%H:%M:%fZ', (${value}) / 1000.0, 'unixepoch')`,\n          });\n    },\n  };\n\n  return clock;\n});\n"],"mappings":";;;;;;AAUA,MAAa,mBAAmB,OAAO,WAAW,WAAW,SAAuB;CAClF,MAAM,OAAO,OAAO,UAAU,UAAA,CAAW,kBAAkB;CAC3D,MAAM,UAAU,QAAQ,cAAc,CAAC;CACvC,MAAM,UAAU,OAAO,YAAY;CAEnC,IAAI,CAAC,WAAW,YAAY,4BAC1B,OAAO,OAAO,wBAAwB,KAAK;EACzC,WAAW;EACX,OAAO;CACT,CAAC;CAqCH,OAAO;EAlCL,eAAe,QAAQ;EACvB,eAAe,QAAQ;EACvB,iBAAiB,IAAI,gBAAgB;GACnC,UAAU,GAAG;GACb,aAAa,GAAG;GAChB,cAAc,GAAG;EACnB,CAAC;EACD,WAAW,eAAe;GACxB,MAAM,QAAQ,qBAAqB,KAAK,UAAU;GAElD,OAAO,UACH,QACA,IAAI,gBAAgB;IAClB,UAAU,GAAG,gCAAgC,MAAM;IACnD,aACE,GAAG,mCAAmC,MAAM;IAC9C,cAAc,GAAG,yBAAyB,MAAM;GAClD,CAAC;EACP;EACA,aAAa,eAAe;GAC1B,MAAM,QAAQ,qBAAqB,KAAK,UAAU;GAElD,OAAO,UACH,QACA,IAAI,gBAAgB;IAClB,UACE,GAAG,yBAAyB,MAAM;IACpC,aACE,GAAG,qCAAqC,MAAM,+CAA+C,MAAM;IACrG,cAAc,GAAG,mCAAmC,MAAM;GAC5D,CAAC;EACP;CAGS;AACb,CAAC"}