UNPKG

@flatfile/safe-api

Version:

Flatfile Safe API client with streaming capabilities

172 lines (171 loc) 6.22 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GetRecordsRequest = exports.RawRecordsUpsert = exports.StreamRecordsUpdate = exports.RawRecordsRequest = exports.SimpleStreamRecordsRequest = exports.StreamRecordsRequest = exports.GetRecordCountsRequest = exports.CreateRecordsRequest = void 0; const jsonlines_1 = __importDefault(require("jsonlines")); const get_request_1 = require("../utils/requests/get.request"); const post_request_1 = require("../utils/requests/post.request"); const records_1 = require("@flatfile/records"); class CreateRecordsRequest extends post_request_1.PostRequest { constructor(sheetId, records, options) { super([sheetId], records, options); this.retry = true; this.path = "/v1/sheets/:sheetId/records"; } } exports.CreateRecordsRequest = CreateRecordsRequest; class GetRecordCountsRequest extends get_request_1.GetRequest { constructor(sheetId, opts, options) { super([sheetId], opts, options); this.path = "/v1/sheets/:sheetId/counts"; } async parseBody(body) { if (!body) { throw new Error('No response body received'); } return body; } } exports.GetRecordCountsRequest = GetRecordCountsRequest; /** * Request class for getting full record data with metadata and configuration */ class StreamRecordsRequest extends get_request_1.GetRequest { constructor(opts = {}, options) { super([], { ...opts, stream: true }, options); this.path = "/v2-alpha/records.jsonl"; this.isRaw = true; this._headers = { Accept: "application/jsonl" }; } async parseBody(body) { const lines = await parseJsonLines(body); return lines.map((r) => new records_1.FlatfileRecord(r)); } } exports.StreamRecordsRequest = StreamRecordsRequest; /** * Request class for getting simplified record data without internal metadata */ class SimpleStreamRecordsRequest extends get_request_1.GetRequest { constructor(opts = {}, options) { super([], { ...opts, stream: true }, options); this.path = "/v2-alpha/records.jsonl"; this.isRaw = true; this._headers = { Accept: "application/jsonl" }; } async parseBody(body) { if (typeof body === 'string') { const lines = await parseJsonLines(body); return lines.map((r) => Object.fromEntries(Object.entries(r) .map(([k, v]) => [k === "__k" ? "id" : k === "__m" ? "metadata" : k, v]) .filter(([k]) => !k.startsWith("__")))); } return []; } } exports.SimpleStreamRecordsRequest = SimpleStreamRecordsRequest; /** * Request class for getting raw JSONL record data */ class RawRecordsRequest extends get_request_1.GetRequest { constructor(opts = {}, options) { super([], { ...opts, stream: true }, options); this.path = "/v2-alpha/records.jsonl"; this.isRaw = true; this._headers = { Accept: "application/jsonl" }; this.query = { ...opts, stream: true }; } async parseBody(body) { if (!body) { return []; } return parseJsonLines(body.toString()); } } exports.RawRecordsRequest = RawRecordsRequest; /** * Request class for updating records using JSONL format */ class StreamRecordsUpdate extends post_request_1.PostRequest { constructor(opts, payload, options) { super([], payload, options); this.opts = opts; this.path = "/v2-alpha/records.jsonl"; this.isRaw = true; this._headers = { "Content-Type": "application/jsonl" }; this.query = { ...opts, stream: true }; } afterSuccess() { const payload = this.payload; payload.changes().each((r) => r.commit()); } async parseBody(_body) { return { success: true }; } serializeBody(records) { if (this.opts.truncate) { return (records .onlyPresent() .map((r) => JSON.stringify(r.toJSON())) .join("\n") + "\n"); } else { const updates = records // removes any temporary records that have been deleted .filter((r) => { var _a; return !(((_a = r.id) === null || _a === void 0 ? void 0 : _a.startsWith("TEMP_")) && r.isDeleted()); }) .changes() .map((r) => JSON.stringify(r.changeset())); if (!updates.count()) { throw new Error("No changes made to this collection that would need to be written."); } else { return updates.join("\n") + "\n"; } } } } exports.StreamRecordsUpdate = StreamRecordsUpdate; class RawRecordsUpsert extends post_request_1.PostRequest { constructor(opts, payload, options) { super([], payload, options); this.opts = opts; this.path = "/v2-alpha/records.jsonl"; this.isRaw = true; this._headers = { "Content-Type": "application/jsonl", "Content-Encoding": "gzip" }; this.query = { ...opts, stream: true }; } async parseBody(_body) { return { success: true }; } serializeBody(records) { return records.map((r) => JSON.stringify(r)).join("\n") + "\n"; } } exports.RawRecordsUpsert = RawRecordsUpsert; class GetRecordsRequest extends get_request_1.GetRequest { constructor(sheetId, query, options) { super([sheetId], query, options); this.path = "/v1/sheets/:sheetId/records"; } } exports.GetRecordsRequest = GetRecordsRequest; function parseJsonLines(body) { return new Promise((resolve, reject) => { const parser = jsonlines_1.default.parse(); const out = []; parser.on("data", (data) => { out.push(data); }); parser.on("end", () => { resolve(out); }); parser.on("error", (err) => { console.error(err); reject(err); }); parser.write(body); parser.end(); }); }