@mastra/spanner 1.10.1 → 1.11.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/dist/index.js CHANGED
@@ -1907,10 +1907,13 @@ function rowToTask(row) {
1907
1907
  suspendedAt: transformed.suspendedAt ? transformed.suspendedAt instanceof Date ? transformed.suspendedAt : new Date(transformed.suspendedAt) : void 0,
1908
1908
  completedAt: transformed.completedAt ? transformed.completedAt instanceof Date ? transformed.completedAt : new Date(transformed.completedAt) : void 0,
1909
1909
  ownerId: transformed.ownerId != null ? String(transformed.ownerId) : void 0,
1910
- leaseExpiresAt: transformed.leaseExpiresAt ? transformed.leaseExpiresAt instanceof Date ? transformed.leaseExpiresAt : new Date(transformed.leaseExpiresAt) : void 0
1910
+ leaseExpiresAt: transformed.leaseExpiresAt ? transformed.leaseExpiresAt instanceof Date ? transformed.leaseExpiresAt : new Date(transformed.leaseExpiresAt) : void 0,
1911
+ expiresAt: transformed.expiresAt ? transformed.expiresAt instanceof Date ? transformed.expiresAt : new Date(transformed.expiresAt) : void 0,
1912
+ metadata: parseJson(transformed.metadata) ?? void 0
1911
1913
  };
1912
1914
  }
1913
1915
  var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTasksStorage {
1916
+ supportsTaskExpiry = true;
1914
1917
  database;
1915
1918
  db;
1916
1919
  skipDefaultIndexes;
@@ -1940,7 +1943,9 @@ var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTask
1940
1943
  "suspend_payload",
1941
1944
  "suspendedAt",
1942
1945
  "ownerId",
1943
- "leaseExpiresAt"
1946
+ "leaseExpiresAt",
1947
+ "expiresAt",
1948
+ "metadata"
1944
1949
  ]
1945
1950
  });
1946
1951
  await this.createDefaultIndexes();
@@ -2023,7 +2028,9 @@ var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTask
2023
2028
  suspendedAt: task.suspendedAt ?? null,
2024
2029
  completedAt: task.completedAt ?? null,
2025
2030
  ownerId: task.ownerId ?? null,
2026
- leaseExpiresAt: task.leaseExpiresAt ?? null
2031
+ leaseExpiresAt: task.leaseExpiresAt ?? null,
2032
+ expiresAt: task.expiresAt ?? null,
2033
+ metadata: task.metadata ?? null
2027
2034
  }
2028
2035
  });
2029
2036
  }
@@ -2039,12 +2046,18 @@ var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTask
2039
2046
  if ("completedAt" in update) data.completedAt = update.completedAt ?? null;
2040
2047
  if ("ownerId" in update) data.ownerId = update.ownerId ?? null;
2041
2048
  if ("leaseExpiresAt" in update) data.leaseExpiresAt = update.leaseExpiresAt ?? null;
2049
+ if ("expiresAt" in update) data.expiresAt = update.expiresAt ?? null;
2050
+ if ("metadata" in update) data.metadata = update.metadata ?? null;
2042
2051
  if (Object.keys(data).length === 0) return false;
2043
2052
  const setClauses = Object.keys(data).map((field) => `${quoteIdent(field, "column name")} = @${field}`);
2044
- const params = {
2045
- ...data,
2046
- id: taskId
2047
- };
2053
+ const params = { id: taskId };
2054
+ const types = {};
2055
+ for (const [field, value] of Object.entries(data)) {
2056
+ const prepared = this.db.prepareValue(value, field, TABLE_BACKGROUND_TASKS);
2057
+ params[field] = prepared;
2058
+ const colType = getColumnDef(TABLE_BACKGROUND_TASKS, field)?.type;
2059
+ if (prepared === null || colType === "jsonb" || colType === "timestamp") types[field] = getSpannerParamType(colType);
2060
+ }
2048
2061
  const predicates = [];
2049
2062
  if (options?.expectedStatus) {
2050
2063
  predicates.push("status = @expectedStatus");
@@ -2061,15 +2074,24 @@ var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTask
2061
2074
  if (options.expectedLeaseExpiresAt === null) predicates.push("leaseExpiresAt IS NULL");
2062
2075
  else {
2063
2076
  predicates.push("leaseExpiresAt = @expectedLeaseExpiresAt");
2064
- params.expectedLeaseExpiresAt = options.expectedLeaseExpiresAt;
2077
+ params.expectedLeaseExpiresAt = this.db.prepareValue(options.expectedLeaseExpiresAt, "leaseExpiresAt", TABLE_BACKGROUND_TASKS);
2078
+ types.expectedLeaseExpiresAt = getSpannerParamType("timestamp");
2079
+ }
2080
+ }
2081
+ if (options?.expectedSuspendedAt !== void 0) {
2082
+ if (options.expectedSuspendedAt === null) predicates.push("suspendedAt IS NULL");
2083
+ else {
2084
+ predicates.push("suspendedAt = @expectedSuspendedAt");
2085
+ params.expectedSuspendedAt = this.db.prepareValue(options.expectedSuspendedAt, "suspendedAt", TABLE_BACKGROUND_TASKS);
2086
+ types.expectedSuspendedAt = getSpannerParamType("timestamp");
2065
2087
  }
2066
2088
  }
2067
2089
  const predicateSql = predicates.length > 0 ? ` AND ${predicates.join(" AND ")}` : "";
2068
- const [rowCount] = await this.database.runUpdate({
2090
+ return await this.db.runDml({
2069
2091
  sql: `UPDATE ${this.tableName()} SET ${setClauses.join(", ")} WHERE id = @id${predicateSql}`,
2070
- params
2071
- });
2072
- return rowCount > 0;
2092
+ params,
2093
+ types
2094
+ }) > 0;
2073
2095
  }
2074
2096
  async getTask(taskId) {
2075
2097
  const [rows] = await this.database.run({
@@ -2139,7 +2161,8 @@ var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTask
2139
2161
  params[name] = filter.toolCallId;
2140
2162
  conditions.push(`${quoteIdent("tool_call_id", "column name")} = @${name}`);
2141
2163
  }
2142
- const dateCol = filter.dateFilterBy === "startedAt" ? quoteIdent("startedAt", "column name") : filter.dateFilterBy === "suspendedAt" ? quoteIdent("suspendedAt", "column name") : filter.dateFilterBy === "completedAt" ? quoteIdent("completedAt", "column name") : quoteIdent("createdAt", "column name");
2164
+ const dateCol = filter.dateFilterBy === "startedAt" ? quoteIdent("startedAt", "column name") : filter.dateFilterBy === "suspendedAt" ? quoteIdent("suspendedAt", "column name") : filter.dateFilterBy === "completedAt" ? quoteIdent("completedAt", "column name") : filter.dateFilterBy === "expiresAt" ? quoteIdent("expiresAt", "column name") : quoteIdent("createdAt", "column name");
2165
+ if (filter.hasExpiresAt !== void 0) conditions.push(`${quoteIdent("expiresAt", "column name")} IS ${filter.hasExpiresAt ? "NOT NULL" : "NULL"}`);
2143
2166
  if (filter.fromDate) {
2144
2167
  const name = `p${idx++}`;
2145
2168
  params[name] = filter.fromDate.toISOString();
@@ -2204,7 +2227,8 @@ var BackgroundTasksSpanner = class BackgroundTasksSpanner extends BackgroundTask
2204
2227
  conditions.push(statusCondition.sql);
2205
2228
  idx = statusCondition.nextIdx;
2206
2229
  }
2207
- const dateCol = filter.dateFilterBy === "startedAt" ? quoteIdent("startedAt", "column name") : filter.dateFilterBy === "completedAt" ? quoteIdent("completedAt", "column name") : quoteIdent("createdAt", "column name");
2230
+ const dateCol = filter.dateFilterBy === "startedAt" ? quoteIdent("startedAt", "column name") : filter.dateFilterBy === "suspendedAt" ? quoteIdent("suspendedAt", "column name") : filter.dateFilterBy === "completedAt" ? quoteIdent("completedAt", "column name") : filter.dateFilterBy === "expiresAt" ? quoteIdent("expiresAt", "column name") : quoteIdent("createdAt", "column name");
2231
+ if (filter.hasExpiresAt !== void 0) conditions.push(`${quoteIdent("expiresAt", "column name")} IS ${filter.hasExpiresAt ? "NOT NULL" : "NULL"}`);
2208
2232
  if (filter.fromDate) {
2209
2233
  const name = `p${idx++}`;
2210
2234
  params[name] = filter.fromDate.toISOString();