uploadthing
Version:
Learn more: [docs.uploadthing.com](https://docs.uploadthing.com)
120 lines (116 loc) • 3.93 kB
JavaScript
const require_chunk = require('./chunk-CUT6urMc.cjs');
const require_package = require('./package-CKF1Vr61.cjs');
const effect_Micro = require_chunk.__toESM(require("effect/Micro"));
const __uploadthing_shared = require_chunk.__toESM(require("@uploadthing/shared"));
const effect_Function = require_chunk.__toESM(require("effect/Function"));
//#region src/_internal/deferred.ts
const createDeferred = () => {
let resolve;
let reject;
const ac = new AbortController();
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return {
promise,
ac,
resolve,
reject
};
};
//#endregion
//#region src/_internal/random-hex.ts
const randomHexString = function() {
const characters = "abcdef0123456789";
const charactersLength = characters.length;
return function(length) {
let result = "";
for (let i = 0; i < length; i++) result += characters.charAt(Math.floor(Math.random() * charactersLength));
return result;
};
}();
const generateTraceHeaders = () => {
const traceId = randomHexString(32);
const spanId = randomHexString(16);
const sampled = "01";
return {
b3: `${traceId}-${spanId}-${sampled}`,
traceparent: `00-${traceId}-${spanId}-${sampled}`
};
};
//#endregion
//#region src/_internal/ut-reporter.ts
const createAPIRequestUrl = (config) => {
const url = new URL(config.url);
const queryParams = new URLSearchParams(url.search);
queryParams.set("actionType", config.actionType);
queryParams.set("slug", config.slug);
url.search = queryParams.toString();
return url;
};
/**
* Creates a "client" for reporting events to the UploadThing server via the user's API endpoint.
* Events are handled in "./handler.ts starting at L112"
*/
const createUTReporter = (cfg) => (type, payload) => effect_Micro.gen(function* () {
const url = createAPIRequestUrl({
url: cfg.url,
slug: cfg.endpoint,
actionType: type
});
const headers = new Headers(yield* effect_Micro.promise(async () => typeof cfg.headers === "function" ? await cfg.headers() : cfg.headers));
if (cfg.package) headers.set("x-uploadthing-package", cfg.package);
headers.set("x-uploadthing-version", require_package.version);
headers.set("Content-Type", "application/json");
headers.set("b3", cfg.traceHeaders.b3);
headers.set("traceparent", cfg.traceHeaders.traceparent);
const response = yield* (0, __uploadthing_shared.fetchEff)(url, {
method: "POST",
body: JSON.stringify(payload),
headers
}).pipe(
effect_Micro.andThen(__uploadthing_shared.parseResponseJson),
/**
* We don't _need_ to validate the response here, just cast it for now.
* As of now, @effect/schema includes quite a few bytes we cut out by this...
* We have "strong typing" on the backend that ensures the shape should match.
*/
effect_Micro.map(effect_Function.unsafeCoerce),
effect_Micro.catchTag("FetchError", (e) => effect_Micro.fail(new __uploadthing_shared.UploadThingError({
code: "INTERNAL_CLIENT_ERROR",
message: `Failed to report event "${type}" to UploadThing server`,
cause: e
}))),
effect_Micro.catchTag("BadRequestError", (e) => effect_Micro.fail(new __uploadthing_shared.UploadThingError({
code: (0, __uploadthing_shared.getErrorTypeFromStatusCode)(e.status),
message: e.getMessage(),
cause: e.json
}))),
effect_Micro.catchTag("InvalidJson", (e) => effect_Micro.fail(new __uploadthing_shared.UploadThingError({
code: "INTERNAL_CLIENT_ERROR",
message: "Failed to parse response from UploadThing server",
cause: e
})))
);
return response;
});
//#endregion
Object.defineProperty(exports, 'createDeferred', {
enumerable: true,
get: function () {
return createDeferred;
}
});
Object.defineProperty(exports, 'createUTReporter', {
enumerable: true,
get: function () {
return createUTReporter;
}
});
Object.defineProperty(exports, 'generateTraceHeaders', {
enumerable: true,
get: function () {
return generateTraceHeaders;
}
});