Note: These breaking changes are only relevant to the server packages and images released from
./routerlicious.
import Redis from "ioredis";
import socketIo from "socket.io";
import { SocketIORedisConnection } from '@fluidframework/server-services'
const options: Redis.RedisOptions = {
host: "host",
port: "6379",
};
const pub = new Redis(options);
const sub = new Redis(options);
const pubConn = new SocketIORedisConnection(pub);
const subConn = new SocketIORedisConnection(sub);
const server = new SocketIoServer(new SocketIo(), pub, sub);services.RedisCache, services.ClientManager, services.RedisThrottleManager, and services.SocketIoRedisPublisher using ioredis
import Redis from "ioredis";
import * as services from "@fluidframework/server-services";
const options: Redis.RedisOptions = {
host: "host",
port: "6379",
};
const redisClient = new Redis(options);
const redisCache = new services.RedisCache(redisClient);
const clientManager = new services.ClientManager(redisClient);
const redisClientForThrottling = new services.RedisThrottleStorageManager(redisClient);
const publisher = new services.SocketIoRedisPublisher(options);Token expiration logic has been moved from validateTokenClaims to validateTokenClaimsExpiration. To maintain functionality, use the two in succession. For example,
import {
validateTokenClaims,
validateTokenClaimsExpiration,
} from "@fluidframework/server-services-client";
const claims = validateTokenClaims(token, tenantId, documentId);
if (isTokenExpiryEnabled) {
validateTokenClaimsExpiration(claims, maxTokenLifetimeSec)
}validateTokenClaims previously returned undefined if claims were invalid. Now, instead, it will throw a NetworkError that contains a status code (i.e. 401 or 403).
Token expiration logic has been moved from validateTokenClaims to @fluidframework/server-services-client's validateTokenClaimsExpiration. To maintain functionality, use the two in succession. For example,
import { validateTokenClaims } from "@fluidframework/server-services-utils";
import { validateTokenClaimsExpiration } from "@fluidframework/server-services-client";
const claims = validateTokenClaims(token, tenantId, documentId);
if (isTokenExpiryEnabled) {
validateTokenClaimsExpiration(claims, maxTokenLifetimeSec)
}validateTokenClaims previously returned undefined if claims were invalid. Now, instead, it will throw a NetworkError that contains a status code (i.e. 401 or 403).
RestWrapper is now an abstract class that cannot be instantiated. Use BasicRestWrapper instead to maintain current functionality.
The Historian client class no longer builds its own request headers, and therefore does not have constructor parameters getCredentials and getCorrelationId. Instead, it relies on the consumer to pass in a RestWrapper with the desired default headers. To easily generate the necessary token format for communicating with the Historian service, use the new getAuthorizationTokenFromCredentials() function. For example,
import {
BasicRestWrapper,
Historian,
getAuthorizationTokenFromCredentials,
ICredentials
} from "@fluidframework/server-services-client";
const credentials: ICredentials = { user: "user", password: "password" };
const token = getAuthorizationTokenFromCredentials(credentials);
const restWrapper = new BasicRestWrapper(baseUrl, {}, undefined, { Authorization: token })
const Historian = new Historian(baseUrl, true, false, restWrapper);All the Alfred deltas/ and documents/ endpoints will now expect a valid JWT token as part of the authorization header. The token claims will be validated by Alfred and the token will be validated via Riddler api. The corresponding routerlicious driver changes are available with package @fluidframework/routerlicious-driver version >= 0.34.1.
Breaking changes in server packages and images were not tracked before 0.1020.