From 542cda38b7bd15326da8f3aa08e039b76d338938 Mon Sep 17 00:00:00 2001 From: ProgrammerIn-wonderland <3838shah@gmail.com> Date: Tue, 26 Aug 2025 18:17:03 -0400 Subject: [PATCH] create getReadUrl --- src/puter-js/src/modules/FileSystem/index.js | 4 +- .../FileSystem/operations/getReadUrl.js | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/puter-js/src/modules/FileSystem/operations/getReadUrl.js diff --git a/src/puter-js/src/modules/FileSystem/index.js b/src/puter-js/src/modules/FileSystem/index.js index 113bb3462..1360f3f08 100644 --- a/src/puter-js/src/modules/FileSystem/index.js +++ b/src/puter-js/src/modules/FileSystem/index.js @@ -16,6 +16,7 @@ import symlink from './operations/symlink.js'; import deleteFSEntry from "./operations/deleteFSEntry.js"; import { AdvancedBase } from '../../../../putility/index.js'; import FSItem from '../FSItem.js'; +import getReadUrl from './operations/getReadUrl.js'; export class PuterJSFileSystemModule extends AdvancedBase { @@ -32,7 +33,8 @@ export class PuterJSFileSystemModule extends AdvancedBase { write = write; sign = sign; symlink = symlink; - + getReadUrl = getReadUrl; + FSItem = FSItem static NARI_METHODS = { diff --git a/src/puter-js/src/modules/FileSystem/operations/getReadUrl.js b/src/puter-js/src/modules/FileSystem/operations/getReadUrl.js new file mode 100644 index 000000000..d827d0a31 --- /dev/null +++ b/src/puter-js/src/modules/FileSystem/operations/getReadUrl.js @@ -0,0 +1,42 @@ +import * as utils from '../../../lib/utils.js'; +import stat from "./stat.js"; + +const getReadUrl = async function (path, expiresIn = "24h") { + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if (!puter.authToken && puter.env === 'web') { + try { + await puter.ui.authenticateWithPuter(); + } catch (e) { + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + try { + const { uid, is_dir } = (await stat.call(this, path)) + if (is_dir) { + reject("Cannot create readUrl for directory"); + return; + } + + const xhr = utils.initXhr('/auth/create-access-token', this.APIOrigin, this.authToken); + + utils.setupXhrEventHandlers(xhr, () => {}, () => {}, ({token})=> { + resolve(`${this.APIOrigin}/token-read?uid=${encodeURIComponent(uid)}&token=${encodeURIComponent(token)}`) + }, reject); + + xhr.send(JSON.stringify({ + expiresIn, + permissions: [ + `fs:${uid}:read`, + ] + })) + + } catch (e) { + reject(e) + } + }); +} + +export default getReadUrl;