@microsoft/teams.apps
Version:
<p> <a href="https://www.npmjs.com/package/@microsoft/teams.apps" target="_blank"> <img src="https://img.shields.io/npm/v/@microsoft/teams.apps/latest" /> </a> <a href="https://www.npmjs.com/package/@microsoft/teams.apps?activeTab=code
47 lines • 4.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectFilesCredential = selectFilesCredential;
exports.selectInlineImageCredential = selectInlineImageCredential;
/**
* Choose which identity reads a file's bytes, for the current inbound activity.
*
* An Agentic User reads as itself, never the app token: an app-only token sees what the app may read tenant-wide, a different set from what was shared with the agent, so it would 403 on exactly the files the agent was given.
*
* The token is resolved lazily, so a turn that never touches files never acquires one.
*/
function selectFilesCredential(options) {
const { agenticIdentity, tenantId, graphBaseUrlRoot, getAppGraphToken, getAgenticGraphToken } = options;
// Only the actor and how its token is fetched vary. Building the rest here means a new actor is one arm rather than a third copy of the whole credential, and cannot silently omit the host root.
const as = (actor, token) => ({
actor,
token,
baseUrlRoot: graphBaseUrlRoot,
});
if (agenticIdentity) {
// The activity's tenant is passed alongside the identity: `AgenticIdentity.tenantId` is optional, and without this the acquisition would fall back to the app's *configured* tenant, which for a multi-tenant app is not necessarily the tenant this activity arrived from.
return as('agenticUser', async () => (await getAgenticGraphToken(agenticIdentity, tenantId))?.toString());
}
// `tenantId` is passed through unresolved: `getAppGraphToken` resolves activity tenant, then the bot's configured
// tenant, then `common`. Defaulting here short-circuits that chain and gives a single-tenant bot a `common` token
// on this path only.
return as('app', async () => (await getAppGraphToken(tenantId))?.toString());
}
/**
* Build the credential that reads inline images for the current activity, using the turn's Bot API token.
*
* The token is resolved lazily, so a turn that never downloads an inline image never acquires one.
*/
function selectInlineImageCredential(options) {
const { agenticIdentity, serviceUrl, getToken } = options;
return {
actor: agenticIdentity ? 'agenticUser' : 'app',
serviceUrl,
token: async () => {
const source = getToken();
const resolved = typeof source === 'function' ? await source({}) : source;
const value = resolved?.toString().trim();
return value ? value : undefined;
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtY3JlZGVudGlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlcy1jcmVkZW50aWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsc0RBMEJDO0FBT0Qsa0VBbUJDO0FBM0REOzs7Ozs7R0FNRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLE9BT3JDO0lBQ0MsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFeEcsa01BQWtNO0lBQ2xNLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBZ0IsRUFBRSxLQUF3QyxFQUFtQixFQUFFLENBQUMsQ0FBQztRQUMzRixLQUFLO1FBQ0wsS0FBSztRQUNMLFdBQVcsRUFBRSxnQkFBZ0I7S0FDOUIsQ0FBQyxDQUFDO0lBRUgsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQiw0UUFBNFE7UUFDNVEsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELGtIQUFrSDtJQUNsSCxrSEFBa0g7SUFDbEgscUJBQXFCO0lBQ3JCLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQiwyQkFBMkIsQ0FBQyxPQU0zQztJQUNDLE1BQU0sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUUxRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLO1FBQzlDLFVBQVU7UUFDVixLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDMUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzFFLE1BQU0sS0FBSyxHQUFHLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbkMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIn0=